我的用例是在发布功能之前在功能分支中更改提交,例如,重新编写提交消息,压缩某些提交等。我不想将提交移动到一个新的基地。
为此,我通常会这样做:
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
的文档,但不太了解为什么它没有达到我的预期结果。有人可以解释一下吗?
答案 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
documentation在git rebase --fork-point
和git 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中用例的解决方案,但我还没有尝试过。