为什么挑选樱桃会导致 git merge 丢弃我的部分提交?

问题描述

所以我试图理解为什么当我 git merge master 进入一个分支时,我会在提交中丢失一些但不是所有的更改。这似乎与我的分支上的挑选提交有关。复制方法如下:

  1. 使用初始提交初始化一个仓库
  2. 文件添加一行文本并提交
  3. 将其分支,称为“测试”
  4. 在 master 分支上,恢复第二次提交
  5. 选择提交到测试分支的樱桃
  6. 回到 master,创建一个新的提交来恢复那行文本,并添加额外的更改
  7. 返回测试,运行 git merge master
  8. 请注意,合并会自动删除该行文本 (!!!),但保留了其他更改。我希望合并不会删除该行,以便它匹配 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,那么两个分支都不会做出删除该行的贡献,所以显然它不会被合并删除。