Git 为什么要更新分叉点?

Git 为什么要更新分叉点?,git,Git,我在分支MyCurrent上做了一些提交。然后意识到我在另一个分支上执行这些操作,并且保持当前分支不变 因此,我在根点(我应该在那里开始新分支)创建新分支: 并检查分支的根: $ git merge-base --fork-point fixes 6735ff23c52338fbaafbfa1707f0bcbb1e5b9698 然后我合并(也许我应该挑选?)当前的分支 $ git merge --ff-only MyCurrent Updating 6735ff2..e1700a5 Fast-

我在分支
MyCurrent
上做了一些提交。然后意识到我在另一个分支上执行这些操作,并且保持当前分支不变

因此,我在根点(我应该在那里开始新分支)创建新分支:

并检查分支的根:

$ git merge-base --fork-point fixes
6735ff23c52338fbaafbfa1707f0bcbb1e5b9698
然后我合并(也许我应该挑选?)当前的分支

$ git merge --ff-only MyCurrent
Updating 6735ff2..e1700a5
Fast-forward
...
当我再次检查
形状点
时,它将被移动:

git merge-base --fork-point fixes
e1700a59dd
为什么要更新fork-point?

git merge base--fork-point使用reflog:

为了得到这个答案,我看了一下。这表明Git在第一个非选项参数调用此arg1的reflog中查找,然后使用它查找合并基,使用解析为提交ID的下一个此类参数arg2,完全忽略任何其他参数。基于此,
git merge base--fork point$arg1$arg2
的结果基本上是5以下内容的输出:

git merge-base $arg2 $(git log -g --format=%H $arg1)
由于
git merge--ff only MyCurrent
更新了reflog,添加了一个新的提交散列,因此
--fork point
值会发生变化也就不足为奇了。(注意这里的
arg2
默认为
HEAD
,因为您没有给出一个。)

(注:脚注解释了这些结果的不同之处,并给出了一个例子。实际上并不完全相同。)


有关更多信息,请参阅我的(相当长的)答案(向下滚动到标记为“the
--fork point
选项”的部分)。

顺便说一句,您可能会认为
git merge base--fork point
旨在查找当前分支从某个父分支分叉的点。不是,它根本不这样做,也不能这样做,因为分支不记录它们的父分支。您说过分支不存储有关其分支起点的信息。但是,
git log--graph--oneline
如何知道分支的起始点呢?这只适用于简单的情况。假设分支B在提交S时创建(对于开始),然后一个在B上进行N次提交,然后一个将B合并到M中,然后一个在B上进行更多提交,依此类推。现在,我们可以阅读这张图表,猜测起点在哪里;但是考虑一下:这些分支是从哪里开始的呢?
git merge-base $arg2 $(git log -g --format=%H $arg1)