我在使用git时遇到了很大的困难。
我有一个分支A
和一个分支B
。我想要将分支A
合并到分支B
中。我目前在分支B
上,并使用了以下命令:
git merge A
。
现在,当我运行git status
时,我发现我领先了两次提交,并且当我查看在git merge
期间更改的文件时,我注意到只有两个文件被更改。然而,至少有十几个文件在分支A
中被更改,但在git merge
中没有被选中。
为什么git merge
只合并了这两个文件,而显然还有其他需要被合并的文件呢?
我在使用git时遇到了很大的困难。
我有一个分支A
和一个分支B
。我想要将分支A
合并到分支B
中。我目前在分支B
上,并使用了以下命令:
git merge A
。
现在,当我运行git status
时,我发现我领先了两次提交,并且当我查看在git merge
期间更改的文件时,我注意到只有两个文件被更改。然而,至少有十几个文件在分支A
中被更改,但在git merge
中没有被选中。
为什么git merge
只合并了这两个文件,而显然还有其他需要被合并的文件呢?
比较两个分支尖端提交是错误的,因为这不是git merge
所做的事情。
要查看每个人更改的文件,必须首先找到最近共享A
和B
分支的提交:
o--o <-- branch-B
/
...--o--o--*
\
o--o--o <-- branch-A
这里每个回合o
代表着人们随时间添加的提交记录。
我在这里标注了一个叫做公共提交的符号*
,它就是Git称之为两个分支的合并基础。当你处于其中一个分支的末端(例如B
)并运行git merge A
命令时,Git会自动找到此提交。
然后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下一次就知道要使用什么作为合并基础。*
的哈希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"合并基础"是一种对称图形操作,因此"A和B的合并基础"在定义上等于"B和A的合并基础"。
git merge
将从合并基地合并,如所述。如果您想从其他地方合并而不是从合并基地,请勿使用git merge
。(如果要特定地取三个文件并将它们组合起来,请考虑使用git merge-file
,它需要三个输入文件而不是三个输入提交。) - torekgit merge
,但这并不是正确的工具?在这种情况下,什么是正确的工具? - Ian Smithgit checkout master; git merge --ff-only $(git commit-tree -p HEAD -m urk first-commit-hash^{tree})
,以便 master
的树与根提交的树匹配,那么“合并”图中其他提交的结果就不太清楚了。但如果你有计划,可以使用 git commit-tree
创建任意图形,然后运行 git merge
在生成的提交上,知道 git merge
的工作原理;生成的树可能是你想要的文件集。 - torek
git diff-tree
的文档,但是... git 的文档 >.< 哈哈。不过可以看看这个答案 https://dev59.com/PHRC5IYBdhLWcg3wD8xV - Jamie - Fenrir Digital Ltdgit diff --name-only branchA branchB
请执行以上命令以比较分支A和分支B之间的差异,并返回文件名列表。 - Ramiz Wachtler