什么是Git快进(fast-forwarding)?

303

可以假设快进表示将所有提交重播到目标分支,HEAD设置为该分支上最后一次提交,这样做是否合适?


8
请参阅http://git-scm.com/book/zh/v2/Git-分支-基本的分支与合并,其中通过示例和图示说明了这一点。 - DNA
4个回答

276
当您尝试将一个提交与可以通过跟随第一个提交的历史记录到达的提交合并时,Git会通过向前移动指针来简化操作,因为没有任何需要合并的不同工作 - 这被称为“快进”。
更多信息请参见:3.2 Git分支 - 基本分支和合并 换句话说,
如果主分支没有发生分歧,Git将不会创建新的提交,而只是将主分支指向功能分支的最新提交。这就是“快进”。
在快进合并中,不会有任何“合并提交”。

3
这是否意味着“让本地 HEAD 成为远程 HEAD”? - Victor
@Victor 我也是这样理解的。意思是只有在本地主分支与远程主分支保持同步时,才能提交更改。 - Abdel Aleem

93
在 Git 中,“快进”指的是以一种使其新值成为先前值的直接后代的方式更新 HEAD 指针。换句话说,先前的值是父项、祖父项或曾祖父项等。
当新的 HEAD 相对于要集成的流处于分歧状态时,无法进行快进。例如,您在 master 上并有本地提交,并且 git fetch 已将新的上游提交带入 origin/master。该分支现在与其上游分开了,并且无法进行快进:您的 master HEAD 提交不是 origin/master HEAD 的祖先。要仅重置 masterorigin/master 的值会放弃您的本地提交。这种情况需要一次 rebase 或 merge。
如果本地的 master 没有更改,那么可以进行快进:简单地更新到最新的 origin/master 所指向的相同提交。通常,在没有本地提交的情况下,无需采取任何特殊步骤即可进行快进;它是由mergerebase执行的。
“快进”意味着在目标分支上回放所有提交并将其设置为该分支上的最新提交,这样假定是错误的。这被称为“rebase”,而快进是一种特殊情况,其中没有提交被重演(目标分支有新提交,并且目标分支的历史记录未被重写,以便目标分支上的所有提交都具有当前提交作为祖先)。

2
注意讲解rebase的内容! - benzkji

6
想象一下有一个分支:
主分支:A -> B ->
它上面有两个提交,A和B。还有另外一个功能分支,从B开始,它的提交历史如下:
功能分支:C -> D -> E
所以现在看起来是这样的:
`A--->B`
     `C--->D--->E `

所以,当您想要合并它时,可以通过快进式合并将头从B移动到E,并将特性分支合并到主分支中,看起来像这样:A--->B--->C--->D--->E,其中头部在E处。
Atlassian的这个例子非常好:Atlassian example Atlassian Example 但正如例子中提到的,只有在分支没有发散的情况下才可能这样做,否则传统的合并或--no-ff会起作用。 另一个好例子

-16

我使用了“git rebase”,它起作用了。


2
目前你的回答不够清晰,请编辑并添加更多细节,以帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何编写好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接