Los siguientes archivos de árbol de trabajo no rastreados se sobrescribirán mediante fusión, pero no me importa

343

En mi sucursal tenía algunos archivos en .gitignore

En una rama diferente, esos archivos no lo están.

Quiero fusionar las diferentes ramas en la mía, y no me importa si esos archivos ya no se ignoran o no.

Lamentablemente me sale esto:

Los siguientes archivos de árbol de trabajo no rastreados se sobrescribirán mediante fusión

¿Cómo modificaría mi comando de extracción para sobrescribir esos archivos, sin tener que buscar, mover o eliminar esos archivos yo mismo?

CQM
fuente
1
Posible duplicado de Los siguientes archivos de árbol de trabajo no
rastreados
1
Esta es la mejor respuesta, ya que solo eliminará los archivos que le impiden fusionarse: stackoverflow.com/a/52255219/551045
RedX

Respuestas:

537

El problema es que no está rastreando los archivos localmente, pero los archivos idénticos se rastrean de forma remota, por lo que para "extraer" su sistema se vería obligado a sobrescribir los archivos locales que no están controlados por la versión.

Intenta correr

git add * 
git stash
git pull

Esto rastreará todos los archivos, eliminará todos sus cambios locales a esos archivos y luego obtendrá los archivos del servidor.

userFog
fuente
59
git add -A .; git stashtrabajó para mi. La git add *variante se quejó de caminos ignorados.
imsky
11
Intenté git add., Git stash, git pull. Funcionó, pero todavía no entiendo por qué.
ARCA
1
Para mí, tenía un archivo remoto que fue rastreado y tenía un archivo del mismo nombre en mi repositorio local que no fue rastreado. Entonces, si agrega el archivo local, guarde los cambios y luego tire, el archivo remoto debe sobrescribir el archivo local.
userFog
2
Aquí hay un buen enlace para entender cómo funciona esto, si alguien está interesado. git-scm.com/book/en/v1/Git-Tools-Stashing
James M. Lay
2
//, esto realmente no va demasiado lejos en el propósito de este error, realmente.
Nathan Basanese
137

Puede probar el comando para borrar los archivos no rastreados del local

Git 2.11 y versiones más nuevas:

git clean  -d  -f .

Versiones anteriores de Git:

git clean  -d  -f ""

Donde -dse puede reemplazar con lo siguiente:

  • -x los archivos ignorados también se eliminan, así como los archivos desconocidos para Git.

  • -d eliminar directorios no rastreados además de archivos no rastreados.

  • -f se requiere para forzarlo a correr.

Aquí está el enlace que también puede ser útil.

sKhan
fuente
23
Yo agregaría -ipara el modo interactivo. Además de eliminar el directorio no deseado, también
eliminé
66
Vale la pena examinar los comentarios para obtener una respuesta similar, ya que -xpuede doler.
dumbledad
10
¡Pero esto es una tarea muy peligrosa y no imposible de hacer! ¡podría perder muchos archivos! ¡¡TEN CUIDADO!!
Mohamed Kawsara
16
Esto eliminó todo mi directorio de proveedores en Slim Framework . TENGA MUCHO CUIDADO CON ESTE MANDO
RousseauAlexandre
2
Debe eliminar la 'x' de su respuesta. ¡Es muy peligroso!
earl3s
106

Los únicos comandos que funcionaron para mí fueron:

git fetch --all
git reset --hard origin/{{your branch name}}
Asaf Manassen
fuente
55
Cabe señalar que esta respuesta es necesaria si ha eliminado los submódulos y los ha leído como bibliotecas en el repositorio original. Necesitaba una respuesta y esto fue todo lo que funcionó.
Routhinator
No tenía submódulos e intenté git clean y git stash como se sugiere en las otras respuestas, pero solo esto ayudó.
kslstn
Después de eliminar una variedad de submódulos, esto fue lo único que también funcionó para mí. De especial interés, también tuve un problema de mayúsculas y minúsculas en un archivo. Ex. XML.php a Xml.php en mi carpeta de proveedor del compositor.
KazaJhodo
1
A mí también me funcionó. ¿Puede explicar qué está pasando? No lo entiendo
Dimitris Karamanis
1
Esto eliminó dos de mis confirmaciones locales, ¡tenga cuidado antes de usar esto!
David Cian
27

Un reemplazo para git mergeeso sobrescribirá los archivos no rastreados

