实际上应该相等的合并git分支实际上有很多差异

时间:2019-03-07 09:09:11

标签: git git-merge git-diff

我已经从公司的前一位开发人员那里继承了一个项目。有一个master分支和一个foo分支。 Gitk显示最后一次提交是foo与master的合并,因此它们应该相等。实际上,如果我尝试通过执行以下操作再次合并:

git merge foo

在master分支上,它将说master是“已经更新”。

不过,如果我在它们之间做一个区分,就像:

git diff foo

从大师那里,我在几十个文件中进行了许多更改。而且,实际上,如果我签出一个或另一个分支,它们是不同的。

那么...为什么我有这种看似混乱的情况?我该怎么解决?

非常感谢!

2 个答案:

答案 0 :(得分:2)

master获得了所有foo的提交,但事实并非如此,因此您可能(并且显然有)不同之处,即master中的内容不是 foo中。

您必须将master重新合并到foo中以使其差异无效,尽管很少需要这样做,至少在涉及简单要素分支时,通常在提供服务后就将其删除他们的目的。

答案 1 :(得分:2)

Git分支是指向提交的指针。当您合并两个分支时(实际上,您合并了两个提交),将创建一个新的提交并将当前分支移至新的提交。合并的分支不会更改。

这里是一个例子。
当前分支为A,还有另一个分支B与过去的A不同。

HEAD -> A -> o    o <- B
             |    |
             o    o
             |   /
             o  o
             | /
             o
             |

git merge B之后,将创建一个新的提交(由于是合并提交,因此有两个父提交),分支A移至指向新创建的提交。 B保持以前的位置。

HEAD -> A -> o
             |  \
             o    o <- B
             |    |
             o    o
             |   /
             o  o
             | /
             o
             |

git merge B之后,git diff B显示分支A中但分支B中不存在的更改。它们是在图的左分支上操作的更改,是从B提交无法到达的提交。

HEAD -> A -> o
             |  \
         /-> o    o <- B
  in A   |   |    |
 but not |-> o    o
  in B   |   |   /
         \-> o  o
             | /
             o
             |