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