Los comentarios a continuación usan 'FOI' para los 'archivos de interés', los archivos que

  • existir en la rama donante,
  • no existen en la rama receptora,
  • y están bloqueando la fusión porque están presentes y sin seguimiento en su directorio de trabajo.
git checkout -f donor-branch   # replace FOI with tracked `donor` versions
git checkout receiving-branch  # FOI are not in `receiving`, so they disapppear
git merge donor-branch  # now the merge works

Un reemplazo para git pulleso sobrescribirá los archivos no rastreados

pull = fetch + merge, así que git fetchseguimos con el git checkout -f, git checkout, git mergetruco anterior.

git fetch origin  # fetch remote commits
git checkout -f origin/mybranch  # replace FOI with tracked upstream versions
git checkout mybranch  # FOI are not in mybranch, so they disapppear
git merge origin/mybranch  # Now the merge works. fetch + merge completes the pull.

Explicación detallada

git merge -f no existe, pero git checkout -f existe.

Usaremos git checkout -f+git checkout para eliminar los archivos de interés (ver arriba), y luego su fusión puede continuar normalmente.

Paso 1. Este paso reemplaza por la fuerza el FOI no rastreado con versiones rastreadas de la rama donante (también verifica la rama donante y actualiza el resto del directorio de trabajo).

git checkout -f donor-branch

Paso 2. Este paso elimina el FOI porque son rastreados en nuestra rama actual (donante) y ausentes en el receiving-branchcambio a.

git checkout receiving-branch

Paso 3. Ahora que el FOI está ausente, la fusión en la rama donante no sobrescribirá ningún archivo no rastreado, por lo que no obtenemos errores.

git merge donor-branch
Esteis
fuente
3
¡Esto es demasiado limpio para ser la séptima u octava respuesta!
Majed DH
1
Gracias, @MajedDH, ¡me alegraste el día! <3
Esteis
1
¡Aquí estaba el instafix que estaba buscando! Gracias
AFM-Horizon
Encantado de haberte ayudado, @ AFM-Horizon!
Esteis
20

Eliminar todos los archivos no rastreados:

