¿Cómo puedo editar el post de una confirmación fusionada en Git?

Al explorar el historial de mi repository de Git, encontré un post de confirmación incorrecto. ¿Cómo puedo cambiar el post de confirmación?

La twig que contiene la confirmación se ha fusionado con otra twig. Aquí está la historia de un repository de model simplificado:

* (HEAD, A) Merge branch 'B' into A |\ | * (B) 3rd | * 2nd [wrong] |/ * (master) 1st 

Intenté rebase , pero no funcionó como se esperaba:

 $ git checkout B $ git rebase -i HEAD~2 edit 2nd [wrong] pick 3rd $ git commit –-amend 2nd [correct] $ git rebase --continue 

El resultado fue:

 * (HEAD, B) 3rd * 2nd [correct] | * (A) Merge branch 'B' into A | |\ |/ / | * 3rd | * 2nd [wrong] |/ * (master) 1st 

El resultado deseado es:

 * (HEAD, A) Merge branch 'B' into A |\ | * (B) 3rd | * 2nd [correct] |/ * (master) 1st 

git filter-branch si realmente lo necesitas. Recuerde que obtendrá un 2nd commit commit graph upper 2nd commit, y todos sus usuarios deberán volver a searchlo.

El command que necesita se ve así (reemplace <BAD COMMIT ID> con sha1 real de la confirmación incorrecta):

 git filter-branch --msg-filter ' if test "$GIT_COMMIT" = <BAD_COMMIT_ID>; then cat <<EOF This is a fixed commit message summary This is a body EOF else cat; fi' 

Inspeccione cuidadosamente los resultados con gitk --all . El gráfico anterior de commit git se guarda bajo el original/ prefijo y se puede restaurar si lo necesita.

Aquí lo que obtuve en un simple ejemplo:

 alex@rhyme ~/tmp/git_repo $ git log --graph --oneline --all * 3397c0e Merge 'B' into 'A' |\ | * 706c199 The third commit | * c777ae4 The second commit |/ * 69e2e53 Initial commit 

master está en 69e2e53, B en 706c199, A en 3397c0e.

Después del command

 alex@rhyme ~/tmp/git_repo $ git filter-branch --msg-filter ' if test "$GIT_COMMIT" = c777ae4b35f07f5cebcde93d4c716bfca9fdea94; then cat <<EOF This is a fixed commit message summary This is a body EOF else cat; fi' AB Rewrite 3397c0e62f155d6273186a2120667517e60519dd (4/4) Ref 'refs/heads/A' was rewritten Ref 'refs/heads/B' was rewritten alex@rhyme ~/tmp/git_repo $ _ 

Tengo la siguiente foto:

 * 5e1db15 Merge 'B' into 'A' |\ | * d238654 The third commit | * 2f0fb9f This is a fixed commit message summary |/ | * 3397c0e Merge 'B' into 'A' | |\ |/ / | * 706c199 The third commit | * c777ae4 The second commit |/ * 69e2e53 Initial commit 

con el siguiente layout de twigs:

  1. master dejado intacto
  2. A reescritura a 5e1db15
  3. B reescrito a d238654
  4. 3397c0e (anterior A ) guardado como original/refs/heads/A
  5. 706c199 (anterior B ) guardado como original/refs/heads/B

Observe que se compromete a qué punto A y B cambiarán en cualquier caso porque se modificó su compromiso principal. Es por eso que obtienes un duplicado de tu gráfico de compromiso original. Cuando se asegura de que las twigs se modifiquen correctamente, puede eliminar las twigs original/*