git恢复后,合并显示没有更改并且已经更新

Moh*_*eer 5 git git-merge git-revert git-remote gitlab

我有一个dev它已经与分支合并的分支featureAfeatureB。我将该dev分支合并到master并推到远程。后来我确定由于提交错误featureB而尚未准备好与之合并master。所以我恢复了dev->的合并 master

git revert -m 1 <merge-commit-hash>
Run Code Online (Sandbox Code Playgroud)

然后我试图合并featureAmaster。但是我不能合并。它会说Already up to date

我知道莱纳斯·托瓦尔兹(Linus Torvalds)所说的原因,

Linus解释了这种情况:

恢复常规提交只会有效地撤消该提交所做的操作,并且非常简单。但是,还原合并提交也会撤消提交更改的数据,但是对合并所产生的历史记录的影响绝对没有任何作用。

因此,合并仍将存在,并且仍将其视为将两个分支结合在一起,并且将来的合并将把合并视为最后一个共享状态-还原引入的合并的还原将完全不影响此状态。

因此,通过“还原”撤销数据的变化,但是这是非常没有在这个意义上,它不会取消的影响对信息库历史提交的“撤销”。

因此,如果您将“还原”视为“撤消”,那么您将总是会错过这部分还原。是的,它撤消数据,但是不,它不会撤消历史记录。

在这种情况下,只有将其dev再次合并的解决方案masterrevert the revert commit。但是我只想合并分支中包含的一个dev分支,即featureA

如何将分支(featureA)合并到master包含在还原的合并分支(dev)中的主线分支()?

mme*_*nik 2

您不应该在此处恢复整体develop以进行master合并,而应恢复 1 个特定分支。featureB在你的情况下,它应该是合并的恢复develop

\n

如果您的恢复无法撤消,最简单的解决方案是将其恢复并仅进行新的恢复featureBdevelop合并。否则,我建议放弃最初的恢复并遵循下面的解释。

\n

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

\n
  master   a------------------M3\n            \\                /    \n     dev     b-------M1-----M2\n             |\\     /      /\nfeatureA     | c---d      /\n              \\          /\nfeatureB       e--------f\n
Run Code Online (Sandbox Code Playgroud)\n

M3是您尝试恢复的合并提交:

\n
git checkout master\ngit revert -m 1 <M3-commit-hash>\n
Run Code Online (Sandbox Code Playgroud)\n

如果您完全按照您所说的操作,则通过上面的命令将整体恢复为dev合并master提交M3,这将产生恢复提交并将其放在M3时间线中:

\n
  master   a------------------M3---rvM3\n            \\                /    \n     dev     b-------M1-----M2\n             |\\     /      /\nfeatureA     | c---d      /\n              \\          /\nfeatureB       e--------f\n
Run Code Online (Sandbox Code Playgroud)\n

其中rvM3是整个dev分支合并的恢复提交。

\n

然后你尝试执行:

\n
git checkout master\ngit merge featureA\n
Run Code Online (Sandbox Code Playgroud)\n

现在让我们想象一下预期结果的图片:

\n
  master   a------------------M3---rvM3---(M4)\n            \\                /            /\n     dev     b-------M1-----M2           /\n             |\\     /      /            /\nfeatureA     | c---d----- / -----------         \n              \\          /          \nfeatureB       e--------f\n
Run Code Online (Sandbox Code Playgroud)\n

如果仔细查看最后一个视图,我们可以发现提交cd来自合并后featureA已经是分支的一部分,并且可以通过父链接访问它们masterM3M3

\n

您可能期望M4使用提交来featureA创建,但它不会发生,因为对于 Git 来说,没有任何新内容可以从featureA分支添加到master(从提交角度来看),因为它之前已经合并了featureA事实上,代码更改不再出现,这并不重要master,因为 Git 只关心提交,而不关心更改本身,也不关心它们在将来的提交中会发生什么。

\n

考虑到这一点,我们可以得出一个简单的解决方案 \xe2\x80\x94您真正需要的不是恢复整个合并,而是仅M3恢复并M2选择分支M1作为合并提交的恢复目标(假设它有命令中的索引 1):

\n
git checkout master\ngit revert -m 1 <M2-commit-hash>\n
Run Code Online (Sandbox Code Playgroud)\n

这将完全满足您的要求,您最终会得到类似的结果:

\n
  master   a------------------M3---rvM2\n            \\                /    \n     dev     b-------M1-----M2\n             |\\     /      /\nfeatureA     | c---d      /\n              \\          /          \nfeatureB       e--------f\n
Run Code Online (Sandbox Code Playgroud)\n

其中保存来自并提交的丢弃rvM2更改。M2ef

\n

一般来说,每次我们想要恢复某些内容时,最好尽可能具体。也就是说,如果我们想恢复 1 个提交,我们只需要对其执行恢复,而不是保存它的整个分支,如果我们想恢复 1 个特定分支 \xe2\x80\x94,我们不应该恢复多个分支的复合合并,就像你M3最初做的那样。

\n

  • 我输入的:) (2认同)