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

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

Entonces cometí un error bastante grande. Hice una confirmación, la saqué, la fusioné (pero estropeé el código al hacerlo) y luego presioné. Me gustaría rehacer esa combinación y obtener el código correcto. ¿Hay alguna manera de hacer esto?

Yo uso bitbucket.

Respuesta1

No estoy seguro de si esta es la forma "bendita" de hacerlo, pero esto es lo que hice para resolver el mismo problema sin tener que "forzar el empuje" ni nada asqueroso por el estilo.

Supongamos que su historial se parece a esto (y M es la combinación fallida):

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

La ejecución git checkout -b merge_fix <commit ID E>crea una rama antes de que cometamos algún error:

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

Ahora, rehagamos la fusión en nuestra nueva rama. No podemos simplemente fusionarnos master, por lo que debemos seleccionar manualmente la confirmación antes de nuestra mala fusión: ¡ 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 el compromiso Gse vea bien, ahora queremos sincronizarlo con la parte superior de la masterrama. Este comando le dice a git que ignore los cambios que se realizaron en master y fuerce nuestros cambios para que se conviertan en el resultado de la 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, (suponiendo nuevamente que el compromiso Hse vea bien, queremos avanzar rápidamente masterpara incluir nuestra combinación fija:

git checkout master
git merge merge_fix

En realidad, esto solo mueve el masterpuntero de la rama a 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 rehecho exitosamente la fusión sin invalidar ningún historial!

Respuesta2

Puedes hacerlo, así:

  1. Restablezca la confirmación antes de su fusión.
  2. Realizar la fusión nuevamente
  3. Empuje forzado

Eso es:

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

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

Respuesta3

git merge --abort y luego puedes fusionarte de nuevo

Respuesta4

Tenía una configuración diferente, algo más complicada.

Básicamente, hay tres puntos de partida: (y todas las otras soluciones suponen 1 o 2)

  1. redo-branchdebe fusionarse completamente Y
    después de la fusión redo-branchse han producidono hay otras fusiones
  2. redo-branchdebe fusionarse completamente Y
    después de la fusión redo-branchya ha habidootras fusiones, eso debe mantenerse
  3. redo-branches unrama longevafusionarse repetidamente Y
    sólo una gama de revisióneraparte de la fusionY
    ha habidootras confirmaciones/fusiones en masterdespués de la fusión fallida (Ay)

una configuración para (3) sería

---A--B--C--M   (master points here)
  /        /
-X--D-----E--Y  (that's the long-living redo-branch)
  1. deberías estar bien con la soluciónhttps://superuser.com/a/691497/308385
  2. La misma solución que 1 podría funcionar.
  3. empecemos :-)
# let's start on the last commit before the failed merge
git checkout redo-branch
git checkout -b D^1 new-branch-for-merge

# now let's pick all the revisions D through E
git cherry-pick D^1..E

# go to the target branch (master) and merge
git checkout master
git merge new-branch-for-merge

información relacionada