2013-02-27 22 views
4

如果我有分支机构主人和话题,像这样:我如何交互地重新绑定一个git主题分支而不计算提交?

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 

现在,我常常其实不想对掌握新提交成为我的话题分支可见(例如可能导致昂贵的重新编译)。

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',对提交进行计数,编辑命令等等,并且我'一直都在使用'rebase -i'。

如何在不需要手动计算主题分支上的提交以合成'HEAD〜N'的情况下实现相同的效果?换句话说,我想要一个非上下文相关的命令,它意味着交互地重新绑定当前主题分支上的所有提交,而不将它们迁移到主控头上。

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

回答

4

你可以提交,其中topic分支产生

git merge-base topic master 

因此,在一个命令,这是

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

这会做你想要什么:从起点交互式衍合犯topic

如果你想这不包含任何分支的名称,并正确设置你的上游分支,你也可以使用这个:

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

OK,这是相当接近,但它仍然是上下文相关的(有当前分支的名称)。有没有办法摆脱这一点呢? – acm 2013-02-27 18:57:42

+0

实际上,它也与上下文相关,它提到了“主”。理想情况下,它不会提及当前分支的名称或其父项的名称。 – acm 2013-02-27 19:01:33

+3

我接受了你的回答,因为它让我走上了正确的轨道。我最后的命令是这样的:'''git rebase -i $(git merge-base $(git rev-parse --symbolic-full-name --abbrev-ref HEAD)$(git rev-parse --symbolic-full -name --abbrev-ref @ {u}))''' – acm 2013-02-27 19:16:47

相关问题