4

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

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 上的新提交在我的主题分支上可见(例如,可能会导致昂贵的重新编译)。

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

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

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

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

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

4

1 回答 1

4

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

git merge-base topic master

所以在一个命令中,这是

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

这将做你想做的事:从topic.

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

git rebase -i `git merge-base HEAD @{u}`
于 2013-02-27T18:51:08.783 回答