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" 提交,检查它并从那个点开始跟踪以找出问题所在。 (因为你的情况确实出了问题)
有几个选项:
- 有人做了变基,所以你的提交被覆盖(不太可能,但它仍然是一个选项,因为如果有人做了变基,你很可能会知道它。你的分支可能变得不可用)
- 有人用强制标志
git push origin master --force
推送了 "old" 代码,这将导致覆盖旧代码
- 当您拉取 (pull = fetch+merge) 时,您遇到了冲突,您通过将行留在原地解决了冲突,因此现在它们将被再次签入。
正如我建议的那样,在 git bisect
的帮助下尝试弄清楚这一切是什么时候开始的。一旦你弄清楚出了什么问题,解决它就会容易得多。
都是关于共同祖先的(在3-way merging):
如果在做最后的merge(测试,没有坏线)发布(有坏线)时,"bad line"是在 共同祖先之后的版本中引入,那么合并将不会删除它。
自那个共同的祖先:
release
引入了坏线
test
已引入再去掉坏线
在 release
中合并 test
在这种情况下不会删除 release
中的错误行:与共同祖先相比,test
引入了 没有变化,而release
有变化。来自 release
的更改被保留。
我有主分支和发布分支。发布分支上的最后一次提交向文件添加了几行,比方说,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" 提交,检查它并从那个点开始跟踪以找出问题所在。 (因为你的情况确实出了问题)
有几个选项:
- 有人做了变基,所以你的提交被覆盖(不太可能,但它仍然是一个选项,因为如果有人做了变基,你很可能会知道它。你的分支可能变得不可用)
- 有人用强制标志
git push origin master --force
推送了 "old" 代码,这将导致覆盖旧代码 - 当您拉取 (pull = fetch+merge) 时,您遇到了冲突,您通过将行留在原地解决了冲突,因此现在它们将被再次签入。
正如我建议的那样,在 git bisect
的帮助下尝试弄清楚这一切是什么时候开始的。一旦你弄清楚出了什么问题,解决它就会容易得多。
都是关于共同祖先的(在3-way merging):
如果在做最后的merge(测试,没有坏线)发布(有坏线)时,"bad line"是在 共同祖先之后的版本中引入,那么合并将不会删除它。
自那个共同的祖先:
release
引入了坏线test
已引入再去掉坏线
在 release
中合并 test
在这种情况下不会删除 release
中的错误行:与共同祖先相比,test
引入了 没有变化,而release
有变化。来自 release
的更改被保留。