【问题标题】:Merged git branches that should be equal have lots of differences actually应该相等的合并git分支实际上有很多差异
【发布时间】:2019-03-07 09:09:11
【问题描述】:

我从公司以前的开发人员那里继承了一个项目。有一个 master 分支和一个 foo 分支。 Gitk 显示最后一次提交是 foo 到 master 的合并,所以它们应该是相等的。事实上,如果我尝试通过执行再次进行这样的合并:

git merge foo

在 master 分支上,它会说 master 是“已经是最新的”,正如人们所期望的那样。

尽管如此,如果我在它们之间做一个差异,例如:

git diff foo

从主人那里,我在几十个文件中得到了几十个更改。而且,事实上,如果我结帐一个或另一个分支,它们是不同的。

那么...为什么我会遇到这种看似混乱的情况?我该如何解决?

提前非常感谢!

【问题讨论】:

  • AFAIK 没有什么可以解决的。您已将 foo 合并到 master 中,Git 知道这一点。两者之间存在差异并不意味着合并不起作用。
  • 请有足够权限的版主删除这个。我才意识到发生了什么:另一个人没有合并任何东西,他执行了合并并通过接受主方解决了冲突,而他应该做的恰恰相反。对于给您带来的不便,我深表歉意。
  • 但是你的问题一般来说还是有效的,所以我认为不需要删除任何东西。
  • 也许你是对的。

标签: git git-merge git-diff


【解决方案1】:

master 得到了所有的foo 提交,但相反的情况并非如此,因此您可能(并且显然确实)存在差异,即 master 中的内容 not 在 @ 987654324@.

您必须将 master 合并回 foo 以使它们的差异无效,尽管这很少需要,至少在涉及简单的功能分支时,这些分支通常在达到目的后被删除。

【讨论】:

    【解决方案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
                 |
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-21
      • 2016-03-20
      • 1970-01-01
      相关资源
      最近更新 更多