当`git diff`显示更改但是`git merge`什么都不做时,合并分支的正确方法是什么

时间:2013-05-10 20:44:03

标签: git git-merge git-diff

git diff other_branch显示差异而git merge other_branch什么也没做,我感到很难过。将“缺失”代码合并到my_branch中的正确方法是什么?

SO answer表明了与我相似的情况。

o---A---B---C-------G   my_branch
     \       \     /
      --*D*---E---F    other_branch

当我这样做时, D 中的更改不会自动合并到my_branch

git checkout my_branch
git merge other_branch

F 引入 G

我当然可以manually create a patch并将其应用于my_branch,如下所示:

git diff other_branch my_branch > patchfile
git checkout my_branch
patch -p1 < patchfile 

但是我想要做到这一点,而不是弄乱git日志。使用补丁方法,git将记录 D 和我最新补丁中的更改,这些更改彼此独立(代码流失)。我希望简化git log,并确保其他人在git merge my_branch执行{{1}}时不会发生意外情况(悄悄地和阴险地)。

1 个答案:

答案 0 :(得分:3)

您似乎同时有两个问题。

假设您所描述的历史记录如下:

                my_branch
                    v
----A---B---C-------G   
     \       \     /
      --*D*---E---F
                  ^
             other_branch

为什么差异不为空:

这种情况是由您提到的命令产生的,即my_branch上,然后执行git merge other_branch 。此操作生成合并提交G并向前移动当前分支(my_branch),但将other_branch移至原来的位置。这就是合并总是有用的!当然,此时my_branchG)和other_branchF)之间仍然存在差异 - 毕竟它们指向不同的提交。

如果您希望两个分支相同,可以通过以下方式向上移动other_branch

  1. git checkout other_branch; git merge my_branch - 这是快进合并,因为GF
  2. 的后代
  3. [不在other_branch上!] git branch -D other_branch; git branch other_branch my_branch - 这将删除other_branch,然后在{{1}的同一位置重新创建它目前是
  4. my_branch - 这将移动 git checkout other_branch; git reset --hard my_branch指向other_branch当前指向的位置
  5. 执行一个步骤后,my_branchmy_branch都将指向other_branch


    为什么提交G的更改不在Dmy_branch

    Git合并历史,而不是变化。这通常意味着Git将采用合并的两个方面(如果可用的话,还有他们最年轻的共同祖先提交,即merge-base),并尝试将它们组合在一起。由于Git提交是快照,而不是更改集/增量/差异,因此在实际合并中不使用其他提交或更改的信息。

    使用合并库,Git进行所谓的三向合并,使用共同的祖先来尝试巧妙地解决双方的变化。如果不能,它将中断合并并要求用户解决冲突。

    历史记录中

    可能发生的事情是提交GE还原(或覆盖)F的更改 - 这可能发生了在合并期间D中产生E或实际(手动)更改。

    正如您在评论中提到的那样,您经常在提交之间切换并进行编辑。因此,您将进行大量浮动更改(Git在结账时进行未提交的更改),这可能很难说明更改应该去哪里以及实际执行的位置。尝试通过在更改分支之前提交任何更改或使用git stash缓冲它们来避免这种情况。