如果我有分支主人和话题如下:
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 ...)
形式,那很好,因为我只是计划对此命令进行别名或根据需要从历史记录中恢复它,但是,如果可能的话,我宁愿不提及主题的名称分支,因为这再次使命令上下文敏感,我需要在更改主题分支时编辑它。
答案 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}`