ブランチ[〜#〜] a [〜#〜]とブランチ[〜#〜] b [〜#〜](およびその他のブランチ)があります。
[〜#〜] a [〜#〜]のコミット履歴は次のようになります。
そして[〜#〜] b [〜#〜]のコミット履歴:
基本的に私が欲しいのは、コミットによって行われたすべての変更を "削除"することです他のコミットおよびブランチCから他のアイテムのマージブランチ[〜#〜 ] b [〜#〜]。
ブランチの作業ツリー[〜#〜] b [〜#〜]をブランチと同じにしたい[〜#〜] a [〜#〜]の作業ツリー。
どうすればこれを達成できますか?
これを実現する1つの方法は、git reset
を使用することです。ブランチにいる間B
実行
git reset --hard A
その後、ブランチB
はA
のヘッドコミットを指します。 --hard
オプションはインデックスと作業ツリーをリセットし、追跡されたすべてのファイルがブランチA
のバージョンにリセットされるようにします。変更を元に戻すことができるように、古い[HEADコミットID of A
]は.git/ORIG_HEAD
に保存されています。
または、ブランチB
を使用していないときに、ブランチB
を削除して、次のように再作成できます。
git branch -d B # delete branch B
git branch B A # re-create branch B and let it point to the commit of branch A
最初の提案以外では、これはインデックスと作業ツリーをそのままにしておきます。
ブランチB
をブランチA
とまったく同じようにしたい場合。 reset --hard
git checkout branch-B
git reset --hard branch-A
この場合、コミットが失われることに注意してください。ブランチBはブランチAとまったく同じように見えます。ブランチBに対して行われたコミットで、ブランチAになかったものはすべてlostになります。また、ブランチBが他のユーザーと共有されている場合、この操作を実行することはお勧めしません。
その場合、ブランチBで不要なコミットを元に戻すことができます
git revert <sha-of-"some other commit">
git revert <sha-of-"merge of other stuff from branch C (into branch B)">
2番目のコミットはマージコミットのように見えるため、親も渡す必要がある場合があります。
git revert <sha-of-"merge of other stuff from branch C (into branch B)"> -m1
完成させるために、これを達成するための非常に簡単な方法を追加しましょう:
git branch -f branchB branchA
Gitのブランチは単なるポインタであるという事実を利用しています。このコマンドは、あるブランチのティップコミットへの参照を別のブランチに置き換えるだけです。すでに持っているものを構築するために複雑な構造変更に入る必要はありません。