几个小时以来,我一直在阅读关于git merge -s ours
的策略。我发现的所有资源都表明它会诱使 Git 忽略在使用 -s ours
策略进行的“假” merge 之前发生的提交,我不明白为什么:
假设我有以下 git 历史,其中 master
和 feature
分支之间有很多差异:
(A)------(B)-------(C)------(D) <---[master] <---[HEAD]
\
\
(E)------(F)------(G) <---[feature]
现在我运行 git merge -s ours feature
,结果是提交 H
:
(A)------(B)-------(C)------(D)--(H) <---[master] <---[HEAD]
\ /
\ /
(E)------(F)--------------(G) <-- [feature]
然后我在两个分支上进行更多提交:
(A)------(B)-------(C)------(D)--(H)------(K)------(L) <---[master] <---[HEAD]
\ /
\ /
(E)------(F)--------------(G)------(I)------------(J) <-- [feature]
然后,在 master
上运行 git merge feature
如果我错了,请纠正我,那时 Git 会:
- 计算提交
G
作为merge-base
- 在
G
和L
之间运行差异 - 在
G
和J
之间运行 diff> - 复制提交
G
,比如G'
并将上述 2 个差异应用到提交G'
- 让
L
和J
成为G'
的父级
这是我不明白的地方:根据文档,提交 E
和 F
的更改不会影响 merge ,但 G
和 L
之间的差异仍将反射(reflect)在提交 E
和 F
因为 G
是从它们“诞生”的,所以这些提交中的更改怎么可能仅仅因为使用了 我们的
策略就不会影响 merge ?
在更极端的情况下,如果这些分支分歧更大,例如,feature
分支中有 100 个文件(在 G
之前引入)并且它们是不在master
中,那么它们不会仍然出现在G
和L
之间的diff中吗?/strong> 在上次 merge 期间? **编辑:我不明白为什么它们不会出现在 diff 中
最佳答案
不,G
和 L
之间的差异 不反射(reflect) E
和 的变化F
。如果 I
引入了更改,它将显示在 diff 中,但之前的更改不包含在 diff 中。
如您所写:G
被检测为 merge 基础,其他所有内容均从那里计算。
也许下面的帮助:
E
添加一个文件e
F
添加一个文件f
G
包含文件e
和f
。H
包含一棵与D
相同的树
I
添加一个文件i
G
和I
之间的差异仅包含G
之后的变化,即新文件我
。由于文件e
和f
之后都没有更改,因此它们不会出现在 diff 中。就 Git 而言,这些更改已经 merge (但“解决”为不显示在最终结果中,只有“我们的”树是结果的一部分)。
从 Git 的角度来看,G
之前的更改在与 ours
策略 merge 时会被还原。您可以通过比较两个提交来确认这一点:git diff G H
将准确地向您显示 E
和 F
(或 A..G
如果你愿意的话)。
关于git - 无法理解为什么 git merge -s ours 会忽略以前的提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66190308/