¿Hay alguna manera de rehacer una fusión en git?

17

Así que cometí un gran error. Hice un commit, lo saqué, lo fusioné (pero estropeé el código mientras lo hacía) y luego presioné. Me gustaría rehacer esa fusión y obtener el código correcto. ¿Hay alguna forma de hacer esto?

Yo uso bitbucket.


fuente
10
Solo una nota: esto es realmente sobre el tema en SO, y no debería haberse migrado. Intente leer sus propias páginas de ayuda en algún momento y observe las herramientas de software comúnmente utilizadas por la línea de programadores . Dicho esto, también es sobre el tema aquí: SwiftCore, no te sientas mal porque se migró, eso no fue tu culpa.
Bob

Respuestas:

13

No estoy seguro de si esta es la forma "bendecida" de hacerlo, pero esto es lo que hice para resolver el mismo problema sin tener que "forzar el empuje" o algo asqueroso.

Supongamos que su historial se ve así (y M es la combinación volteada):

-A--B--C--M (master points here)
  \      /
   D----E

Correr git checkout -b merge_fix <commit ID E>crea una rama antes de cometer errores:

-A--B--C--M (master points here)
  \      /
   D----E (HEAD and merge_fix point here)

Ahora, hagamos nuevamente la fusión en nuestra nueva sucursal. No podemos fusionarnos master, así que debemos elegir manualmente el commit antes de nuestra fusión incorrecta: git merge <commit ID C>¡No cometas los mismos errores que cometiste la última vez!

-A--B--C--M (master points here)
  \      X
   D----E-G (HEAD and merge_fix point here)

Suponiendo que la confirmación se Gve bien, ahora queremos sincronizarnos con la parte superior de la masterrama. Este comando le dice a git que ignore los cambios que se hicieron en master y que fuerce nuestros cambios a convertirse en el resultado de fusión:git merge -s ours master

-A--B--C--M (master points here)
  \      X  \
   D----E-G--H (HEAD and merge_fix point here)

Finalmente, (nuevamente asumiendo que commit se Hve bien, queremos avanzar rápidamente masterpara incluir nuestra fusión fija:

git checkout master
git merge merge_fix

Esto realmente solo mueve el masterpuntero de la rama H, pero aprovecharé la oportunidad para limpiar un poco mi arte ASCII:

-A--B--C--M--H (HEAD, master, and merge_fix all point here)
  \      X  /
   D----E--G

¡Y ahí lo tienes! ¡Has vuelto a hacer la fusión con éxito sin invalidar ningún historial!

mblythe
fuente
6

Puedes hacerlo así:

  1. Restablezca la confirmación antes de su fusión.
  2. Realice la fusión nuevamente
  3. Fuerza de empuje

Es decir:

git reset --hard SHA1
git merge branchname
git commit
git push --force remotename branchname

Solo tenga en cuenta que git push --forcereescribirá lo que tenga en la rama remota, y otras personas que usen esa rama también pueden verse afectadas. (Normalmente no deberías hacer esto).

janos
fuente
66
Solo recuerda que hacer git push --forceno es seguro
Zepplock
1

git merge --abort y luego puedes fusionarte de nuevo

Zepplock
fuente
Acabo de recibir el mensaje "no hay fusión para abortar"
3
Esto solo se puede hacer cuando hay conflictos de fusión.
chanchal118
¿Por qué el menos uno? Esto me ayudó.
swdev
Porque la pregunta es sobre cuándo ya terminó la fusión (incorrectamente) y presionó.
Robin Green el
-1

Por favor revisa esta esperanza, es útil para ti

https://www.kernel.org/pub/software/scm/git/docs/howto/revert-branch-rebase.html

fuente
Si bien esto puede responder la pregunta OP, las respuestas de solo enlace no se aceptan bien en SO. Sin embargo, puede citar en su respuesta extractos más relevantes del enlace.
Si bien este enlace puede responder la pregunta, es mejor incluir aquí las partes esenciales de la respuesta y proporcionar el enlace como referencia. Las respuestas de solo enlace pueden volverse inválidas si la página vinculada cambia.
Pranav 웃