Nota: Debería no cambiar las confirmaciones que se han enviado a otro repositorio de cualquier manera a menos que conozca el consequences.
git log --oneline -4
D commit_message_for_D
C commit_message_for_C
B commit_message_for_B
A commit_message_for_A
git rebase --interactive
pick D commit_message_for_D
pick C commit_message_for_C
pick B commit_message_for_B
pick A commit_message_for_A
Tipo i
(VIM Poner en modo de inserción)
Cambiar la lista para el siguiente aspecto (Usted no tiene que quitar o incluir el mensaje de confirmación). ¡No escriba mal squash
!:
pick C commit_message_for_C
pick B commit_message_for_B
pick A commit_message_for_A
squash D
Tipo Esc continuación ZZ
(Guardar y salir VIM)
# This is a combination of 2 commits.
# The first commit's message is:
commit_message_for_D
# This is the 2nd commit message:
commit_message_for_A
Tipo i
cambiar el texto a lo que quiere el nuevo mensaje de registro para que parezca.Recomiendo esto sea una descripción de los cambios en cometer A
y D
:
new_commit_message_for_A_and_D
Tipo Esc continuación ZZ
git log --oneline -4
E new_commit_message_for_A_and_D
C commit_message_for_C
B commit_message_for_B
git show E
(You should see a diff showing a combination of changes from A and D)
Ha creado una nueva confirmación E
. Los commits A
y D
ya no están en su historial, pero no desaparecen. Todavía puede recuperarlos en este momento y por un tiempo por git rebase --hard D
(git rebase --hard
destruirá cualquier cambio local!).
Inicialmente, lo leí como "rebase D en A, squash D en A, luego rebase B en DA". La respuesta no deja claro que esto se puede hacer reordenando líneas en un editor de texto. –