web-dev-qa-db-ja.com

gitは履歴からマージコミットを削除します

私のGit履歴は次のようになります。

Git history

紫色のコミットを1つにまとめたいと思います。私はコミットログでそれらを二度と見たくありません。

git rebase -i 1を実行しようとしましたが、1が青いブランチ(図を参照)にあるにもかかわらず、紫色のブランチですべてのコミットが表示されます。

(コミットログから)紫色のブランチを完全に削除するにはどうすればよいですか?

66
Benjamin Toueg

git rebase -i <sha before the branches diverged>を実行すると、マージコミットを削除できるようになり、ログは必要に応じて1行になります。不要になったコミットを削除することもできます。リベースが機能しなかった理由は、十分に戻っていないためです。

警告:これを行っている履歴を書き換えています。これをリモートリポジトリにプッシュされた変更で行うと、問題が発生します。ローカルのコミットでのみこれを行うことをお勧めします。

82
Schleis

元の状態のリポジトリから開始

Original repo history

マージコミットを削除し、メインラインでブランチを単一のコミットに押しつぶすには

Squashed commits, no merge commit

これらのコマンドを使用します(5と1を対応するコミットのSHAに置き換えます):

git checkout 5
git reset --soft 1
git commit --amend -m '1 2 3 4 5'
git rebase HEAD master

マージコミットを保持し、ブランチコミットを1つにまとめるには:

Squashed commits, retained merge commit

次のコマンドを使用します(5、1、およびCを対応するコミットのSHAに置き換えます)。

git checkout -b tempbranch 5
git reset --soft 1
git commit --amend -m '1 2 3 4 5'
git checkout C
git merge --no-ff tempbranch
git rebase HEAD master

マージコミットを削除し、ブランチからの個々のコミットに置き換えるには

Branch moved into mainline, no merge commit

ただ(5を対応するコミットのSHAに置き換える):

git rebase 5 master

そして最後に、ブランチを完全に削除するために

Branch removed entirely

次のコマンドを使用します(CとDを対応するコミットのSHAに置き換えます):

git rebase --onto C D~ master
44
Allen Luce

あなたが望むものに基づいてこれに取り組むには2つの方法があります:

ソリューション1:紫色のコミットを削除し、履歴を保持します(ロールバックしたい場合)

git revert -m 1 <SHA of merge>

-m 1は、選択する親行を指定します

パープルコミットは履歴に残りますが、元に戻したため、それらのコミットのコードは表示されません。


ソリューション2:パープルコミットを完全に削除します(リポジトリが共有されている場合は破壊的な変更)

git rebase -i <SHA before branching out>

紫色のコミットに対応する削除(行の削除)。

マージ後にコミットが行われない場合、これはそれほど難しくありません。追加のコミットは、revert/rebase中に競合の可能性を高めます。

13
prem

マージコミットを削除するには

マージコミット(2)を削除して、発生したことがないようにする場合、コマンドは次のようになります。

git rebase --onto <sha of 1> <sha of 2> <blue branch>

そして今、紫色のブランチは青色のコミットログにまったくありません。また、2つの別個のブランチがあります。その後、パープルを個別に押しつぶし、マージコミットを行わずに他の必要な操作を実行できます。

8
Warren