git - 意外合并错误分支后如何修复 Git 主分支?
问题描述
我有一个开发分支,在它准备好之前我不小心合并到了主分支中。
由于我错误地执行了此操作,因此我决定还原 Master 中的更改,这样我的更改就不会出现在那里。这个过程创建了一个 Revert Commit,它从 Master 中删除了我的更改。
一切都很好,我以为...
一个星期过去了,我几乎准备好将我的分支合并回 Master。由于有其他开发人员在其他分支上工作,我决定通过将 Master 的任何新更改合并回我的来更新我的 Development 分支。
这个过程似乎删除了我所有的工作。
查看刚刚来自 Master 的历史,它包含意外提交和恢复提交。这意味着每当我从 Master 更新我的分支时,revert 提交都会删除我的大部分工作。
如何将 master 中的更改合并回我的分支,但不包括恢复提交?
我能想到的唯一两种可能性是:
- 遍历 Merge 中的每个项目并尝试手动删除还原项目(我认为这是不可能正确完成的,而且完全是一场噩梦)。
- 将我所做更改的所有文件复制到本地,从 Master 合并,然后尝试将所有更改复制/粘贴回我的分支(这可能也是一场噩梦)。
我希望有一种更好的自动化方式来做到这一点(我希望某种合并但忽略某些提交过程)。
解决方案
所以,你的情况是这样的(时间从左到右流动):
--o--o--o---M--R--o <- master
\ /
A--B--C--D--E <- devel
您已将提交 A、B 和 C 合并到 master 中,然后恢复 R 中的更改,这是 A+B+C 的倒数。
当您合并两个分支时(无论您合并到哪个分支中都没有关系),您将从最后一个共同祖先以来的两侧获得所有内容。
在这种情况下,共同的祖先是C,所以你得到R,D和E。从开发人员的角度来看,这看起来像是A,B和C被还原了,但从主人的角度来看,它好像只有D和E发生了。
解决方案 1:还原还原
您可以在 master 或从 master 派生的辅助分支上恢复 R。然后合并它们:
--o--o--o---M--R--o <- master
\ / \
A--B--C R' <- aux (git revert R)
\ \
D--E---M' <- devel
现在您可以将开发合并到master。
解决方案 2:重新定位您的分支
您使用以下命令使用新提交重建您的开发分支git rebase --force-rebase
:
--o--o--o---M--R--o <- master
|\ /
| A--B--C--D--E <- (abandoned)
\
A'-B'-C'-D'-E' <- devel
现在您可以将开发合并到master。
解决方案 3:隐藏不需要的共同祖先(仅限专家)
您临时构建此历史记录:
--o--o--o---M--R--o <- master
\
A--B--C--D--E <- devel
通过安装移植物来做到这一点:
git replace --graft M M^
这告诉 Git 提交M
只有一个父级,M^
. 现在您可以将开发合并到master。
最后,您恢复实际的历史记录:
git replace --delete M
[编辑:使用git replace
而不是已弃用的移植文件。]
推荐阅读
- c++ - 我怎样才能让退格不算作一个字符?
- javascript - 按价格排序对象数组(从最低到最高)
- python - 如何在 anaconda 上使用 tensorboard 访问日志文件
- json - AWS CloudFormation:“参数 [subnetIds] 无效”
- java - Spark SQL:窗口函数滞后直到满足条件
- arrays - 我是汇编语言编程的初学者,无法找出给定数组中的负数
- c# - 从水平轴和垂直轴获取角度
- reactjs - Reactjs 从子节点传递道具
- c - 我怎样才能让'C'中的这个回文程序重复五次?
- android - Android Studio:context.getFilesDir() 返回我找不到的路径 [/data/user/0/com.example.filesexperimenting/files/]。我错过了什么?