在合并时,Git是否只考虑提交的时间戳而不是它所属的分支?

时间:2015-07-05 04:29:56

标签: git github

我在Git中有两个主要分支:masterdev 我的分支结构如下所示:

B-->E-->F-->G (master branch)

B-->C-->D-->H-->I-->J-->K (dev branch)

在执行合并之前,masterdev有一个共同的父B
在提交的EFG的提交中,我删除了一些文件(比如foobar),但它们仍然存在于提交{{1在C分支开始。
因此,当我通过创建提交dev执行三向合并以加入GK时,L不再包含foo和bar! Git没有告知我他们失踪的任何方式。

在我看来,因为LEF只是在提交G后被重播,因此Cfoo消失了

Git merge的这种行为对我来说很奇怪。因为我无法知道是否有人从另一个分支删除了一些文件 在合并时,我不应该至少收到有关任何冲突修改的通知吗?

1 个答案:

答案 0 :(得分:4)

  

在合并时,我是否应该至少收到有关任何冲突修改的通知?

在这种情况下,否:合并"C:\Program Files\xxx\phpar2.exe" c -r5 -b3000 "C:\Users\xx\Desktop\xxx\*.rar" dev会报告master(自共同祖先dev)到B的修改。
master以来,foo和bar在dev未修改。从B开始,它们在master中被删除了。没有冲突(如果Bfoo未在bar中修改):这两个文件与合并无关(无法从dev应用),以及在dev(意味着删除)中保持不变。

你可以preview a merge使用:

master

那将列出已删除的文件。

  

你能否给我一些关于Git如何决定在合并期间重播哪些提交的指示?

Git没有"重播"提交when merging(仅when rebasing):它只考虑两个分支HEAD(和共同的祖先)。

https://git-scm.com/book/en/v2/book/03-git-branching/images/basic-merging-1.png

  

Git会创建一个由此 three-way merge 生成的新快照,并自动创建一个指向它的新提交。这被称为合并提交,并且特殊之处在于它具有多个父级。

https://git-scm.com/book/en/v2/book/03-git-branching/images/basic-merging-2.png