git-rebase-fork-point-master是什么意思?
我的用例是在发布前更改功能分支中的提交,例如,重写提交消息、压缩一些提交等。我不想将提交移动到新的基础。 为此,我通常会这样做:git-rebase-fork-point-master是什么意思?,git,Git,我的用例是在发布前更改功能分支中的提交,例如,重写提交消息、压缩一些提交等。我不想将提交移动到新的基础。 为此,我通常会这样做: git rebase -i HEAD~4 其中,数字“4”是手动计算我的功能分支中的提交的结果 我想知道Git是否有一个类似于“为我的功能分支中的所有提交启动交互式重基”的命令,但不要移动到较新的主控程序——就呆在原地“。我找到了git rebase的--fork point选项,并尝试了以下方法: git rebase -i --fork-point master
git rebase -i HEAD~4
其中,数字“4”是手动计算我的功能分支中的提交的结果
我想知道Git是否有一个类似于“为我的功能分支中的所有提交启动交互式重基”的命令,但不要移动到较新的主控程序
——就呆在原地“。我找到了git rebase
的--fork point
选项,并尝试了以下方法:
git rebase -i --fork-point master
但是,这没有任何明显的效果,其行为与git-rebase-i master的行为相同
相反,这满足了我的需要:
git rebase -i $(git merge-base --fork-point master)
我在
git-rebase
文档中阅读了--fork-point
的文档,但不太明白为什么它没有达到我预期的结果。有人能解释一下吗?它没有导致您预期的结果,因为--fork point
与决定新提交的基础无关[1]
因此,默认情况下,新提交的基础是上游(master
,在本例中),而--fork point
不影响这一点
(作为参考,--fork point
所做的是,它使用reflogs来细化“猜测”应该重写哪些提交的计算。根据我的经验,这并不总是非常有用的。)
您的两个选项是使用合并基作为上游(如您所述),或者使用--to
选项显式设置新基(在本例中,将其设置为与原始基匹配)
[1] -请记住,即使在概念上您正在编辑提交,实际上rebase始终会写入新的提交-除非它什么也不做。因此,当它“编辑”一个提交时,它确实会创建与旧提交类似但经过编辑的新提交。我希望下面更简单的调用能够满足您的需要
git rebase -i $(git merge-base HEAD master)
的文档显示,该选项非常有用,但在复杂的历史背景下。您的问题并不表明您已经做了大量的历史重写,因此对于您的案例来说,--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主题
旨在帮助解决这种情况。它不仅考虑了B,还考虑了B0、B1和B2(即存储库的reflog知道的远程跟踪分支的旧提示),以查看主题分支是在哪个提交分支上生成的,并找到B0,从而允许您仅重播主题上的提交,不包括另一方后来丢弃的提交
在git-rebase--fork-point
和git-merge-base--fork-point
之间建立连接
当--fork point
处于活动状态时,将使用forkpoint而不是
上游,以计算重新基址的提交集,其中forkpoint是
git merge-base --fork-point <upstream> <branch>
git merge base--分叉点
指挥部。(见……)
Git 2.24,——保持基本状态
:
“git-rebase--keep-base”试图找到原始基址
主题被重新设置基址,并在同一基础上重新设置基址,
在运行“git rebase-i”(及其有限的
变体“git-rebase-x”)
听起来它可能是OP中用例的解决方案,但我还没有尝试。谢谢,“关于分叉点模式的讨论”一节对此进行了很好的解释。我不欣赏它仅仅通过阅读git-rebase
文档所做的事情。