2012-07-30 21 views
58
develop branch 
--> dashboard (working branch) 

utilizo git merge --no-ff develop fusionar los cambios aguas arriba en el salpicaderoRollback un Git fusionar

git log:

commit 88113a64a21bf8a51409ee2a1321442fd08db705 
Merge: 981bc20 888a557 
Author: XXXX <> 
Date: Mon Jul 30 08:16:46 2012 -0500 

    Merge branch 'develop' into dashboard 

commit 888a5572428a372f15a52106b8d74ff910493f01 
Author: root <[email protected]> 
Date: Sun Jul 29 10:49:21 2012 -0500 

    fixed end date edit display to have leading 0 

commit 167ad941726c876349bfa445873bdcd475eb8cd8 
Author: XXXX <> 
Date: Sun Jul 29 09:13:24 2012 -0500 

La fusión tenía unos 50 años commit en ella, y me pregunto cómo simplemente revertir la fusión para que el tablero regrese al estado previo a la fusión

La segunda parte de esto es, si no me fusiono con --no-ff, no obtengo la confirmación 'Merge branch 'develop' en el panel '.. ¿Cómo puedo deshacer esa fusión?

+2

Posible duplicado de [¿Deshacer una combinación de Git?] (Http://stackoverflow.com/q/2389361/456814). –

Respuesta

118

Revertir una fusión commit ha sido exhaustivamente cubierto de other questions. Al hacer una combinación de avance rápido, el segundo que usted describe, puede utilizar git reset para volver al estado anterior:

git reset --hard <commit_before_merge> 

Puede encontrar el <commit_before_merge> con git reflog, git log, o, si se siente la moxy (y no lo ha hecho ninguna otra cosa): git reset --hard [email protected]{1}

+4

gracias por la respuesta rápida .. mirando git log, la confirmación antes de la fusión es de más de 50 confirmaciones, ya que el desarrollo de git merge realmente coloca todas las otras confirmaciones. Supongo que lo que no entiendo es, si no sé qué/dónde fue esa fusión, ¿cómo la encuentro? Mencionas haber encontrado el commit_before_merge ... Supongo que no entiendo que la pieza – cgmckeever

+2

parece que con git reflog parece que resume muy bien las últimas cabeceras, y me permite saber dónde debo restablecer. El registro de git parece tener demasiada granularidad para identificar el lugar al que se debe restablecer.Gracias – cgmckeever

+0

Sí, 'reflog' es un salvavidas. 'HEAD @ {1}' simplemente describe el segundo estado más reciente de HEAD, o más técnicamente: "Una referencia seguida del sufijo @ con una especificación ordinal encerrada en un par de llaves (por ejemplo, {1}, {15}) especifica el n-ésimo valor anterior de esa referencia ". – Christopher

9

Simplemente reinicie la combinación de fusión con git reset --hard HEAD^.

Si utiliza --no-ff git siempre crea una fusión, incluso si no ha cometido nada en el medio. Sin --no-ff git simplemente hará un avance rápido, lo que significa que las ramas HEAD se establecerán en HEAD de la rama fusionada. Para resolver esto, busque el ID de compromiso al que desea volver y git reset --hard $COMMITID.

+0

Buena solución si no conoce la confirmación antes de la fusión. – iglesiasedd

2
git reset -m 1 88113a64a21bf8a51409ee2a1321442fd08db705 

pero puede tener UNEXP efectos secundarios ectivos. Consulte la opción --mainline parent-number en git-scm.com/docs/git-revert

Quizás una forma brutal pero efectiva sería verificar el padre izquierdo de esa confirmación, hacer una copia de todos los archivos, verificar HEAD nuevamente, y reemplazar todo el contenido con los viejos archivos. Entonces, git te dirá qué es lo que está retrocediendo y tú crearás tu propio commit de reversión :)!

+1

+1 porque esta respuesta no entra en conflicto con el historial, como lo hace el restablecimiento (realmente importante si ya lo presionó a distancia). Pero, ¿qué efectos secundarios inesperados debo esperar? – pedromanoel

+0

¿Es este el efecto secundario que mencionaste? 'Revertir una fusión declara que nunca querrá los cambios de árbol provocados por la fusión. Como resultado, las fusiones posteriores solo generarán cambios de árbol introducidos por confirmaciones que no son ancestros de la fusión revertida anteriormente. Esto puede ser o no lo que desea. – pedromanoel

22

A partir de aquí:

http://www.christianengvall.se/undo-pushed-merge-git/

git revert -m 1 <merge commit hash> 

Git Revert agrega un nuevo commit que revierte la confirmación especificada.

El uso de -m 1 indica que se trata de una fusión y queremos volver a la confirmación primaria en la rama principal. Utilizaría -m 2 para especificar la rama de desarrollo.

+6

Tenga en cuenta que no puede volver a fusionar la rama después de esto, como dice el documento: "Al revertir una fusión declara que nunca querrá los cambios de árbol generados por la fusión. como resultado, las fusiones posteriores solo generarán cambios en los árboles introducidos por confirmaciones que no son ancestros de la fusión previamente revertida. Esto puede ser o no lo que usted desea ". –

+1

@ DaliborKarlović Esa afirmación es un poco dura. Definitivamente puede volver a traer esos cambios más tarde, el truco es revertir el compromiso de revertir. Más información [aquí] (https://git-scm.com/blog/2010/03/02/undoing-merges.html) en la sección "Revertir la reversión" – Hilikus