2011-06-03 9 views
145

He robado completamente mi sucursal local y me gustaría volver a empezar. La versión en el servidor es correcta.Sobrescritura de mi sucursal local con una sucursal remota

No quiero empezar de nuevo, me gustaría utilizar mi historial local para arreglar mi gran error. (Puedo si tengo que).

git fetch branchname, y git pull branchname no funcionan. El mensaje que recibo es "hasta la fecha", sin embargo, mi versión local no coincide con la del servidor.

git pull origin/branchname me dona un "not found" error.

+0

Posible duplicado de [Restablecer la rama del repositorio local para que sea como el repositorio remoto HEAD] (http://stackoverflow.com/questions/1628088/reset-location-local-branch-to-be-just-like-remote- repository-head) –

Respuesta

2

Es probable que su sucursal local tenga modificaciones que desea descartar. Para hacer esto, necesitará usar git reset para restablecer el ramal al último punto que divergió de la rama repo ascendente. Use git branch -v para encontrar el id. Sha1 de la rama ascendente y restablezca su bifurcación usando git reset SHA1ID. Entonces debería poder hacer un git checkout para descartar los cambios que dejó en su directorio.

Nota: siempre haga esto en un repositorio respaldado. De esa manera puedes asegurarte que eres uno mismo, funcionó bien. O si no lo hizo, tiene una copia de seguridad para volver a.

+0

Esto parece que probablemente funcionaría, pero dada la simplicidad y confiabilidad del enfoque de "hacer una copia de su trabajo en otro lugar, haga una copia nueva de la rama remota" No veo cómo esto es mejor . – greggles

215

en primer lugar, crear una nueva rama en la posición actual (en caso de que tenga su edad 'cagado' historia):

git branch fubar-pin 

actualización de su lista de sucursales remotas y sincronización nuevas confirmaciones:

git fetch --all 

continuación, restablecer su rama en el punto en que los puntos de origen/sucursales a:

git reset --hard origin/branch 

tenga cuidado, esto eliminará cualquier cambio de su árbol de trabajo!

+2

+1 pero es posible que desee agregar un recordatorio para hacer el 'origen de recuperación de git' antes del reinicio –

+0

Lo hice con un ligero cambio y no funcionó: git fetch --all, git reset --hard SHA1OFANOLDCOMMIT, (algunas otras cosas), git reset --hard origin/branch. El resultado final fue que todavía estaba en el compromiso anterior. Por lo tanto, este enfoque puede funcionar en algunos casos, pero creo que no funciona en absoluto. – greggles

+0

@greggles: ¿Algún error?Después del último comando, HEAD debe apuntar al origen/rama. – knittl

53

lo que hago cuando me lío mi sucursal local es que acabo de cambiar el nombre de la rama rota, y echa un vistazo a/rama de la rama aguas arriba de nuevo:

git branch -m branch branch-old 
git fetch remote 
git checkout -b branch remote/branch 

Entonces, si estás seguro de que no quiero nada de su rama de edad, eliminarlo:

git branch -D branch-old 

pero por lo general salir de la rama de edad en torno a nivel local, por si acaso tenía algo ahí dentro.

+4

Esta parece ser la mejor respuesta. Ayuda a crear una copia de seguridad por las dudas y parece muy probable que la sucursal local sea una copia exacta de la remota. – greggles

+0

Gran respuesta, útil para mí. Uno Q: La documentación oficial git-checkout parece decir que su tercera comando debe ser: 'git checkout -b --track /' Hace el suyo funciona igual de bien, sin el '--track'? – Starman

+0

Creo que la configuración var 'branch.autoSetupMerge' (que creo que por defecto es verdadera) hace que' --track' esté implícito. Y, sí, en todas mis configuraciones de git no necesito '--track' explícitamente cuando hago' checkout -b', sino YMMV. –

Cuestiones relacionadas