¿Cómo fuerzo a "git pull" para que sobrescriba archivos locales?
¿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
⚠ 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/master
y consulte esos archivos:
git reset --hard origin/master
Explicación:
git fetch
descarga la última versión de forma remota sin intentar fusionar ni cambiar la base de nada.
git reset
restablece la rama maestra a lo que acaba de obtener. La --hard
opció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 master
antes 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 stash
o 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.
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.
ADVERTENCIA: git clean
elimina todos los archivos/directorios sin seguimiento y no se puede deshacer.
A veces simplemente clean -f
no 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 clean
elimina 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
...
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 fetch
y merge
con 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
-X
es el nombre de una opción y theirs
es el valor de esa opción. Elige utilizar their
cambios (la otra opción es ours
cambios) si hay un conflicto.
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?
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
...