
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 G
se vea bien, ahora queremos sincronizarlo con la parte superior de la master
rama. 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 H
se vea bien, queremos avanzar rápidamente master
para incluir nuestra combinación fija:
git checkout master
git merge merge_fix
En realidad, esto solo mueve el master
puntero 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í:
- Restablezca la confirmación antes de su fusión.
- Realizar la fusión nuevamente
- 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 --force
reescribirá 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)
redo-branch
debe fusionarse completamente Y
después de la fusiónredo-branch
se han producidono hay otras fusionesredo-branch
debe fusionarse completamente Y
después de la fusiónredo-branch
ya ha habidootras fusiones, eso debe mantenerseredo-branch
es 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)
- deberías estar bien con la soluciónhttps://superuser.com/a/691497/308385
- La misma solución que 1 podría funcionar.
- 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