Moh*_*eer 5 git git-merge git-revert git-remote gitlab
我有一个dev它已经与分支合并的分支featureA和featureB。我将该dev分支合并到master并推到远程。后来我确定由于提交错误featureB而尚未准备好与之合并master。所以我恢复了dev->的合并 master。
git revert -m 1 <merge-commit-hash>
Run Code Online (Sandbox Code Playgroud)
然后我试图合并featureA到master。但是我不能合并。它会说Already up to date。
我知道莱纳斯·托瓦尔兹(Linus Torvalds)所说的原因,
Linus解释了这种情况:
恢复常规提交只会有效地撤消该提交所做的操作,并且非常简单。但是,还原合并提交也会撤消提交更改的数据,但是对合并所产生的历史记录的影响绝对没有任何作用。
因此,合并仍将存在,并且仍将其视为将两个分支结合在一起,并且将来的合并将把合并视为最后一个共享状态-还原引入的合并的还原将完全不影响此状态。
因此,通过“还原”撤销数据的变化,但是这是非常没有在这个意义上,它不会取消的影响对信息库历史提交的“撤销”。
因此,如果您将“还原”视为“撤消”,那么您将总是会错过这部分还原。是的,它撤消数据,但是不,它不会撤消历史记录。
在这种情况下,只有将其dev再次合并的解决方案master是revert the revert commit。但是我只想合并分支中包含的一个dev分支,即featureA
如何将分支(featureA)合并到master包含在还原的合并分支(dev)中的主线分支()?
您不应该在此处恢复整体develop以进行master合并,而应恢复 1 个特定分支。featureB在你的情况下,它应该是合并的恢复develop。
如果您的恢复无法撤消,最简单的解决方案是将其恢复并仅进行新的恢复featureB以develop合并。否则,我建议放弃最初的恢复并遵循下面的解释。
我们根据描述画出这里发生的情况:
\n master a------------------M3\n \\ / \n dev b-------M1-----M2\n |\\ / /\nfeatureA | c---d /\n \\ /\nfeatureB e--------f\nRun Code Online (Sandbox Code Playgroud)\n这M3是您尝试恢复的合并提交:
git checkout master\ngit revert -m 1 <M3-commit-hash>\nRun Code Online (Sandbox Code Playgroud)\n如果您完全按照您所说的操作,则通过上面的命令将整体恢复为dev合并master提交M3,这将产生恢复提交并将其放在M3时间线中:
master a------------------M3---rvM3\n \\ / \n dev b-------M1-----M2\n |\\ / /\nfeatureA | c---d /\n \\ /\nfeatureB e--------f\nRun Code Online (Sandbox Code Playgroud)\n其中rvM3是整个dev分支合并的恢复提交。
然后你尝试执行:
\ngit checkout master\ngit merge featureA\nRun 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\nRun Code Online (Sandbox Code Playgroud)\n如果仔细查看最后一个视图,我们可以发现提交c和d来自合并后featureA已经是分支的一部分,并且可以通过父链接访问它们masterM3M3。
您可能期望M4使用提交来featureA创建,但它不会发生,因为对于 Git 来说,没有任何新内容可以从featureA分支添加到master(从提交角度来看),因为它之前已经合并了。featureA事实上,代码更改不再出现,这并不重要master,因为 Git 只关心提交,而不关心更改本身,也不关心它们在将来的提交中会发生什么。
考虑到这一点,我们可以得出一个简单的解决方案 \xe2\x80\x94您真正需要的不是恢复整个合并,而是仅M3恢复并M2选择分支M1作为合并提交的恢复目标(假设它有命令中的索引 1):
git checkout master\ngit revert -m 1 <M2-commit-hash>\nRun 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\nRun Code Online (Sandbox Code Playgroud)\n其中保存来自并提交的丢弃rvM2更改。M2ef
一般来说,每次我们想要恢复某些内容时,最好尽可能具体。也就是说,如果我们想恢复 1 个提交,我们只需要对其执行恢复,而不是保存它的整个分支,如果我们想恢复 1 个特定分支 \xe2\x80\x94,我们不应该恢复多个分支的复合合并,就像你M3最初做的那样。
| 归档时间: |
|
| 查看次数: |
1056 次 |
| 最近记录: |