在libgit2标题中,我在读取之后读取,如果在分析期间信号通知快进,那么所需要的是简单检查所获取的提示(以及改变头部/< branch>)。它似乎合乎逻辑,但我想知道,refs / heads /< branch>怎么样?区别于遥控器&& lt; remote> /< branch> ?提交者将父母嵌入其中 - 这构成了单一的历史,而应该有两个历史,两者都有额外的“合并”提交。如何快速实施呢?它确实导致SHA哈希在两个历史中重复出现,所以libgit2似乎有其重要性。
答案 0 :(得分:3)
“快进”根本不是合并,只是将分支指针设置为合并的“他们”。
考虑一些历史:
1 -- 2 -- 3 -- 4 -- 5 -- 6
并且考虑我的master
分支在提交4,服务器的master
分支在提交6。
如果我希望将父母的主分支合并到我的(可能作为拉动的一部分),合并的第一步是找到合并基础,或者这两个提交之间的共同祖先。
在这种情况下(上图),4 是 4到6之间的共同祖先。因此,本地没有服务器没有的提交,所以你可以简单地“快进”你的分支,更新它的指针指向6.这样做你不会丢失任何数据(虽然你也没有创建任何数据 - 如果你强制实际合并“no fast forward”选项那么你会创建一个4到6之间的新合并提交。
所以libgit2的git_merge_analysis
函数可以识别合并是否可以快速转发,只是检查“你的”分支是否是你自己的共同祖先和“他们的”分支。
这当然不是典型的合并案例。考虑:
F -- G
/
A -- B -- C -- D -- E
在这种情况下,如果您在本地提交G
且上游处于提交E
,那么您的共同祖先是C
并且无法快进,您必须执行真正的合并。
答案 1 :(得分:3)
由于Git是CVCS,因此本地仓库和远程仓库可以在逻辑上被视为一个仓库。远程仓库中refs/heads/master(r)
为refs/heads/master
。
远程主人已被其他人更新。
现在我们想通过git pull origin master
更新本地主人与远程主人。
首先在内部运行git fetch origin master
并更新remotes/origin/master
。这实际上是一个快速合并。 remotes/origin/master
从C
移至E
。
然后运行git merge remotes/origin/master
。 refs/heads/master
通过快进合并进行更新。它也从C
移动到E
。
如果在拉动之前我们更新了refs/heads/master
,那么它将是一个真正的合并。在拉动之前它就像
我们有两个选项,git pull origin master
或git pull origin --rebase master
。
获取过程是一样的。
如果没有--rebase
,那将是真正的合并。
使用--rebase
,它将是一个rebase。
P
现在可能会被忽略,因为它现在没有被任何分支或标记引用。
以最后一个案例为例,如果我们现在将refs/heads/master
推送到远程,refs/heads/master(r)
将通过远程仓库中的快进合并进行更新。