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

3phpmpom  于 2022-12-10  发布在  Git
关注(0)|答案(2)|浏览(415)

我有一个dev分支,它已经与分支featureAfeatureB合并了。我将那个dev分支合并到master并推到remote。后来我发现featureB还没有准备好与master合并,因为有一个错误提交。所以我恢复了dev--〉master的合并。

git revert -m 1 <merge-commit-hash>

然后我尝试将featureA合并到master。但是我不能合并。它将显示Already up to date
我知道莱纳斯·托瓦兹所说的原因,
莱纳斯说明了情况:
恢复一个常规提交只会有效地撤销该提交所做的事情,并且相当简单。但是恢复一个合并提交也会撤销提交所更改的 * 数据 *,但是它对合并所带来的 * 历史 * 影响完全没有影响。
因此,合并仍然存在,它仍然被视为将两个分支连接在一起,未来的合并将把该合并视为最后一个共享状态--而恢复合并的revert将完全不影响这一点。
因此,“revert”会撤消数据更改,但它并不撤消提交对存储库历史的影响,因此它 * 不是 *“undo”。
因此,如果你把“revert”理解为“undo”,那么你将永远错过reverts的这一部分。是的,它会撤销数据,但不,它不会撤销历史。
在这种情况下,将dev再次合并到master的唯一解决方案是revert the revert commit。但我只想合并dev分支中包含的一个分支,即featureA
如何将分支(featureA)合并到主线分支(master),该分支包含在已还原的合并分支(dev)中?

ifmq2ha2

ifmq2ha21#

您不应该在这里将整个develop还原为master合并,而应该将1特定分支还原。在您的情况下,应该将featureB还原为develop合并。

如果您的还原无法复原,最简单的解决方案是将它还原回去,并执行featureBdevelop的新还原(仅合并)。否则,我建议您移除初始还原,并遵循下列说明。

让我们根据描述画出这里发生的事情:

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的revert,这将产生revert提交,并将它放在时间轴中的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的提交cdM3合并后已经是master分支的一部分,并且它们可以通过父链接从M3访问
您可能希望创建带有来自featureA的提交的M4,但这并没有发生,因为到Git没有从featureA分支添加到master的新内容(从提交的Angular ),因为它已经在之前合并。它不事实上,来自featureA的代码更改不再出现在master中,这并不重要,因为Git只关心提交,而不关心更改本身,也不关心它们在未来的提交中会发生什么。
考虑到这一点,我们可以得出一个简单的解决方案-您真正需要的不是整个M3合并的还原,而是仅M2的还原,并挑选具有M1的分支作为合并提交的还原目标(假设它在命令中的索引为1):

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提交的改变。
一般来说,每次我们想要还原某个东西的时候,最好尽可能具体。也就是说,如果我们想要还原1个提交,我们只需要为它执行revert,而不是为保存它的整个分支执行revert,如果我们想要还原1个特定的分支-我们不应该还原几个分支的复合合并,就像你最初在M3中所做的那样。

pn9klfpd

pn9klfpd2#

一般来说,我尽量避免回复,因为根据我的经验,它们会导致混乱,有时我最终会决定选择樱桃。
我将在dev分支中恢复feature B的合并,然后将dev合并到master,而不是将合并恢复到master。
我不确定git现在是否允许你这样做。你可能需要在master中恢复revert。

相关问题