Git合并不合并所有文件

时间:2018-02-19 17:53:49

标签: git

使用git我真的很难。

我有一个分支A和一个分支B。我想将分支A合并到分支B中。我目前在分支B上,并使用以下命令:

git merge A

现在,当我运行git status时,我看到我在两次提交时领先,当我查看在git merge期间更改的文件时,我注意到只有两个文件被更改。但是,我知道至少有十几个文件在分支A中被更改,但在git merge期间未被提取。

为什么git merge只在合并其他文件时才合并这两个文件?

1 个答案:

答案 0 :(得分:3)

比较两个分支提示是不对的,因为那不是git merge所做的。

要查看每个人更改了哪些文件,您必须先找到分支AB最近共享的提交:

             o--o   <-- branch-B
            /
...--o--o--*
            \
             o--o--o   <-- branch-A

(其中每轮o代表一个提交,在人们随时间增加的提交链中。)

我在这里标记*公共提交是Git称之为两个分支的合并基础的。当您坐在两个分支之一(例如B)并运行git merge A时,Git会自动找到此提交。

然后,Git将进行比较,而不是BA,也不是AB,而是:

git diff hash-of-* hash-of-tip-of-B    # what did *we* change?

git diff hash-of-* hash-of-tip-of-A    # what did *they* change?

git merge的目标是找到并提取提交*,将所有更改来自两个分支,并将其提交为当前分支(B)上的新合并提交,具有两个父提交,以使其成为合并提交,以便Git知道将使用什么作为合并基础 next < / em>时间也是。

如果要查看提交*的哈希ID,可以运行git merge-base

git merge-base --all A B

然后,您可以运行git diff,为其提供合并基础的哈希ID,并使用名称A选择分支A的提示,以查看其更改内容。您可以运行第二个单独的git diff,为合并库提供相同的哈希ID,并使用名称B选择分支B的提示以查看改变了(你可能还记得你改变了什么,但是看看Git是否同意你的记忆是一个好主意,因为Git会使用找到的东西,而不是什么你还记得!)。

有一个为git merge-base运行的简写,仅适用于git diff

git diff A...B   # note the three dots

会将AB的合并基础与B标识的提交进行比较,以查找更改的内容。随后:

git diff B...A   # note the three dots again

会将BA 1 的合并基础与A标识的提交进行比较,以找到他们的内容改变。

(您可以向--name-status添加--name-onlygit diff等选项,以影响git diff显示其计算/找到的更改的方式。请注意,只要涉及重命名,合并使用等效的git diff -M50来查找重命名。现代Git,从2.9开始,默认情况下也允许git diff中的重命名检测。)

1 &#34;合并基地&#34;是一个对称的图形操作,所以&#34;合并A和B的基础&#34;根据定义,它等于&#34;合并B和A&#34;的基础。