如何在不计算提交次数的情况下,以交互方式独立地重新设置git主题分支的基础?

如何在不计算提交次数的情况下,以交互方式独立地重新设置git主题分支的基础?,git,rebase,git-rebase,Git,Rebase,Git Rebase,如果我有这样的分支和主题: A -- B -- C -- D (master) \ W -- X -- Y -- Z (topic) 我需要通过各种修正、挤压、修正等操作“topic”上的提交,我通常会签出“topic”并运行git-rebase-I。假设我这样做了,我把Z压缩成Y,所以它作为一个唯一的提交消失了。git rebase-i将默认为在master的头上重定基址,因此我将得到: A -- B -- C -- D (master)

如果我有这样的分支和主题:

A -- B -- C -- D (master)
     \
      W -- X -- Y -- Z (topic)
我需要通过各种修正、挤压、修正等操作“topic”上的提交,我通常会签出“topic”并运行
git-rebase-I
。假设我这样做了,我把Z压缩成Y,所以它作为一个唯一的提交消失了。
git rebase-i
将默认为在master的头上重定基址,因此我将得到:

A -- B -- C -- D (master)
               \
                W -- X -- YZ
现在,我通常不希望主节点上的新提交在我的主题分支上可见(例如,可能会导致昂贵的重新编译)

问题是在“主题”上发布git rebase-i HEAD~4。太好了,这让我得到了我真正想要的,Y和Z都被压扁了,主题仍然源于“B”

A -- B -- C -- D (master)
     \
      W -- X -- YZ (topic)
然而,我不喜欢的是,我需要手动计算主题中的提交数量。这可能很大,而且肯定会改变,所以我不能从shell历史记录中重新运行它。每次我想这样做时,我都需要运行'git log',计算提交次数,编辑命令,等等,并且我总是'rebase-I'

我如何在不需要手动计算主题分支上的提交次数以合成“HEAD~N”的情况下实现相同的效果?换句话说,我需要一个非上下文相关的命令,这意味着在当前主题分支上以交互方式重新设置所有提交的基础,而无需将它们迁移到主机的头部


如果它的形式是
git rebase-i$(git…
,那就好了,因为我只是计划根据需要将此命令别名或从历史记录中恢复它,但是,如果可能的话,我希望它不提及主题分支的名称,由于这再次使命令上下文敏感,因此在更改主题分支时需要对其进行编辑。

您可以在创建
主题
分支的位置获得提交

git merge-base topic master
在一个命令中,这是

git rebase -i `git merge-base topic master`
这将实现您想要的功能:从
主题的开始提交以交互方式重新设置基础

如果您希望它不包含任何分支名称,并且已正确设置了上游分支,您还可以使用:

git rebase -i `git merge-base HEAD @{u}`

好的,这非常接近,但它仍然依赖于上下文(具有当前分支的名称)。有没有一种方法也可以摆脱它呢?事实上,它还依赖于上下文,因为它提到了“master”。理想情况下,它既不会提到当前分支机构的名称,也不会提到其母公司的名称。我已经接受了你的答案,因为它让我走上了正确的道路。我的最后一个命令是:
git-rebase-i$(git-merge-base$(git-rev-parse——符号全名——abbrev-ref-HEAD)$(git-rev-parse——符号全名——abbrev-ref{u}))
为什么不直接运行
git-rebase-i`git-merge-base-HEAD{u}
?@Chronial,因为我是在谷歌上拼凑出来的,不是因为对我使用的命令有深刻的理解?你的答案在这里是最好的,这正是我想要的。