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.
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.
Respuestas:
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 G
ve bien, ahora queremos sincronizarnos con la parte superior de la master
rama. 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 H
ve bien, queremos avanzar rápidamente master
para incluir nuestra fusión fija:
git checkout master
git merge merge_fix
Esto realmente solo mueve el master
puntero 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!
Puedes hacerlo así:
Es decir:
git reset --hard SHA1
git merge branchname
git commit
git push --force remotename branchname
Solo tenga en cuenta que git push --force
reescribirá 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).
git push --force
no es seguro
git merge --abort
y luego puedes fusionarte de nuevo
Por favor revisa esta esperanza, es útil para ti
https://www.kernel.org/pub/software/scm/git/docs/howto/revert-branch-rebase.html