¿Cómo fuerzo a "git pull" para que sobrescriba archivos locales?

Resuelto Jakub Troszok asked hace 15 años • 54 respuestas

¿Cómo fuerzo una sobrescritura de archivos locales en un git pull? Mi repositorio local contiene un archivo con el mismo nombre que el del servidor.

error: el archivo del árbol de trabajo sin seguimiento 'example.txt' se sobrescribiría al fusionarlo

Jakub Troszok avatar Jul 14 '09 21:07 Jakub Troszok
Aceptado

⚠ Advertencia:

Cualquier cambio local no confirmado en los archivos rastreados se perderá, incluso si se realiza por etapas .

Pero cualquier archivo local que no sea rastreado por Git no se verá afectado.


Primero, actualice todas origin/<branch>las referencias a la última versión:

git fetch --all

Haga una copia de seguridad de su rama actual (por ejemplo master):

git branch backup-master

Vaya a la última confirmación origin/mastery consulte esos archivos:

git reset --hard origin/master

Explicación:

git fetchdescarga la última versión de forma remota sin intentar fusionar ni cambiar la base de nada.

git resetrestablece la rama maestra a lo que acaba de obtener. La --hardopción cambia todos los archivos en su árbol de trabajo para que coincidan con los archivos en origin/master.


Mantener compromisos locales actuales

[*] : Vale la pena señalar que es posible mantener las confirmaciones locales actuales creando una rama masterantes de restablecer:

git checkout master
git branch new-branch-to-save-current-commits
git fetch --all
git reset --hard origin/master

Después de esto, todas las confirmaciones antiguas se mantendrán en formato new-branch-to-save-current-commits.

Cambios no confirmados

Los cambios no confirmados, incluso si se realizan por etapas (con git add), se perderán. Asegúrate stasho compromete cualquier cosa que necesites. Por ejemplo, ejecute lo siguiente:

git stash

Y más tarde (después de git reset), vuelva a aplicar estos cambios no confirmados:

git stash pop

Lo que puede crear conflictos de fusión.

RNA avatar Jan 17 '2012 00:01 RNA

Esto eliminará todos los cambios no confirmados, incluso si se realizan por etapas,
y luego extraerá:

git reset --hard HEAD
git pull

Pero cualquier archivo local que no sea rastreado por Git no se verá afectado.

Travis Reeder avatar May 09 '2010 19:05 Travis Reeder

ADVERTENCIA: git cleanelimina todos los archivos/directorios sin seguimiento y no se puede deshacer.


A veces simplemente clean -fno ayuda. En caso de que tenga DIRECTORIOS sin seguimiento, también se necesita la opción -d:

# WARNING: this can't be undone!

git reset --hard HEAD
git clean -f -d
git pull

ADVERTENCIA: git cleanelimina todos los archivos/directorios sin seguimiento y no se puede deshacer.

Considere usar el indicador -n( --dry-run) primero. Esto le mostrará lo que se eliminará sin eliminar nada:

git clean -n -f -d

Salida de ejemplo:

Would remove untracked-file-1.txt
Would remove untracked-file-2.txt
Would remove untracked/folder
...
David Avsajanishvili avatar Mar 19 '2011 09:03 David Avsajanishvili

Al igual que Hedgehog, creo que las respuestas son terribles. Pero aunque la respuesta de Hedgehog podría ser mejor, no creo que sea tan elegante como podría ser. La forma que encontré para hacer esto es usando fetchy mergecon una estrategia definida. Lo que debería hacer que sus cambios locales se conserven siempre que no sean uno de los archivos con los que está intentando forzar una sobrescritura.

Primero haga una confirmación de sus cambios.

 git add *
 git commit -a -m "local file server commit message"

Luego busque los cambios y sobrescriba si hay un conflicto.

 git fetch origin master
 git merge -s recursive -X theirs origin/master

-Xes el nombre de una opción y theirses el valor de esa opción. Elige utilizar theircambios (la otra opción es ourscambios) si hay un conflicto.

Richard avatar Apr 11 '2012 20:04 Richard

En lugar de hacer:

git fetch --all
git reset --hard origin/master

Recomiendo hacer lo siguiente:

git fetch origin master
git reset --hard origin/master

No es necesario recuperar todos los controles remotos y ramas si vas a restablecer la rama de origen/maestra, ¿verdad?

Johanneke avatar Apr 26 '2013 13:04 Johanneke

Parece que la mejor manera es hacer primero:

git clean

Para eliminar todos los archivos sin seguimiento y luego continuar con lo habitual git pull...

Jakub Troszok avatar Jul 14 '2009 15:07 Jakub Troszok