在 git revert 后,合并显示没有更改且已经更新。

14

我有一个dev分支,它已经与featureAfeatureB合并。我将该dev分支合并到master并推送到远程仓库。后来我发现featureB还没有准备好与master合并,因为存在错误的提交。所以我撤销了dev--> master的合并。

git revert -m 1 <merge-commit-hash>
我试图将featureA合并到master,但无法合并,会提示Already up to date。由于合并后撤销的影响,唯一的解决方案是revert the revert commit,以便再次将dev分支合并到master中。如果您只想合并featureA分支,可以使用以下命令:git cherry-pick <commit-hash>,其中<commit-hash>是包含featureA更改的提交哈希值。

2
相同的问题,任何地方都找不到答案。 - Slbox
1个回答

2
不应该将整个`develop`合并到`master`的回滚操作,而应该仅回滚一个特定分支。在您的情况下,应回滚`featureB`到`develop`的合并。
如果您的回滚无法撤消,则最简单的解决方案是将其还原,然后仅回滚`featureB`到`develop`的合并。否则,建议取消初始回滚并按照以下说明操作。
根据描述,让我们画出发生的情况:
  master   a------------------M3
            \                /    
     dev     b-------M1-----M2
             |\     /      /
featureA     | c---d      /
              \          /
featureB       e--------f

这里的M3是您要撤销的合并提交:

git checkout master
git revert -m 1 <M3-commit-hash>

如果您按照所述的完全操作,使用上述命令将回滚整个 devmaster 合并提交 M3,这将产生还原提交并将其放置在时间轴上 M3 之后:
  master   a------------------M3---rvM3
            \                /    
     dev     b-------M1-----M2
             |\     /      /
featureA     | c---d      /
              \          /
featureB       e--------f

这里的rvM3是整个dev分支合并的还原提交。

然后您要执行以下操作:

git checkout master
git merge featureA

现在让我们想象一下预期结果的画面:

  master   a------------------M3---rvM3---(M4)
            \                /            /
     dev     b-------M1-----M2           /
             |\     /      /            /
featureA     | c---d----- / -----------         
              \          /          
featureB       e--------f

如果仔细观察上一个视图,我们可以发现featureA分支的cd提交已经在M3合并后成为master分支的一部分,并且它们可以通过父链接从M3访问。
你可能期望从featureA创建带有提交的M4,但实际上不会发生这种情况,因为对于Git来说,从提交的角度来看,featureA分支中没有新内容需要添加到master中,因为之前已经合并过了。Git只关心提交本身,而不关心更改本身以及它们在未来提交中发生了什么。
考虑到这一点,我们可以得出一个简单的解决方案——你真正需要的不是撤销整个M3合并,而是仅撤销M2,并将具有M1索引的分支作为还原目标进行合并。
git checkout master
git revert -m 1 <M2-commit-hash>

这将完全实现您想要的,最终您将得到类似于这样的结果:

  master   a------------------M3---rvM2
            \                /    
     dev     b-------M1-----M2
             |\     /      /
featureA     | c---d      /
              \          /          
featureB       e--------f

rvM2 存储了来自 M2 的更改,抛弃了来自 ef 提交的更改。

通常情况下,每次想要还原某些内容时,尽可能具体是最好的。例如,如果我们想要还原一个提交,我们需要仅对其执行还原,而不是保留它的整个分支;如果我们想要还原一个特定的分支,则不应该还原多个分支的组合合并,就像您最初在 M3 中所做的那样。


你手动打的那个分支图吗?如果不是,能否分享一下你使用的工具呢?谢谢 :) - marlo
2
我打的 :) - mmelnik

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