Git merge 没有只合并两个文件?

Git merge didn't merge two files only?

我有主分支和发布分支。发布分支上的最后一次提交向文件添加了几行,比方说,A 和 B。然后这些更改被合并到 master 中(事情发生了)。

后来,对 master 进行了许多其他提交,其中一次又从 A 和 B 中删除了那几行。

现在我将 master 合并到 release 中。一切都很好地合并(除了几个小冲突),但文件 A 和 B 保持不变,存在几行。

怎么会这样?我可以在合并之前检查发布分支上的提交,然后再次重复,结果相同。任何 commands/switches 了解合并期间发生的事情?

编辑。 看来我只是做错了什么,但我不明白如何正确地做。我可以很容易地复制这个问题,它似乎正在发生,因为 'bad' 行首先添加到 master 上,然后删除,然后它们 master 合并到发布中,其中 'bad' 行也存在。所以来自 master 'annihilated' 和 release 的两次提交保持不变,对吧?

所以,我在做什么: 7aee9be 发布 'bad' 行 84d7ed2 在所有更改之前是 master,比上面的更旧

现在我检查 84d7ed2,添加 'bad' 行,提交(在新的测试分支上)。 然后我删除 'bad' 行,提交。 所以测试分支不再有 'bad' 行。 然后我签出 7aee9be 并将测试分支合并到其中。 'bad' 行又回来了,合并提交根本没有任何变化。

我将从 git bisect 开始,找出问题的根源。一旦你有 "bad" 提交,检查它并从那个点开始跟踪以找出问题所在。 (因为你的情况确实出了问题)

有几个选项:

  1. 有人做了变基,所以你的提交被覆盖(不太可能,但它仍然是一个选项,因为如果有人做了变基,你很可能会知道它。你的分支可能变得不可用)
  2. 有人用强制标志 git push origin master --force 推送了 "old" 代码,这将导致覆盖旧代码
  3. 当您拉取 (pull = fetch+merge) 时,您遇到了冲突,您通过将行留在原地解决了冲突,因此现在它们将被再次签入。

正如我建议的那样,在 git bisect 的帮助下尝试弄清楚这一切是什么时候开始的。一旦你弄清楚出了什么问题,解决它就会容易得多。

都是关于共同祖先的(在3-way merging):

如果在做最后的merge(测试,没有坏线)发布(有坏线)时,"bad line"是在 共同祖先之后的版本中引入,那么合并将不会删除它。

自那个共同的祖先:

  • release引入了坏线
  • test已引入再去掉坏线

release 中合并 test 在这种情况下不会删除 release 中的错误行:与共同祖先相比,test 引入了 没有变化,而release有变化。来自 release 的更改被保留。