注意:分支名称只是指向(单个)提交的指针。我们倾向于将其视为“分支”——整个提交链——是通过从每个提交向后工作到其父级来找到的。父母只记录在提交本身中,而不是任何分支名称中。将分支名称视为粘贴到某个特定提交上的便签可能会有所帮助。我无法在文本中绘制它,所以我将其绘制为下面的箭头 (<--)。
将您的图像转换为文本,旋转它,做出一两个假设,并截断一点以很好地适应这个答案,您正在展示:
o...
/
--o--M--o--o--o--o--o--o--o--o--o--o--o <-- mobile
/
---o <-- optim, origin/optim
(这里“较新”的东西在右边,而不是在上面,并且省略了各种提交消息的文本。)
“快进”发生在以下情况:1
- 你“在一个分支上”,即
HEAD 是一个对分支名称的符号引用
- 您要求 git 与另一个提交合并(按名称或 SHA1 ID;通常按分支名称)
- 并且,“合并”提交是“直接”在分支现在所在的位置,即,可以简单地将分支名称沿着一组“后代”链接滑动以到达那里。 (更准确地说,
HEAD 提交是“待合并”提交的祖先。)
由于optim 指向一个提交,其单个后代是合并提交M,并且该提交对于右侧的每个小o 都有一个后代,git 可以将分支名称optim 向前滑动提交链。
因此:
$ git checkout optim; git merge mobile
将标签向上和向右滑动到 M,然后再向右滑动到 mobile 指向的位置,给出:
o...
/
--o--M--o--o--o--o--o--o--o--o--o--o--o <-- mobile, optim
/
---o <-- origin/optim
如果您想“手动”执行此操作,而不做任何其他事情,甚至没有“在”该分支上,您可以告诉 git“请重新指向分支名称 optim 以定位与姓名mobile:
$ git branch -f optim mobile
-f(或--force)标志表示继续更改现有标签的目标提交,而不是出错。
此命令不检查操作是否为快进。 (当然,普通的git merge 只检查它来决定是进行快进合并还是“真正的”合并。但是,您可以要求git merge 执行--ff-only,即,如果操作出错不是快进。)
1Fetch 和 push 也应用相同类型的“快进”概念,所以这是“何时”而不是“仅当”。