Quería tener una solución simple para aplastar dos commit de fusión juntos durante una rebase interactiva.git rebase interactive: squash merge commits together
Mi repositorio parece:
X --- Y --------- M1 -------- M2 (my-feature)
/ / /
/ / /
a --- b --- c --- d --- e --- f (stable)
Es decir, que tienen una rama my-feature
que se ha fusionado dos veces recientemente, sin verdadera compromete en el medio. Yo no sólo quiero rebase la rama my-feature
ya que es una rama publicada en sí mismo, sólo quiero aplastar juntos los dos última combinación se compromete en una (no se han publicado todavía esas confirmaciones)
X --- Y ---- M (my-feature)
/ /
/ /
a --- ... -- f (stable)
probé:
git rebase -p -i M1^
Pero tengo:
Refusing to squash a merge: M2
Lo que finalmente hice es:
git checkout my-feature
git reset --soft HEAD^ # remove the last commit (M2) but keep the changes in the index
git commit -m toto # redo the commit M2, this time it is not a merge commit
git rebase -p -i M1^ # do the rebase and squash the last commit
git diff M2 HEAD # test the commits are the same
Ahora, la nueva confirmación de fusión ya no se considera una obligación de fusión (solo mantuvo el primer padre). Entonces:
git reset --soft HEAD^ # get ready to modify the commit
git stash # put away the index
git merge -s ours --no-commit stable # regenerate merge information (the second parent)
git stash apply # get the index back with the real merge in it
git commit -a # commit your merge
git diff M2 HEAD # test that you have the same commit again
Pero esto puede ser complicado si tengo muchos compromisos, ¿tiene una mejor solución? Gracias.
Mildred
Bueno, cuando haz tu segunda fusión, siempre puedes usar '--squash' para evitar crear una confirmación, y luego usar' git commit --amend' para modificar la combinación anterior. – Mildred
Esto no funcionará, no guardará la nueva versión de la rama de la que se fusionó en la confirmación – Mildred