如何在Git中快速实现以便两个分支保留?

时间:2016-08-12 09:52:44

标签: git git-checkout libgit2 fast-forward

在libgit2标题中,我在读取之后读取,如果在分析期间信号通知快进,那么所需要的是简单检查所获取的提示(以及改变头部/< branch>)。它似乎合乎逻辑,但我想知道,refs / heads /< branch>怎么样?区别于遥控器&& lt; remote> /< branch> ?提交者将父母嵌入其中 - 这构成了单一的历史,而应该有两个历史,两者都有额外的“合并”提交。如何快速实施呢?它确实导致SHA哈希在两个历史中重复出现,所以libgit2似乎有其重要性。

2 个答案:

答案 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

after clone

远程主人已被其他人更新。

update remote

现在我们想通过git pull origin master更新本地主人与远程主人。

首先在内部运行git fetch origin master并更新remotes/origin/master。这实际上是一个快速合并。 remotes/origin/masterC移至E

after fetch

然后运行git merge remotes/origin/masterrefs/heads/master通过快进合并进行更新。它也从C移动到E

enter image description here

如果在拉动之前我们更新了refs/heads/master,那么它将是一个真正的合并。在拉动之前它就像

another case

我们有两个选项,git pull origin mastergit pull origin --rebase master

获取过程是一样的。

another fetch

如果没有--rebase,那将是真正的合并。

true merge

使用--rebase,它将是一个rebase。

rebase

P现在可能会被忽略,因为它现在没有被任何分支或标记引用。

以最后一个案例为例,如果我们现在将refs/heads/master推送到远程,refs/heads/master(r)将通过远程仓库中的快进合并进行更新。

final graph