Revertir una combinación después de haber sido empujada

80

Pasos que realicé:

Tengo dos ramas branch1 y branch2,

$git branch --Initial state
$branch1

$git checkout branch2
$git pull origin branch1 --Step1

Resolví los conflictos e hice un

$git commit -m "Merge resolved"

luego

$git checkout branch1
$git merge branch2
$git push origin branch1

Ahora me di cuenta de que mientras estaba en el paso 1, la fusión automática eliminó un código y se presionó el código de cambio, ahora quiero volver a mi estado inicial para revertir cualquier cambio. ¿Buscas ayuda inmediata?

Bijendra
fuente
¿Git revert no hace lo que quieres?
Frederick Cheung
1
da un mensaje como: fatal: Commit b4a758b36a5bde9311061fe7b56e4f47859de052 es una combinación pero no se dio la opción -m. @FrederickCheung
Bijendra
Consulte la opción manual about -m. kernel.org/pub/software/scm/git/docs/git-revert.html En breve, puede usar -m 1 o -m 2. Esto selecciona a cuál de las dos revisiones principales desea revertir.
Ilya Ivanov
yaa utilicé git revert -m 1 SHA, ahora todos los cambios vienen como cambios que se van a realizar en mi local,
Bijendra
Hubo un error en vim que salía mientras revertía la operación, ejecuté git config --global core.editor / usr / bin / vim y solucionó el problema y luego la reversión se ejecutó con éxito para solucionar el problema.Thanx
Bijendra

Respuestas:

95

Puede revertir la fusión siguiendo la guía oficial , sin embargo, esto deja a Git con la creencia errónea de que las confirmaciones fusionadas todavía están en la rama de destino.

Básicamente tienes que:

git revert -m 1 (Commit id of the merge commit)
aleroot
fuente
26
Hay que tener cuidado con el 1. Significa el firstpadre de merge commit. Pero si uno (hipotéticamente) 'por accidente' fusionó el maestro con la rama, luego el maestro reenvió rápidamente a la confirmación combinada, se debe usar -m 2para revertir la combinación en el maestro.
Krzysztof Jabłoński
1
Ten cuidado con eso 1. Echó a perder mi repositorio al revertir parcialmente la fusión, mientras que yo quería revertir la fusión por completo. ¡Terminé revirtiendo la reversión!
Javad Sadeqzadeh
1
@JavadSadeqzadeh o, arruinó su repositorio al copiar y pegar desde SO sin verificar completamente lo que hace la respuesta
joel
33

Intente usar git reflog <branch>para averiguar dónde estaba su rama antes de la fusión y git reset --hard <commit number>restaurar la revisión anterior.

Reflog le mostrará los estados más antiguos de la rama, por lo que puede devolverlo a cualquier conjunto de cambios que desee.

Asegúrese de estar en la rama correcta cuando use git reset

Para cambiar el historial del repositorio remoto, puede hacerlo git push -f, sin embargo, esto no se recomienda porque alguien ya puede haber descargado los cambios, impulsados ​​por usted.

Ilya Ivanov
fuente
1
había enviado el código a la rama remota, ¿cómo revertirá esto el código desde allí?
Bijendra
3
si ya presionó, NO desea reescribir la historia local, como lo describió Ilya
ms-tg
2
Lo siento, me perdí esa cosa ... A veces puedes usar git push -f para reescribir el historial remoto. Esto depende de la configuración de su repositorio remoto y de otros miembros del equipo (si no lo matan por ese empujón forzado).
Ilya Ivanov
8

La primera opción es el uso de git revert.

git revert -m 1 [sha-commit-before-merge]

El git revertva a revertir los cambios, pero mantendrá la historia. Por lo tanto, no podrá seguir trabajando en la misma rama, ya que ya no podrá ver la diferencia real entre la rama fusionada y la rama de su función. Utilice la siguiente forma para eliminar también el historial. Haga esto con mucho cuidado si y solo si es el único que está presionando cambios en la rama en este momento.

git reset --hard [sha-commit-before-merge]
git push [origin] [branch] --force
Asanka sanjaya
fuente
1

En mi caso, fusioné mi rama (digamos: my-branch) con otra rama de función (feature-branch) pero no master. Entonces, el historial de mi sucursal fue así:

my-branch (before merge)

---master----m1----m2----m3---m4

Después de fusionarlo con otro feature-branchque tenía confirmaciones f1, f2sobre el maestro, se volvió así:

my-branch (after merge)

---master----m1----m2----f1----f2----m3---m4----mergecommit

Esto podría haber sucedido porque mientras trabajaba en mi rama hice una fusión desde la maestra después de 2 confirmaciones, o una de las 2 ramas podría no haber estado actualizada con la maestra. Entonces, en este caso git revert -m 1no estaba funcionando, ya que dejaba esos f1y se f2compromete en el medio.

La solución fue simple, que funcionará en el caso de escenarios normales, donde no tenemos confirmaciones intermedias:

git rebase -i HEAD~6

En lugar de 6, utilice el número apropiado según la cantidad de confirmaciones pasadas que desee cambiar. Ahora que el editor de Vim está abierto, simplemente marque las confirmaciones no deseadas como dropiguales y salga usando el :wq registro de verificación:

git log --oneline 

empujar la fuerza

git push -f

Ahora la rama remota debería estar en estado anterior.

Rahul R.
fuente