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?
Respuestas:
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
Esto rastreará todos los archivos, eliminará todos sus cambios locales a esos archivos y luego obtendrá los archivos del servidor.
fuente
git add -A .; git stash
trabajó para mi. Lagit add *
variante se quejó de caminos ignorados.Puede probar el comando para borrar los archivos no rastreados del local
Git 2.11 y versiones más nuevas:
Versiones anteriores de Git:
Donde
-d
se 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.
fuente
-i
para el modo interactivo. Además de eliminar el directorio no deseado, también-x
puede doler.Los únicos comandos que funcionaron para mí fueron:
fuente
Un reemplazo para
git merge
eso sobrescribirá los archivos no rastreadosLos comentarios a continuación usan 'FOI' para los 'archivos de interés', los archivos que
Un reemplazo para
git pull
eso sobrescribirá los archivos no rastreadospull = fetch + merge
, así quegit fetch
seguimos con elgit checkout -f, git checkout, git merge
truco anterior.Explicación detallada
git merge -f
no existe, perogit 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).
Paso 2. Este paso elimina el FOI porque son rastreados en nuestra rama actual (donante) y ausentes en el
receiving-branch
cambio a.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.
fuente
Eliminar todos los archivos no rastreados:
fuente
Si se trata de una operación única, puede eliminar todos los archivos no rastreados del directorio de trabajo antes de realizar la extracción. Lea ¿Cómo eliminar archivos locales (sin seguimiento) del árbol de trabajo Git actual? para obtener información sobre cómo eliminar todos los archivos no rastreados.
Asegúrese de no eliminar accidentalmente el archivo sin seguimiento que aún necesita;)
fuente
Puedes probar ese comando
fuente
Actualización: una versión mejor
Esta herramienta ( https://github.com/mklepaczewski/git-clean-before-merge ):
git pull
equivalentes,git pull
equivalentes,git pull
versión,--pretend
opció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 pull
y los eliminará.y luego simplemente hacer:
Este no es un comando de git porcelain, así que siempre verifique dos veces qué haría con:
Explicación: porque uno de los revestimientos da miedo:
Aquí hay un desglose de lo que hace:
git pull 2>&1
- Capture lagit pull
salida y redirija todo a stdout para que podamos capturarlo fácilmentegrep
.grep -E '^\s
- la intención es capturar la lista de los archivos no rastreados que serían sobrescritos porgit pull
. Los nombres de archivo tienen un montón de espacios en blanco delante de ellos, por lo que los utilizamos para obtenerlos.cut -f2-
- eliminar espacios en blanco desde el comienzo de cada línea capturada en 2.xargs -I {} rm -rf "{}"
-xargs
para iterar sobre todos los archivos, guardar su nombre en "{}" y llamarrm
a cada uno de ellos. Usamos-rf
para 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.
fuente
git pull
congit checkout <branch_name>
Si considera usar la
-f
bandera, primero puede ejecutarla como una ejecución en seco. Solo que sabes por adelantado qué tipo de situación interesante terminarás después ;-Pfuente
Además de la respuesta aceptada, por supuesto, puede eliminar los archivos si ya no los necesita especificando el archivo:
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í.
fuente
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.
Puede verificar sus archivos escondidos locales usando este comando:
git stash list
fuente
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 apply
tener éxito. Entonces, cambié ignoreCase de nuevo afalse
. 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 HEAD
para 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.
fuente
git pull -f
entoncesgit checkout .
. Qué pesadilla.Ni clean / reset / hard checkout / rebase funcionó para mí.
Así que acabo de eliminar archivos de los que git se quejó *
* Verifiqué si estos archivos se pueden eliminar revisando un nuevo repositorio en una carpeta separada (los archivos no estaban allí)
fuente
En mi caso cuando tuve este problema. Tenía un archivo local que había renombrado en el control remoto.
Cuando
git pull
intenté, 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 pull
hasta que lo hicegit rm
en 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).fuente
Si tiene los archivos escritos bajo .gitignore, elimine los archivos y ejecute git pull nuevamente. Eso me ayudó.
fuente