使用git我真的很难。
我有一个分支A
和一个分支B
。我想将分支A
合并到分支B
中。我目前在分支B
上,并使用以下命令:
git merge A
。
现在,当我运行git status
时,我看到我在两次提交时领先,当我查看在git merge
期间更改的文件时,我注意到只有两个文件被更改。但是,我知道至少有十几个文件在分支A
中被更改,但在git merge
期间未被提取。
为什么git merge
只在合并其他文件时才合并这两个文件?
答案 0 :(得分:3)
比较两个分支提示是不对的,因为那不是git merge
所做的。
要查看每个人更改了哪些文件,您必须先找到分支A
和B
最近共享的提交:
o--o <-- branch-B
/
...--o--o--*
\
o--o--o <-- branch-A
(其中每轮o
代表一个提交,在人们随时间增加的提交链中。)
我在这里标记*
的公共提交是Git称之为两个分支的合并基础的。当您坐在两个分支之一(例如B
)并运行git merge A
时,Git会自动找到此提交。
B
与A
,也不是A
与B
,而是:
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
会将A
和B
的合并基础与B
标识的提交进行比较,以查找您更改的内容。随后:
git diff B...A # note the three dots again
会将B
和A
1 的合并基础与A
标识的提交进行比较,以找到他们的内容改变。
(您可以向--name-status
添加--name-only
或git diff
等选项,以影响git diff
显示其计算/找到的更改的方式。请注意,只要涉及重命名,合并使用等效的git diff -M50
来查找重命名。现代Git,从2.9开始,默认情况下也允许git diff
中的重命名检测。)
1 &#34;合并基地&#34;是一个对称的图形操作,所以&#34;合并A和B的基础&#34;根据定义,它等于&#34;合并B和A&#34;的基础。