如何在不计算提交的情况下以隔离方式交互式地重新绑定git主题分支?

时间:2013-02-27 18:47:03

标签: git rebase git-rebase

如果我有分支主人和话题如下:

A -- B -- C -- D (master)
     \
      W -- X -- Y -- Z (topic)

我需要使用各种修正,南瓜,修正等来操纵“主题”提交,我通常会检出“主题”并运行git rebase -i。让我说我这样做,我将Z压入Y,所以它作为一个独特的提交消失了。 git rebase -i默认会重新定位到主人的头上,所以我会得到:

A -- B -- C -- D (master)
               \
                W -- X -- YZ

现在,我实际上不希望master上的新提交在我的主题分支上变得可见(例如,可能导致昂贵的重新编译)。

recommended way to do this是在'主题'上发布git rebase -i HEAD~4。太棒了,这让我得到了我真正想要的东西,Y和Z被压扁,主题仍然来自'B'。

A -- B -- C -- D (master)
     \
      W -- X -- YZ (topic)

然而,我不喜欢的是我需要手动计算主题中的提交次数。这可能很大,肯定会改变,所以我不能只从shell历史中重新运行它。每次我想这样做,我都需要运行'git log',计数提交,编辑命令等等,并且我一直在变换-i'。

如何在不需要手动计算主题分支上的提交来合成'HEAD~N'的情况下实现相同的效果?换句话说,我想要一个非依赖于上下文的命令,这意味着交互式地修改当前主题分支上的所有提交,而不将它们迁移到master的头部。

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

1 个答案:

答案 0 :(得分:4)

您可以获得创建topic分支的提交

git merge-base topic master

所以在一个命令中,这是

git rebase -i `git merge-base topic master`

这将按照您的要求执行操作:从topic的起始提交中进行交互式重新绑定。

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

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