Reset/revert a whole branch to another branches state?

最后都变了- 提交于 2019-12-20 17:36:50

问题


I have a branch A and a branch B (and some other branches).

Lets say A's commit history looks like:

  • commit 5
  • commit 4
  • commit 3
  • ...

And B's commit history:

  • some other commit
  • commit 4
  • merge of other stuff from branch C (into branch B)
  • commit 3
  • ...

Basically what I want is to "delete" all changes made by the commits some other commit and merge of other stuff from branch C to branch B.

I want the working tree of branch B to be exactly the same like branch A's working tree.

How do I achieve this?


回答1:


One way to achieve this is through git reset. While on branch B execute

git reset --hard A

Thereafter, branch B points to the head-commit of A. The --hard option resets the index and working tree so that all tracked files are reset to the version in branch A. The old HEAD commit-ID of A is stored in .git/ORIG_HEAD in order to allow undoing the change.

Alternatively - while not on branch B - you can delete branch B and re-created it like this:

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

Other than the first suggestion, this will leave the index and working tree untouched.




回答2:


If you want your branch B to look exactly like branch A. You could just do a reset --hard

git checkout branch-B

git reset --hard branch-A

Be careful you will lose commits in this case. Your branch-B will look exactly like branch-A, whatever commits were made to branch-B, that were not present in branch-A, will be lost. Also if branch-B is shared with other people, its not recommended to perform this operation.

In that case you could try reverting the commits you don't want in branch-B

git revert <sha-of-"some other commit">
git revert <sha-of-"merge of other stuff from branch C (into branch B)"> 

The second commit looks like a merge commit so you might have to pass the parent as well.

 git revert <sha-of-"merge of other stuff from branch C (into branch B)"> -m1



回答3:


For completion, let's add this very simple way to achieve it :

git branch -f branchB branchA

It takes advantage of the fact that branches in git are mere pointers. This command just replaces the ref to the tip commit of one branch with another. No need to go into complex structure changes to build something you already have.



来源:https://stackoverflow.com/questions/28774194/reset-revert-a-whole-branch-to-another-branches-state

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!