pli*_*ngo 0 git merge git-merge branching-and-merging merge-conflict-resolution
我有一个开发分支,在它准备好之前我不小心将其合并到了 Master 分支中。
由于我错误地执行了此操作,因此我决定恢复 Master 中的更改,以便我的任何更改都不会发生在那里。此过程创建了一个恢复提交,从主服务器中删除了我的更改。
一切都很好我以为...
一周过去了,我几乎准备好将我的分支合并回 Master 中。由于还有其他开发人员在其他分支上工作,我决定通过将 Master 中的任何新更改合并回我的分支来更新我的开发分支。
这个过程似乎删除了我所有的工作。
回顾一下Master刚刚传来的历史,它包含了意外提交和恢复提交。这意味着每当我从 Master 更新我的分支时,恢复提交都会删除我的大部分工作。
如何将 master 中的更改合并回我的分支,但不包括恢复提交?
我能想到的唯一的两种可能性是:
我希望有一种更好的自动化方法来做到这一点(我希望进行某种合并但忽略某些提交过程)。
所以,你的情况是这样的(时间从左到右流动):
--o--o--o---M--R--o <- master
\ /
A--B--C--D--E <- devel
Run Code Online (Sandbox Code Playgroud)
您已将提交 A、B 和 C 合并到 master 中,然后恢复 R 中的更改,这与 A+B+C 相反。
当您合并两个分支时(合并到哪个分支并不重要),您将获得自最后一个共同祖先以来双方的所有内容。
在这种情况下,共同祖先是 C,所以你得到 R、D 和 E。从 devel 的角度来看,这看起来像是 A、B 和 C 已被还原,但从 master 的角度来看,这似乎只是D和E已经发生了。
您可以在 master 或从 master 派生的辅助分支上恢复 R。然后你合并它们:
--o--o--o---M--R--o <- master
\ / \
A--B--C R' <- aux (git revert R)
\ \
D--E---M' <- devel
Run Code Online (Sandbox Code Playgroud)
现在您可以将 devel 合并到 master 中。
您可以使用以下命令使用新提交重建开发分支git rebase --force-rebase
:
--o--o--o---M--R--o <- master
|\ /
| A--B--C--D--E <- (abandoned)
\
A'-B'-C'-D'-E' <- devel
Run Code Online (Sandbox Code Playgroud)
现在您可以将 devel 合并到 master 中。
你暂时建立这个历史:
--o--o--o---M--R--o <- master
\
A--B--C--D--E <- devel
Run Code Online (Sandbox Code Playgroud)
通过安装移植物来做到这一点:
git replace --graft M M^
Run Code Online (Sandbox Code Playgroud)
这告诉 Git 提交M
只有一个父项M^
. 现在您可以将 devel 合并到 master 中。
最后,恢复实际历史记录:
git replace --delete M
Run Code Online (Sandbox Code Playgroud)
[编辑:使用git replace
而不是已弃用的移植文件。]