私のGit履歴は次のようになります。
紫色のコミットを1つにまとめたいと思います。私はコミットログでそれらを二度と見たくありません。
git rebase -i 1
を実行しようとしましたが、1
が青いブランチ(図を参照)にあるにもかかわらず、紫色のブランチですべてのコミットが表示されます。
(コミットログから)紫色のブランチを完全に削除するにはどうすればよいですか?
git rebase -i <sha before the branches diverged>
を実行すると、マージコミットを削除できるようになり、ログは必要に応じて1行になります。不要になったコミットを削除することもできます。リベースが機能しなかった理由は、十分に戻っていないためです。
警告:これを行っている履歴を書き換えています。これをリモートリポジトリにプッシュされた変更で行うと、問題が発生します。ローカルのコミットでのみこれを行うことをお勧めします。
元の状態のリポジトリから開始
マージコミットを削除し、メインラインでブランチを単一のコミットに押しつぶすには
これらのコマンドを使用します(5と1を対応するコミットのSHAに置き換えます):
git checkout 5
git reset --soft 1
git commit --amend -m '1 2 3 4 5'
git rebase HEAD master
マージコミットを保持し、ブランチコミットを1つにまとめるには:
次のコマンドを使用します(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
マージコミットを削除し、ブランチからの個々のコミットに置き換えるには
ただ(5を対応するコミットのSHAに置き換える):
git rebase 5 master
そして最後に、ブランチを完全に削除するために
次のコマンドを使用します(CとDを対応するコミットのSHAに置き換えます):
git rebase --onto C D~ master
あなたが望むものに基づいてこれに取り組むには2つの方法があります:
ソリューション1:紫色のコミットを削除し、履歴を保持します(ロールバックしたい場合)
git revert -m 1 <SHA of merge>
-m 1
は、選択する親行を指定します
パープルコミットは履歴に残りますが、元に戻したため、それらのコミットのコードは表示されません。
ソリューション2:パープルコミットを完全に削除します(リポジトリが共有されている場合は破壊的な変更)
git rebase -i <SHA before branching out>
紫色のコミットに対応する削除(行の削除)。
マージ後にコミットが行われない場合、これはそれほど難しくありません。追加のコミットは、revert/rebase
中に競合の可能性を高めます。
マージコミット(2)を削除して、発生したことがないようにする場合、コマンドは次のようになります。
git rebase --onto <sha of 1> <sha of 2> <blue branch>
そして今、紫色のブランチは青色のコミットログにまったくありません。また、2つの別個のブランチがあります。その後、パープルを個別に押しつぶし、マージコミットを行わずに他の必要な操作を実行できます。