¿Git Pull mientras ignora los cambios locales?

489

¿Hay alguna manera de hacer una git pullque ignore cualquier cambio de archivo local sin eliminar el directorio y tener que realizar una git clone?

Markdorison
fuente
17
Por "ignora" quieres decir "sobrescribe"?
Cascabel
@Cascabel Significa revertir todos los cambios locales, eliminar todas las confirmaciones locales, eliminar todos los archivos y directorios nuevos locales, recuperar todos los archivos y directorios eliminados localmente, etc. En resumen, simplemente ejecute un comando como si rm -rf local_repo && git clone remote_url.
Victor

Respuestas:

820

Si quiere decir que desea que la extracción sobrescriba los cambios locales, haga la fusión como si el árbol de trabajo estuviera limpio, bueno, limpie el árbol de trabajo:

git reset --hard
git pull

Si hay archivos locales sin seguimiento que podría usar git cleanpara eliminarlos. Utilícelo git clean -fpara eliminar archivos sin seguimiento, -dfpara eliminar archivos y directorios sin seguimiento, y -xdfpara eliminar archivos o directorios sin seguimiento o ignorados.

Si, por otro lado, desea mantener las modificaciones locales de alguna manera, usaría el alijo para ocultarlas antes de tirar, luego vuelva a aplicarlas:

git stash
git pull
git stash pop

Sin embargo, no creo que tenga sentido ignorar literalmente los cambios: la mitad de la extracción es fusionar, y necesita fusionar las versiones comprometidas del contenido con las versiones que obtuvo.

Cascabel
fuente
44
Si después de que git resetsus archivos aún difieren del control remoto, lea stackoverflow.com/questions/1257592/…
Coronel Panic
3
Git es la cosa más extraña del mundo. Git reset --duro hecho. Luego git status: tu rama está adelante con 2 commits.
Shailen
21
@shailenTJ "Cambios locales" aquí significa cambios no confirmados, no confirmaciones locales. git reset --hardafecta a la primera, no a la segunda. Si desea restablecer completamente el estado del control remoto, git reset --hard origin/<branch>pero a menudo y en este caso, esas dos confirmaciones por las que está por delante son el trabajo que realizó, no algo que desea desechar.
Cascabel
2
Entonces, esto es lo mismo que destruir el repositorio local y volver a descargar, ¿verdad? Solo quiero poder forzar los cambios de extracción y sobrescritura para mayor comodidad. El 99% de las veces recibo este mensaje de error cuando accidentalmente he estropeado algo localmente y solo quiero comenzar de nuevo desde el repositorio.
sudo
¿Qué pasa si no es posible que no tenga un cambio local frente a la cabeza? Por ejemplo, el repositorio se realizó en un sistema de archivos que distingue entre mayúsculas y minúsculas y está clonado en un sistema de archivos que no distingue entre mayúsculas y minúsculas y hay 2 archivos con el mismo nombre y una carcasa diferente.
xster
305

Para mí lo siguiente funcionó:

(1) Primero busque todos los cambios:

$ git fetch --all

(2) Luego reinicie el maestro:

$ git reset --hard origin/master

(3) Pull / actualizar:

$ git pull
Artur Barseghyan
fuente
22
Me funcionó muy bien cuando tuve muchos problemas con la respuesta principal. ¡Gracias!
0x0
66
Esto funciona incluso cuando u ur se han comprometido los cambios locales, pero todavía U quiere volver
agsachin
16
Esta debería ser la respuesta principal :)
Purus
55
@Marco Servetto: Primero busca todos los cambios de git, pero aún no los aplica. Luego restablece el maestro al último estado (actualizado). Si omite el primer paso, revertirá los cambios al antiguo maestro (local). Desde mi experiencia, la forma en que lo describí, nunca causa problemas. Todos los otros intentos lo hacen al final.
Artur Barseghyan
1
Esto funcionó para mí, quería ignorar todos mis cambios locales, incluida la recuperación de archivos eliminados
Neri
28

Solo quieres un comando que dé exactamente el mismo resultado que rm -rf local_repo && git clone remote_url, ¿verdad? También quiero esta característica. Me pregunto por qué git no proporciona dicho comando (como git recloneo git sync), ni svn proporciona dicho comando (como svn recheckouto svn sync).