git clean  -d  -fx .
Abhishek Goel
fuente
8
eliminar los archivos posiblemente usados ​​en un proyecto no debería ser la solución real
Erdinç Çorbacı
44
yikes, también limpiaron archivos IDE :(
kisna
15

Puedes probar ese comando

git clean -df
Amr Mohammed
fuente
55
¿de qué sirve eliminar directorios no rastreados? ... pueden ser valiosos, ya sabes.
zhekaus
¿Podrías explicar qué hace?
Safak Ozkan
12

Actualización: una versión mejor

Esta herramienta ( https://github.com/mklepaczewski/git-clean-before-merge ):

  • eliminar archivos no rastreados que son idénticos a sus git pullequivalentes,
  • revertir los cambios a los archivos modificados cuya versión modificada es idéntica a sus git pullequivalentes,
  • informar archivos modificados / no rastreados que difieren de su git pullversión,
  • la herramienta tiene la --pretendopción que no modificará ningún archivo.

Versión antigua

¿Cómo esta respuesta difiere de otras respuestas?

El método presentado aquí elimina solo los archivos que se sobrescribirán mediante la fusión. Si tiene otros archivos sin seguimiento (posiblemente ignorados) en el directorio, este método no los eliminará.

La solución

Este fragmento extraerá todos los archivos no rastreados que se sobrescribirán git pully los eliminará.

git pull 2>&1|grep -E '^\s'|cut -f2-|xargs -I {} rm -rf "{}"

y luego simplemente hacer:

git pull

Este no es un comando de git porcelain, así que siempre verifique dos veces qué haría con:

git pull 2>&1|grep -E '^\s'|cut -f2-|xargs -I {} echo "{}"

Explicación: porque uno de los revestimientos da miedo:

Aquí hay un desglose de lo que hace:

  1. git pull 2>&1- Capture la git pullsalida y redirija todo a stdout para que podamos capturarlo fácilmente grep.
  2. grep -E '^\s - la intención es capturar la lista de los archivos no rastreados que serían sobrescritos por git pull . Los nombres de archivo tienen un montón de espacios en blanco delante de ellos, por lo que los utilizamos para obtenerlos.
  3. cut -f2- - eliminar espacios en blanco desde el comienzo de cada línea capturada en 2.
  4. xargs -I {} rm -rf "{}"- xargspara iterar sobre todos los archivos, guardar su nombre en "{}" y llamar rma cada uno de ellos. Usamos -rfpara forzar la eliminación y eliminación de directorios no rastreados.

Sería genial reemplazar los pasos 1-3 con el comando de porcelana, pero no conozco ningún equivalente.

mate
fuente
Gracias, a menudo tengo archivos sin seguimiento en mi directorio de trabajo que no quiero eliminar ni confirmar. En mi caso necesitaba sustituir git pullcongit checkout <branch_name>
mihow
6

Si considera usar la -fbandera, primero puede ejecutarla como una ejecución en seco. Solo que sabes por adelantado qué tipo de situación interesante terminarás después ;-P

-n 
--dry-run 
    Don’t actually remove anything, just show what would be done.
Maarten
fuente
6

Además de la respuesta aceptada, por supuesto, puede eliminar los archivos si ya no los necesita especificando el archivo:

git clean -f '/path/to/file/'

Recuerde ejecutarlo primero con la bandera -n si desea ver qué archivos eliminará git clean. Tenga en cuenta que estos archivos serán eliminados. En mi caso, no me importaron de todos modos, así que fue una mejor solución para mí.

MMM
fuente
5

Una forma de hacerlo es guardar los cambios locales y extraerlos del repositorio remoto. De esta manera, no perderá sus archivos locales ya que los archivos irán al alijo.

git add -A
git stash
git pull

Puede verificar sus archivos escondidos locales usando este comando: git stash list

AHM Forhadul Islam
fuente
4

Para aquellos que no saben, git ignora las diferencias de nombre en mayúsculas / minúsculas en los archivos y carpetas. Esto resulta ser una pesadilla cuando los renombra al mismo nombre con un caso diferente.

Encontré este problema cuando cambié el nombre de una carpeta de "Petstore" a "petstore" (mayúsculas a minúsculas). Había editado mi archivo .git / config para dejar de ignorar las mayúsculas y minúsculas, hice cambios, aplasté mis commits y escondí mis cambios para moverme a una rama diferente. No pude aplicar mis cambios escondidos a esta otra rama.

La solución que encontré que funcionó fue editar temporalmente mi archivo .git / config para ignorar temporalmente el caso nuevamente. Esto causó git stash applytener éxito. Entonces, cambié ignoreCase de nuevo a false. Luego agregué todo excepto los nuevos archivos en la carpeta de la tienda de mascotas que git extrañamente afirmó que fueron eliminados, por cualquier razón. Cometí mis cambios, luego corrí git reset --hard HEADpara deshacerme de esos nuevos archivos sin seguimiento. Mi confirmación apareció exactamente como se esperaba: los archivos en la carpeta fueron renombrados.

Espero que esto te ayude a evitar mi misma pesadilla.

A. Davidson
fuente
No funciono para mi. Eliminé todos los archivos en la carpeta. Entonces git pull -fentonces git checkout .. Qué pesadilla.
m.rufca
De Verdad? Funcionó bien para mí hace solo unas semanas. ¿Intentó editar su archivo gitconfig para iniciar / dejar de ignorar el caso según corresponda?
A. Davidson el
Gracias. Necesitaba fusionarme desde master después de arreglar la carcasa en la ruta de la carpeta. Pude fusionarlo con git ignore case, después de eso solo volví a habilitar la sensibilidad de mayúsculas y minúsculas.
Rubenisme
3

Ni clean / reset / hard checkout / rebase funcionó para mí.

Así que acabo de eliminar archivos de los que git se quejó *

rm /path/to/files/that/git/complained/about

* Verifiqué si estos archivos se pueden eliminar revisando un nuevo repositorio en una carpeta separada (los archivos no estaban allí)

Michał Szkudlarek
fuente
1

En mi caso cuando tuve este problema. Tenía un archivo local que había renombrado en el control remoto.

Cuando git pullintenté, Git me dijo que no se rastreaba el nuevo nombre de archivo, que estaba en el control remoto, aunque todavía no existía en el local.

Debido a que no hubo ningún caso de forma local no podía hacerlo git pullhasta que lo hice git rmen el antiguo nombre de fichero (que no era evidente en un primer momento debido a mi estúpida idea de que el cambio de nombre).

Tom Bush
fuente
0

Si tiene los archivos escritos bajo .gitignore, elimine los archivos y ejecute git pull nuevamente. Eso me ayudó.

uko akanowo
fuente