Git: descarte todos los cambios en una rama local divergente

117

Tengo una rama de tema local que está rastreando una rama remota. Por el bien del argumento, digamos que los historiales de confirmaciones se ven así:

A--B--C--O1--O2--O3 (origin/phobos)
       \
         L1--L2--L3 (phobos)

Habiendo examinado los historiales de confirmación relativos, ahora quiero descartar todos los cambios en la phobosrama local y volver a ser una copia directa de origin/phobos, para que el historial local se vea así:

A--B--C--O1--O2--O3 (phobos origin/phobos)

Realmente no quiero los cambios locales en la phobosrama, y ​​realmente no quiero que aparezcan fusiones en el repositorio de origen después. (Entonces, simplemente fusionar no es lo que tengo en mente).

Parece que debería ser muy fácil, pero mi google-fu me ha fallado. ¿Cómo hago esto?

Electrons_Ahoy
fuente

Respuestas:

79

Elimina la rama y luego vuelve a crearla:

$ git branch -D phobos
$ git checkout --track -b phobos origin/phobos
mipadi
fuente
37
Un problema con este enfoque en comparación con el restablecimiento de la cabeza de la rama es que eliminar la rama elimina el reflog de la rama. Restablecer la rama, por otro lado, no solo conserva el reflog, sino que en realidad registra el restablecimiento en el reflog. Esto hace que la operación sea fácilmente reversible más adelante, si es necesario.
Dan Moulding
9
@Electrons_Ahoy Le sugiero que cambie la respuesta aceptada aquí por la de Dan (para que las personas como yo que han buscado en Google cómo hacerlo probablemente elijan el método más seguro).
Steve Chambers
4
La respuesta de @ DanMoulding no implica eliminar una sucursal local cuando no es necesario. Es mucho mas seguro.
brma
@brma: ¿Cómo es eso? Todavía está apuntando una rama a una nueva confirmación.
mipadi
5
La respuesta de Dan Moulding es más segura. Creo que deberías seleccionar ese.
Daniel Apt
330
git checkout phobos
git reset --hard origin/phobos

Esto le dice a Git que reinicie el encabezado de phobosla misma confirmación que origin/phobosy que actualice el árbol de trabajo para que coincida.

Moldeo Dan
fuente
35
En mi opinión, esta debería ser la respuesta aceptada; emite el comando "restablecer" para trasplantar el puntero de rama, en lugar de realizar la cirugía con la eliminación / recreación.
vdboor
En realidad, probé este primero y arrojó un montón de errores que la copia local casi inutilizable. Eliminar / recrear puede haber sido menos elegante, pero no tuve que hacer ninguna pregunta de seguimiento.
Electrons_Ahoy
3
@Electrons_Ahoy: Hmm, eso definitivamente no es normal. Hacer este restablecimiento normalmente debería ser una operación sin problemas si su repositorio está en buenas condiciones de funcionamiento.
Dan Moulding
o incluso si es hinky. Usa git reflog para encontrar el camino a casa si "accidentalmente" emitiste este comando sin leer realmente lo que hace. :)
dbn
También esto funciona si estás en la sucursal y lo arruinaste localmente.
slott