Pregunta ¿Cómo forzo a "git pull" a sobrescribir los archivos locales?


¿Cómo fuerzo una sobreescritura de archivos locales en un git pull?

El escenario es el siguiente:

  • Un miembro del equipo está modificando las plantillas para un sitio web en el que estamos trabajando
  • Están agregando algunas imágenes al directorio de imágenes (pero se olvidan de agregarlas bajo control de fuente)
  • Están enviando las imágenes por correo, más tarde, para mí
  • Estoy agregando las imágenes bajo el control de fuente y empujándolas a GitHub junto con otros cambios
  • No pueden extraer actualizaciones de GitHub porque Git no desea sobrescribir sus archivos.

Este es el error que estoy recibiendo:

error: Untracked working tree file 'public/images/icon.gif' would be overwritten by merge

¿Cómo obligo a Git a sobrescribirlos? La persona es diseñadora, generalmente resuelvo todos los conflictos a mano, de modo que el servidor tiene la versión más reciente que solo necesita actualizar en su computadora.


5198
2017-07-14 14:58


origen


Respuestas:


Importante: si tiene algún cambio local, se perderán. Con o sin --hard opción, se perderán todas las confirmaciones locales que no se hayan enviado.[*]

Si tiene archivos que están no rastreados por Git (por ejemplo, contenido de usuario cargado), estos archivos no se verán afectados.


Creo que esta es la manera correcta:

git fetch --all

Entonces, tienes dos opciones:

git reset --hard origin/master

O si está en otra rama:

git reset --hard origin/<branch_name>

Explicación:

git fetch descarga lo último desde el control remoto sin intentar unir o rebase nada.

Entonces el git reset restablece la rama principal a lo que acaba de obtener. los --hard opción cambia todos los archivos en su árbol de trabajo para que coincidan con los archivos en origin/master


Mantener confirmaciones locales actuales

[*]: Vale la pena señalar que es posible mantener confirmaciones locales actuales creando una rama de master antes de reiniciar:

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 anteriores se guardarán en new-branch-to-save-current-commits.

Cambios no confirmados

Sin embargo, los cambios no comprometidos (incluso en etapas) se perderán. Asegúrate de esconder y comprometer todo lo que necesites. Para eso puedes ejecutar lo siguiente:

git stash

Y luego para volver a aplicar estos cambios no confirmados:

git stash pop

7275
2018-01-17 00:02



Prueba esto:

git reset --hard HEAD
git pull

Debería hacer lo que quieras.


761
2018-05-09 19:45



ADVERTENCIA: git clean borra todos sus archivos / directorios sin seguimiento y no se puede deshacer.


Algunas veces solo clean -f no ayuda. En caso de que tenga DIRECTORIOS sin seguimiento, la opción -d también es necesaria:

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

ADVERTENCIA: git clean borra todos sus archivos / directorios sin seguimiento y no se puede deshacer.


381
2018-03-19 09:10



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 en que encontré esto es mediante el uso de "buscar" y "fusionar" con una estrategia definida. Lo cual debería hacer que sus cambios locales se conserven siempre y cuando no sean uno de los archivos con los que intenta forzar una sobrescritura.

Primero haz un commit de tus cambios

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

A continuación, busque los cambios y sobrescriba si hay un conflicto

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

"-X" es un nombre de opción, y "de ellos" es el valor para esa opción. Está eligiendo usar "sus" cambios, en lugar de "sus" cambios si hay un conflicto.


334
2018-04-11 20:13



En lugar de hacer:

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

Aconsejo hacer lo siguiente:

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

No es necesario buscar todos los controles remotos y las ramas si va a restablecer a la rama de origen / maestro ¿verdad?


237
2018-04-26 13:48



Parece que la mejor manera es hacer primero:

git clean

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


121
2017-07-14 15:16



Advertencia, esto eliminará permanentemente sus archivos si tiene alguna entrada de directorio / * en su archivo gitignore.

Algunas respuestas parecen ser terribles. Terrible en el sentido de lo que le sucedió a @Lauri siguiendo la sugerencia de David Avsajanishvili.

Más bien (git> v1.7.6):

git stash --include-untracked
git pull

Más tarde puede limpiar el historial del escondite.

Manualmente, uno por uno:

$ git stash list
stash@{0}: WIP on <branch>: ...
stash@{1}: WIP on <branch>: ...

$ git stash drop stash@{0}
$ git stash drop stash@{1}

Brutalmente, todo a la vez:

$ git stash clear

Por supuesto, si quieres volver a lo que escondiste:

$ git stash list
...
$ git stash apply stash@{5}

97
2018-02-11 23:00



Puede encontrar este comando útil para descartar cambios locales:

git checkout <your-branch> -f

Y luego haga una limpieza (elimina los archivos sin seguimiento del árbol de trabajo):

git clean -f

Si desea eliminar directorios no rastreados además de archivos no rastreados:

git clean -fd

86
2017-08-05 18:06



En lugar de fusionarse con git pull, prueba esto:

git fetch --all

seguido por:

git reset --hard origin/master.


72
2017-11-22 10:56