git rebase --fork-point master是什么意思?

时间:2019-09-06 13:00:11

标签: git

我的用例是在发布功能之前在功能分支中更改提交,例如,重新编写提交消息,压缩某些提交等。我不想将提交移动到一个新的基地。

为此,我通常会这样做:

git rebase -i HEAD~4

其中的数字“ 4”是在我的功能分支中手动计算提交次数的结果。

我想知道Git是否具有这样的命令:“为功能分支中的所有提交启动交互式变基,但不要移动到新的master –只留在原处” 。我找到了--fork-point的{​​{1}}选项,并尝试了以下方法:

git rebase

但是,这没有任何明显的效果,其行为与git rebase -i --fork-point master 相同。

相反,这满足了我的需求:

git rebase -i master

我在git rebase -i $(git merge-base --fork-point master) 文档中阅读了--fork-point的文档,但不太了解为什么它没有达到我的预期结果。有人可以解释一下吗?

3 个答案:

答案 0 :(得分:2)

这并没有达到您的预期结果,因为--fork-point与确定新提交的基础[1]无关。

因此默认设置是将新提交基于上游(在这种情况下为master),而--fork-point不会对此产生影响。

(作为参考,--fork-point所做的是,它使用引用日志来优化计算以“猜测”应重写的提交。这并不总是-或以我的经验,甚至通常-非常有用。)

您的两个选项是使用合并基准作为上游(如您所描述的),或使用--onto选项显式设置新基准(在这种情况下,将其设置为与原始基准匹配)。 / p>


[1]-请记住,即使从概念上来说,您正在编辑提交,但真正的变基总是写新的提交-除非什么都不做。因此,当它“编辑”提交时,它实际上会创建类似于旧提交但已编辑的新提交。

答案 1 :(得分:2)

我希望下面的简单调用可以完成您所需的操作。

git rebase -i $(git merge-base HEAD master)

git merge-base --fork-point的文档显示,在复杂的历史记录中,该选项可能非常有用。您的问题并不表示您已经进行了大量的历史记录重写,因此--fork-point可能对您的情况有些过分。

  

讨论分叉模式

     

处理使用创建的主题分支之后

git switch -c topic origin/master
     

远程跟踪分支机构origin/master的历史   可能已经倒回并重建,导致了这种形状的历史:

                 o---B2
                /
---o---o---B1--o---o---o---B (origin/master)
        \
         B0
          \
           D0---D1---D (topic)
     

其中origin/master曾经指向提交 B0 B1 B2 和   现在它指向 B ,并且您的主题分支已在其顶部启动   当origin/master位于 B0 时,您建立了三个提交,   在其顶部的 D0 D1 D 。想象一下,您现在想在更新的origin/master之上重新建立您在该主题上所做的工作。

     

在这种情况下,git merge-base origin/master topic将返回   上图中 B0 的父级,但是B0^..D不在   您想在 B (包括 B0 ,   那不是你写的这是另一方放弃的承诺   当它的尖端从 B0 移到 B1 时)。

     

git merge-base --fork-point origin/master topic旨在在这种情况下提供帮助。它不仅考虑了B,还考虑了B0,B1和B2(即,您的存储库的reflog知道的远程跟踪分支的旧技巧),以了解在哪个commit上构建了您的主题分支并找到了B0,从而仅允许重播有关您主题的提交,不包括后来被丢弃的另一端的提交。

git rebase --fork-point documentationgit rebase --fork-pointgit merge-base --fork-point之间建立连接。

  

启用--fork-point时,将使用 forkpoint 代替   上游来计算要变基的提交集,其中 forkpoint

的结果
git merge-base --fork-point <upstream> <branch>
     

命令。 (请参见git-merge-base。)

答案 2 :(得分:0)

Git 2.24 will introduce a new option--keep-base

  

“ git rebase --keep-base”试图找到原始库     将主题重新设置为基础,并在同一基础上进行重新基础,     这在运行“ git rebase -i”(及其限制)时很有用     变体“ git rebase -x”)。

听起来可能是OP中用例的解决方案,但我还没有尝试过。