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?
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!
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).
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.
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):
Correr
git checkout -b merge_fix <commit ID E>
crea una rama antes de cometer errores: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!Suponiendo que la confirmación se
G
ve bien, ahora queremos sincronizarnos con la parte superior de lamaster
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
Finalmente, (nuevamente asumiendo que commit se
H
ve bien, queremos avanzar rápidamentemaster
para incluir nuestra fusión fija:Esto realmente solo mueve el
master
puntero de la ramaH
, pero aprovecharé la oportunidad para limpiar un poco mi arte ASCII:¡Y ahí lo tienes! ¡Has vuelto a hacer la fusión con éxito sin invalidar ningún historial!
fuente
Puedes hacerlo así:
Es decir:
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).fuente
git push --force
no es segurogit merge --abort
y luego puedes fusionarte de nuevofuente
Por favor revisa esta esperanza, es útil para ti
fuente