インタラクティブなリベース中に 2 つのマージ コミットをまとめて押しつぶす簡単なソリューションが必要でした。
私のリポジトリは次のようになります。
X --- Y --------- M1 -------- M2 (my-feature)
/ / /
/ / /
a --- b --- c --- d --- e --- f (stable)
つまり、my-feature
最近 2 回マージされたブランチがあり、間に実際のコミットはありません。my-feature
ブランチは独自の公開ブランチであるため、ブランチをリベースするだけではなく、最後の 2 つのマージ コミットを 1 つにまとめたいだけです (これらのコミットはまだ公開していません)。
X --- Y ---- M (my-feature)
/ /
/ /
a --- ... -- f (stable)
私は試した:
git rebase -p -i M1^
しかし、私は得ました:
Refusing to squash a merge: M2
私が最終的にやったことは次のとおりです。
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
現在、新しいマージ コミットはマージ コミットとは見なされなくなりました (最初の親のみが保持されます)。そう:
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
しかし、コミットが多い場合、これは複雑になる可能性があります。より良い解決策はありますか? ありがとう。
ミルドレッド