问题描述
所以我试图理解为什么当我 git merge master
进入一个分支时,我会在提交中丢失一些但不是所有的更改。这似乎与我的分支上的挑选提交有关。复制方法如下:
- 使用初始提交初始化一个仓库
- 向文件添加一行文本并提交
- 将其分支,称为“测试”
- 在 master 分支上,恢复第二次提交
- 选择提交到测试分支的樱桃
- 回到 master,创建一个新的提交来恢复那行文本,并添加额外的更改
- 返回测试,运行
git merge master
- 请注意,合并会自动删除该行文本 (!!!),但保留了其他更改。我希望合并不会删除该行,以便它匹配
master
。
我在 github 上上传了我的结果:https://github.com/terryttsai/testRevertMerge/commits/test
如果我从来没有挑选那个提交到我的 test
分支,那么 git merge master
确实会保留那行文本。那么为什么当我确实有那个cherry-pick提交时,合并会删除它呢?我怎样才能首先防止这种情况发生?
解决方法
我希望合并不会删除该行,以便它与 master 匹配。
没有。 git merge master
不代表匹配master!
什么是合并?合并意味着从分歧点开始,发挥两个分支的贡献。它们是什么?
好吧,分歧点是在添加第一行之后。那么之后在每个分支上发生了什么?
-
在 master 上,唯一的贡献就是额外的东西。 (它删除了第一行,但后来又恢复了它,所以这不是贡献;在这方面什么也没发生。)
-
在测试中,唯一的贡献是删除第一行(这就是cherrypicked revert commit所做的)。
所以合并同时完成了这两件事:来自 master 的额外行和来自 test 的删除。
但是如果你从不进行cherry pick,那么两个分支都不会做出删除该行的贡献,所以显然它不会被合并删除。