Sobrescribir mi sucursal local con sucursal remota

153

He fubar'd completamente mi sucursal local, y me gustaría comenzar de nuevo. La versión en el servidor es correcta.

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

git fetch branchnamey git pull branchnameno trabajes El mensaje que recibo está " actualizado ", sin embargo, mi versión local no coincide con la del servidor.

git pull origin/branchnameme da un error " no encontrado ".

Sara Chipps
fuente

Respuestas:

248

primero, cree una nueva rama en la posición actual (en caso de que necesite su antiguo historial 'jodido'):

git branch fubar-pin

Actualice su lista de sucursales remotas y sincronice nuevas confirmaciones:

git fetch --all

luego, restablezca su rama al punto donde el origen / rama apunta a:

git reset --hard origin/branch

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

knittl
fuente
2
+1 pero es posible que desee agregar un recordatorio git fetch originantes del reinicio
Mark Longair
Hice esto con un ligero cambio y no funcionó: git fetch --todos, git reset --hard SHA1OFANOLDCOMMIT, (algunas otras cosas), git reset --hard origin / branch. El resultado final fue que todavía estaba en el antiguo commit. Por lo tanto, este enfoque puede funcionar en algunos casos, pero creo que no funciona en todos.
Greggles
@greggles: ¿Algún error? Después del último comando, HEAD debe apuntar al origen / rama.
knittl
1
@Gavin: no, esto en ningún caso afectará a otras ramas que no sean origin/branch. Nunca.
knittl
1
@greggles Sé que es muy tarde, pero para otras personas que se preguntan por qué podría suceder, este enfoque solo funcionará si tienes una sucursal desprotegida. No funcionó para usted porque estaba en estado HEAD separado (HEAD apunta a un commit, no a una rama) y estos comandos solo funcionan si HEAD apunta a una rama. Cuando lo haces git resetmientras HEAD apunta a una rama, esa rama te seguirá.
Michael Dorst
60

Lo que hago cuando arruino mi sucursal local es cambiar el nombre de mi sucursal rota y revisar / bifurcar la sucursal aguas arriba nuevamente:

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

Luego, si está seguro de que no quiere nada de su rama anterior, elimínelo:

git branch -D branch-old

Pero generalmente dejo la antigua sucursal localmente, en caso de que tuviera algo allí.

Casey Marshall
fuente
44
Esta parece ser la mejor respuesta. Ayuda a crear una copia de seguridad por si acaso y parece muy probable que la rama local sea una copia exacta de la remota.
Greggles
Gran respuesta, útil para mí. Uno P: La documentación oficial de git-checkout parece decir que su tercer comando debería ser: git checkout -b <branch> --track <remote>/<branch>¿El suyo funciona igual de bien, sin el --track?
Starman
1
Creo que la configuración var branch.autoSetupMerge(que creo que por defecto es verdadera) hace que la --trackimplícita. Y sí, en todas mis configuraciones de git no necesito explícitamente --trackcuando hago un checkout -b, pero YMMV.
Casey Marshall
5

Es probable que su sucursal local tenga modificaciones que desee descartar. Para hacer esto, necesitará usar git resetpara restablecer la cabeza de la rama al último punto que divergió de la rama del repositorio aguas arriba. Úselo git branch -vpara encontrar la identificación sha1 de la rama ascendente y restablezca su rama utilizando git reset SHA1ID. Entonces debería poder hacer un git checkoutpara descartar los cambios que dejó en su directorio.

Nota: siempre haga esto en un repositorio respaldado. De esa manera puedes asegurarte de que funcionaste bien. O si no fuera así, tiene una copia de seguridad a la que volver.

Wes Hardaker
fuente
Parece que probablemente funcionaría, pero dada la simplicidad y confiabilidad del enfoque de "hacer una copia de su trabajo en otro lugar, hacer una copia nueva de la rama remota", no veo cómo esto es mejor.
greggles
2
git reset --hard

Esto es para revertir todos los cambios locales al encabezado de origen

Karthikeyan Varadarajan
fuente