如何在头之前的分支中还原多个更改,而所有更改都来自同一子分支?

时间:2019-03-11 15:07:16

标签: git atlassian-sourcetree

我有一个Sprint分支(Sprint1),由多个功能分支(从最新到最早列出)组成:

  • 功能4,提交#1
  • 功能3,提交#2
  • 功能3,提交#1
  • 功能2,提交#3
  • 功能2,提交#2
  • 功能2,提交#1
  • 功能1,提交#1

我想通过一个操作从功能#2的分支中删除Sprint分支中的所有内容。有办法吗?

实际上,我对功能2的提交有3个以上,并且不想被一个接一个地还原,以防万一我错过了提交。由于功能#3和#4是基于功能#2构建的,因此我将要解决很多合并冲突,现在需要保持独立。我只想拉出功能2并一次性解决所有合并冲突。

根据RomainValeri的要求,以下是从我的git log --oneline --decorate --simplify-by-decoration --all分支运行Sprint1的结果:

f12b0af (HEAD -> Sprint1) Merge of Feature #3 and Feature #4.
70c028b (Feature3) Feature #3, Commit #2
216764a (Feature4) Feature #4, Commit #1
060d98e (Feature2) Feature #2, Commit #3
2069da0 (Feature1) Feature#1 Commit #1
1d05fc0 (master) First Commit

1 个答案:

答案 0 :(得分:0)

让我们在这里假设名称:sprint代表sprint分支,而您尝试从feature2分支还原全部。

# next line was my first idea but probably no good
git rev-list $(git merge-base sprint feature2)..feature2

# since we have master as a ref for the merge-base, let's go simpler
git rev-list master..feature2

# or, if feature2 is branched of feature1 :
git rev-list feature1..feature2

将为您提供要还原的提交列表。

(如果您已经删除了feature2,只需在合并到sprint之前的提交时重新创建它,或从reflog中获取它)

然后,您可以在不提交的情况下进行链式还原,并在最后仅提交一次:

git revert -n <commit1>
git revert -n <commit2>
...
git commit -m "Revert of commits 1, 2, 3, ..."

但是我不会进一步自动化该过程,因为您可能必须一路解决冲突。