2017-10-05 124 views
1

我的方案:我有分支B创建了分支A.我在分支B中做了一些提交,我想樱桃采摘到分支C(这是类似于A )。我不想将B合并到C中,因为我不想让A的某些东西进入。git樱桃挑选冲突包括不需要的代码

我的问题:当我做B的提交樱桃选择我有一些地方在分支C的冲突。这不是一个问题来解决它们,除了在分支B的冲突变化块,A的一些东西就在那里。

那么,为什么我从A中看到任何东西显示在C中,当它不是直接添加到B中,而我正在樱桃中挑选提交?我猜这与冲突有关,因为没有其他A来自冲突线周围的东西。

在下面的截图中,红色括号中的所有内容最初都是在A中,但在C中不存在。我唯一想要的是最后一个。这也发生在另一个文件中。

enter image description here

回答

1

当在要精挑细选的材料发生冲突,Git会做同样的事情总是这样:

  • 看那合并基础版本;
  • 看看HEAD版本;和
  • 看待合并版本。

如果设置merge.conflictStylediff3(我),你会看到所有三个版本,而不是仅仅这三个中的两个,在冲突地区。我发现这有助于看到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本身。这可能包括的东西,我们并不想:东西,我们通过进入“向后”从HL“删除”。有混帐显示了合并基础版本H还有,我们可以看到,我们“删除”的东西,我们不想要的,所以我们应该“保持删除”解决合并冲突时。