【问题标题】:Why fork-point is updated?为什么更新fork-point?
【发布时间】:2018-06-30 18:29:13
【问题描述】:

我在分支MyCurrent 上做了一些提交。然后意识到我在另一个上做它们并且保持当前分支不变。

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

git checkout -b fixes 6735ff2

并检查分支的根:

$ git merge-base --fork-point fixes
6735ff23c52338fbaafbfa1707f0bcbb1e5b9698

然后我合并(也许我应该挑选?)当前分支

$ git merge --ff-only MyCurrent
Updating 6735ff2..e1700a5
Fast-forward
...

当我再次检查form-point 时 - 它被移动了:

git merge-base --fork-point fixes
e1700a59dd

为什么更新分叉点?

【问题讨论】:

  • 顺便说一句,我想到你可能认为git merge-base --fork-point 旨在找到当前分支从某个父分支分支的点。不是——它根本不这样做,并且不能这样做,因为分支不记录它们的父级。

标签: git


【解决方案1】:

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

对于这个答案,我查看了source code。这表明 Git 查看第一个非选项参数的 reflog(称为 arg1),然后使用它使用解析为提交 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,因为你没有给。)

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

查看我对git pull --rebase lost commits after coworker's git push --force 的(相当长的)回答(向下滚动到标有“--fork-point 选项”的部分)了解更多信息。

【讨论】:

  • 您说过分支不存储有关其分叉点的信息。但是git log --graph --oneline 怎么知道分支的开始点呢?
  • 这仅适用于简单的情况。假设分支 B 在提交 S(开始)处创建,然后一个在 B 上进行 N 次提交,然后一个将 B 合并到 M,然后一个在 B 上进行更多提交,依此类推。现在,可以阅读 this 图表并猜测起点在哪里;但考虑Chris Johnsen's answer here:这些分支是从哪里开始的?
猜你喜欢
  • 2023-03-06
  • 1970-01-01
  • 2017-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-14
  • 1970-01-01
  • 2012-06-11
相关资源
最近更新 更多