我有一个dev
分支,它已经与分支featureA
和featureB
合并了。我将那个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
)中?
2条答案
按热度按时间ifmq2ha21#
您不应该在这里将整个
develop
还原为master
合并,而应该将1特定分支还原。在您的情况下,应该将featureB
还原为develop
合并。如果您的还原无法复原,最简单的解决方案是将它还原回去,并执行
featureB
到develop
的新还原(仅合并)。否则,我建议您移除初始还原,并遵循下列说明。让我们根据描述画出这里发生的事情:
这里,
M3
是您试图通过以下方式恢复合并提交:如果你完全按照你说的做了,通过上面的命令,你做了整个
dev
到master
合并提交M3
的revert,这将产生revert提交,并将它放在时间轴中的M3
之后:其中
rvM3
是整个dev
分支合并的还原提交。然后您尝试执行:
现在让我们想象一下预期结果的图景:
如果仔细查看最后一个视图,我们可以发现来自
featureA
的提交c
和d
在M3
合并后已经是master
分支的一部分,并且它们可以通过父链接从M3
访问。您可能希望创建带有来自
featureA
的提交的M4
,但这并没有发生,因为到Git没有从featureA
分支添加到master
的新内容(从提交的Angular ),因为它已经在之前合并。它不事实上,来自featureA
的代码更改不再出现在master
中,这并不重要,因为Git只关心提交,而不关心更改本身,也不关心它们在未来的提交中会发生什么。考虑到这一点,我们可以得出一个简单的解决方案-您真正需要的不是整个
M3
合并的还原,而是仅M2
的还原,并挑选具有M1
的分支作为合并提交的还原目标(假设它在命令中的索引为1):这将做正是你想要的,你会结束这样的东西:
其中
rvM2
保存来自M2
的改变,丢弃来自e
和f
提交的改变。一般来说,每次我们想要还原某个东西的时候,最好尽可能具体。也就是说,如果我们想要还原1个提交,我们只需要为它执行revert,而不是为保存它的整个分支执行revert,如果我们想要还原1个特定的分支-我们不应该还原几个分支的复合合并,就像你最初在
M3
中所做的那样。pn9klfpd2#
一般来说,我尽量避免回复,因为根据我的经验,它们会导致混乱,有时我最终会决定选择樱桃。
我将在dev分支中恢复feature B的合并,然后将dev合并到master,而不是将合并恢复到master。
我不确定git现在是否允许你这样做。你可能需要在master中恢复revert。