web-dev-qa-db-ja.com

ブランチ全体を別のブランチの状態にリセット/元に戻しますか?

ブランチ[〜#〜] a [〜#〜]とブランチ[〜#〜] b [〜#〜](およびその他のブランチ)があります。

[〜#〜] a [〜#〜]のコミット履歴は次のようになります。

  • コミット5
  • コミット4
  • コミット3
  • ...

そして[〜#〜] b [〜#〜]のコミット履歴:

  • その他のコミット
  • コミット4
  • ブランチからの他のもののマージ[〜#〜] c [〜#〜](ブランチへ[〜#〜] b [〜#〜]
  • コミット3
  • ...

基本的に私が欲しいのは、コミットによって行われたすべての変更を "削除"することです他のコミットおよびブランチCから他のアイテムのマージブランチ[〜#〜 ] b [〜#〜]

ブランチの作業ツリー[〜#〜] b [〜#〜]をブランチと同じにしたい[〜#〜] a [〜#〜]の作業ツリー。

どうすればこれを達成できますか?

16
daniel451

これを実現する1つの方法は、git resetを使用することです。ブランチにいる間B実行

git reset --hard A

その後、ブランチBAのヘッドコミットを指します。 --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

最初の提案以外では、これはインデックスと作業ツリーをそのままにしておきます。

22

ブランチ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
12
pratZ

完成させるために、これを達成するための非常に簡単な方法を追加しましょう:

git branch -f branchB branchA

Gitのブランチは単なるポインタであるという事実を利用しています。このコマンドは、あるブランチのティップコミットへの参照を別のブランチに置き換えるだけです。すでに持っているものを構築するために複雑な構造変更に入る必要はありません。

3
RomainValeri