在Git中排除分支中的某个提交

14

我有一个提交,存储在一个分支中,因为这个提交只需要在特定的盒子中。

我已将其合并到主分支,但没有合并到本地使用的开发分支dev。

现在,由于错误,我把主分支合并到了dev分支,这就将这个提交引入了dev分支。

我知道可以 git revert sha 到dev分支;但由于这将引入一个撤销该提交的提交(我猜测,我还没有确切地尝试过),当我合并主分支时,这个提交也会被撤销吗?

如果是这样的话,我该如何仅从dev分支中撤销此提交。

而且,git reset HEAD^1 --hard 不可行,因为在不需要的提交之后,主分支上还有其他提交。

如果回退再应用是唯一的选择,那么我该如何只将除不需要的提交以外的额外提交从主分支合并到dev分支。

更新:

这是提交树。看起来很复杂。我指出了在dev分支中不需要的提交。(我已经删除了任何个人身份信息,感谢理解。使用截图gitk比ascii艺术要简单得多。) alt text

提前感谢!


1
这能转成 ASCII 艺术吗?因为我不是很清楚合并提交与不想要的提交之间的关系。 - CB Bailey
在svn中,您可以合并版本的范围,例如1-19、49、52-90...我相信在git中也可以这样做。 - SeanJA
1
@SeanJA:我不确定将svn类比为答案的最佳方式。特别是对于git,如果你从A-B-C开始并删除B以获得A-C',那么提交C'与提交C不同,因为它们没有相同的父级。所以当然,你可以构建一个由原始提交组成的第二个分支,其中缺少所需的提交,然后合并它,但你不会合并原始分支。 - Cascabel
@Jerfromi 啊,我的错... 我还在学习我的 git-fu。 - SeanJA
好的,只是为了明确一下,您的正常工作流程是将dev合并到master而不是反过来吗?看起来一个简单的git reset --hard HEAD^将撤销错误的合并,然后就是解决如何在不拉取仅属于master的提交的情况下将所需更改传递到dev。由于这些基于master,可能需要使用cherry-pick。 - CB Bailey
Charles,是的,你说得对。谢谢。现在如果你能把它放在答案里,我就可以接受了。我想知道,如果cherry pick创建了一个“新提交”,那么将其应用两次会导致问题吗?比如,我先将dev合并到master,然后再次将其应用到master上。 - lprsd
2个回答

21

在您的分支上创建一个暂存副本,git rebase --interactive命令并删除不需要的提交。 或者,您可以在不需要的提交上游创建一个新分支,然后使用git cherry-pick命令将所需的提交复制到该分支上。

可能还有其他方法可以实现此目的。


2

如果要撤销错误操作,可以使用git reflog命令和git reset --hard命令。

为了在合并分支时避免单个提交,我在我的项目中刚刚使用了以下方法:

  • Assume: merge from branch B to head.
  • Identify revid of commit to be avoided (R0)
  • Identify revid of commit just prior to R0 (R1)

    git merge <R1>
    git merge -s ours R0
    git merge B
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接