Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
git-rebase-fork-point-master是什么意思?_Git - Fatal编程技术网

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
文档所做的事情。