2010-11-11 54 views

Respuesta

502

Si quiere decir que desea que el tirón para sobrescribir los cambios locales, haciendo la fusión como si el árbol de trabajo estaban limpias, bien, limpiar el árbol de trabajo:

git reset --hard 
git pull 

Si hay archivos locales sin seguimiento podría utilizar git clean para eliminarlos. Use git clean -f para eliminar los archivos sin seguimiento, -df para eliminar los archivos y directorios no rastreados, y -xdf para eliminar los archivos o directorios no rastreados o ignorados.

Si por el contrario desea conservar las modificaciones locales de alguna manera, tendrá que utilizar escondite para ocultar a la basura antes de tirar, a continuación, volver a aplicarlos después:

git stash 
git pull 
git stash pop 

no creo que hace que cualquier sentido para literalmente ignorar los cambios, sin embargo, la mitad de la extracción se fusiona, y debe fusionar las versiones confirmadas de contenido con las versiones que obtuvo.

+3

Si después de 'git reset' sus archivos aún difieren del remoto, lea http://stackoverflow.com/questions/1257592/removing-files-saying-old-mode-100755-new-mode-100644-from-unstaged- cambios en –

+1

Git es lo más extraño que haya existido. Git reset --hard done. Luego, estado de git: su rama está adelantada por 2 commits. – shailenTJ

+11

@shailenTJ "Cambios locales" aquí significa cambios no confirmados, no confirmaciones locales. 'git reset --hard' afecta al primero, no al segundo. Si desea restablecer completamente el estado del control remoto, 'git reset --hard origin/' - pero a menudo y en este caso, esos dos compromisos que está por delante del origen son trabajo que usted hizo, no algo que desea tirar lejos. – Cascabel

7

Mire git stash para poner todos sus cambios locales en un "archivo oculto" y revertir a la última confirmación. En ese momento, puede aplicar sus cambios escondidos, o descartarlos.

7

Si está en Linux:

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

El bucle se eliminarán todos los archivos bajo seguimiento que se cambian en el repositorio local, por lo git pull 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 otros archivos quedarán intactos.

+0

Creo que quería decir "archivos rastreados" que es exactamente lo que necesito, gracias. – Ali

15

El comando debajo de no funcionará siempre. Si lo hace simplemente:

$ 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í sucesivamente ...

Para realmente empezar de nuevo, la descarga de thebranch y sobrescribir todos los cambios locales, acaba de hacer:


$ 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' 
+2

SÍ. Esto es lo que necesitaba para un enfoque definitivo de "no dé un F sobre lo que es local". Gracias. :) – Adambean

120

Para mí Esta trabajaron:

(1) En primer lugar obtener todos los cambios:

$ git fetch --all 

(2) A continuación, restablezca el maestro:

$ git reset --hard origin/master 

(3) Tire/actualizar:

$ git pull 
+5

Funcionó muy bien para mí cuando tuve muchos problemas con la respuesta principal. ¡Gracias! –

+1

esto incluso funciona cuando has cometido tus cambios locales, pero aún quieres revertir – agsachin

+1

Esta debería ser la respuesta principal :) – Purus

0

Esto obtendrá la rama actual y tratar de hacer un avance rápido de dominar:

git fetch && git merge --ff-only origin/master 
4
git fetch --all && git reset --hard origin/master 
Cuestiones relacionadas