Pruebe el siguiente comando:

git reset --hard origin/master
git clean -fxd
git pull
Víctor
fuente
Eso es lo que realmente funciona, incluso cuando ya tiene confirmaciones locales que desea eliminar.
Yuri Ghensev
55
Advertencia chicos !! git clean -fxdelimina archivos de .gitignoretambién.
Ramesh Navi
@RameshNavi Claro. Esto es exactamente lo que se quiere. Lo que se desea es tener una forma más rápida de volver a clonarlo, es decir, eliminar todo el repositorio local y luego clonarlo.
Victor
27

El siguiente comando no funcionará siempre . Si solo haces:

$ git checkout thebranch
Already on 'thebranch'
Your branch and 'origin/thebranch' have diverged,
and have 23 and 7 different commits each, respectively.

$ git reset --hard
HEAD is now at b05f611 Here the commit message bla, bla

$ git pull
Auto-merging thefile1.c
CONFLICT (content): Merge conflict in thefile1.c
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.

y así...

Para comenzar realmente de nuevo, descargar thebranch y sobrescribir todos sus cambios locales, simplemente haga lo siguiente:


$ git checkout thebranch
$ git reset --hard origin/thebranch

Esto funcionará bien.

$ git checkout thebranch
Already on 'thebranch'
Your branch and 'origin/thebranch' have diverged,
and have 23 and 7 different commits each, respectively.

$ git reset --hard origin/thebranch
HEAD is now at 7639058 Here commit message again...

$ git status
# On branch thebranch
nothing to commit (working directory clean)

$ git checkout thebranch
Already on 'thebranch'
Dr. Beco
fuente
44
SI. Esto es lo que necesitaba para un enfoque final de "no dar una F sobre lo que es local". Gracias. :)
Adambean
10
git fetch --all && git reset --hard origin/master
Luca C.
fuente
8

Mire git stash para colocar todos sus cambios locales en un "archivo stash" y volver al último commit. En ese punto, puede aplicar sus cambios escondidos o descartarlos.

Seth Johnson
fuente
8

Si estás en Linux:

git fetch
for file in `git diff origin/master..HEAD --name-only`; do rm -f "$file"; done
git pull

El bucle for eliminará todos los archivos rastreados que se cambian en el repositorio local, por git pulllo que funcionará sin ningún problema.
Lo mejor de esto es que solo los archivos rastreados serán sobrescritos por los archivos en el repositorio, todos los demás archivos quedarán intactos.

Strahinja Kustudic
fuente
Creo que querías decir "archivos rastreados", que es exactamente lo que necesito, gracias.
Ali
¿Algún equivalente para Powershell?
Earlee
8

La forma más corta de hacerlo es:

git pull --rebase --autostash
Gil
fuente
no sabía --autostashantes, gracias!
Shiro
7

esto funcionó para mí

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

con la respuesta aceptada obtengo errores de conflicto

Pablo Pazos
fuente
Eso es muy similar a la respuesta de 2015 de Artur Barseghyan ... pero todavía me gustaría saber cuál es el propósito del tercer comando: los archivos de trabajo han cambiado después del segundo comando, y el tercer comando dice "Ya actualizado "
Mike roedor
esa es la única combinación que funcionó en mi entorno, tal vez estás viendo algo diferente, para mí, necesitaba los tres comandos
Pablo Pazos,
Interesante. Podría ser una cosa de versión. Estoy en git 2.7.4. Pero también acabo de ver un nuevo comentario de Artur Barseghyan: "De lo contrario, podría encontrarse trabajando en un maestro desactualizado accidentalmente".
Mike roedor
tal vez, pero lo único que puedo decir es "esto funcionó para mí cuando ninguna otra solución lo hizo", por lo que podría ayudar a otros
Pablo Pazos
3

Yo suelo hacer:

git checkout .
git pull

En la carpeta raíz del proyecto.

Cassiano Franco
fuente
2

Esto buscará la rama actual e intentará hacer un avance rápido para dominar:

git fetch && git merge --ff-only origin/master
Petah
fuente