web-dev-qa-db-ja.com

再度マージを実行する必要なく、マージをリベースに変換します

私は間違えました:git pull --rebase、しかし私は簡単なgit pull、すべてをマージし、ブランチのHEAD)でマージコミットしました。

そのマージコミットを取り除きたいので、git rebase -i HEAD~3、最後のローカルコミットを一番上に移動し、マージコミットをその中に押し込みます。残念ながら、マージコミットはスカッシュには使用できません。これを行うと、マージを再度行う必要がある中間状態に入ります。これはlotの作業です。

再度マージを実行する必要なしにこれを回避する方法はありますか?マージコミットを何らかの方法で使用することが可能であるように思われますか?

23
Confusion

tl; dr

マージコミットをリベースに含めることができても、マージコミットをスカッシュすることはできません。 Gitは次のように言って通知します。

マージのスカッシュを拒否:<SHA-1>

マージ中に行われた変更を保持するためにできることは、マージコミットを通常のコミットに変換することです。その時点で、他のコミットと同じように、つぶすことができます。

HEADがマージコミットを指していると仮定します。

git reset --soft HEAD~1  # Keeps changes in the index
git commit               # Create a new commit, this time not a merge commit
git rebase -i HEAD~4     # Do an interactive rebase and squash the new commit

リベース中にマージコミットを保持する

一般に、git rebase -pを使用してリベースを行う場合、マージコミットを保持できます。
ただし、その目的は、マージに至るまでのコミットを再生することです。マージコミット自体の一部である変更(競合解決など)は保持されません。

documentation からの抜粋:

-p
-preserve-merges
マージコミットが導入するコミットを再生して履歴を平坦化する代わりに、マージコミットを再作成します。マージ競合解決またはマージコミットの手動修正は保持されません。
これは--interactive機構を内部で使用しますが、--interactiveオプションと明示的に組み合わせることは、何をしているのかを理解していない限り、一般に良い考えではありません(以下のバグを参照)。

ドキュメントが参照している bug は、コミットの並べ替えによってトリガーされます。

26