当在要精挑细选的材料发生冲突,Git会做同样的事情总是这样:
- 看那合并基础版本;
- 看看
HEAD
版本;和
- 看待合并版本。
如果设置merge.conflictStyle
到diff3
(我),你会看到所有三个版本,而不是仅仅这三个中的两个,在冲突地区。我发现这有助于看到Git看到了什么。
那么,为什么我从A显示了用C看到任何东西,当它没有B中直接加入,我采摘樱桃的提交?我猜这与冲突有关,因为没有其他A来自冲突线周围的东西。
这是正确的:这个问题是混帐必须找到一个合并基础承诺,以决定“你改变了” - 这是合并基础比较当前的结果或HEAD
承诺和“他们改变了什么“,这是将合并基础与”他们的“提交进行比较的结果。
你在这一切的开头提到的“分支”:
我有被关闭分支A.创建我使分支B中的几次提交,我想摘樱桃支路B进入分支C(与A相似)。
但事实上,Git大多根本不关心分支。 Git只关心提交 - 分支主要与Git有关,分支名称允许Git查找单个提交。它有助于绘制出实际的提交(如果你喜欢,包括分支的标签,让我们-和Git,发现这些提交):
H--I--J <-- branch-B
/
...--E--F--G <-- branch-A
\
K--L <-- branch-C
我从全棉布制成该图了,它可能看起来像你的图很小,但它现在可以让我们说明奇怪的方式git cherry-pick
在Git中标识合并基提交。
如果我们在“branch-C”上,因为git status
可能会说,我们的HEAD
提交是提交L
,分支-C的提示。如果我们再运行git cherry-pick <hash-of-commit-I>
,GIT中使得这些分配:
- 合并基础=提交ħ
- HEAD或
--ours
=提交大号
--theirs
=提交我
git会然后DIFF(在git diff
)提交H
对提交I
看到他们做了,那什么是我们想樱桃采摘,但也差异承诺H
对提交L
,看看有什么我们变化,寻找冲突。
如果有是冲突,Git会为我们展示了双方都在合并基础版本H
,实际上并没有向我们展示了合并基础版本H
本身。这可能包括的东西,我们并不想:东西,我们通过进入“向后”从H
到L
“删除”。有混帐显示了合并基础版本H
还有,我们可以看到,我们“删除”的东西,我们不想要的,所以我们应该“保持删除”解决合并冲突时。