2011-05-20 59 views
2

我有一个分支从主变化三个变化,并希望将其重新分配给主。例如:Git rebasing交互式不挤压快进时可用

$git checkout master 
$git branch dev && git checkout dev 
$<do 3 commits> 
$git checkout master 
$git rebase dev -i 

正常情况下-i会给我3次提交并允许我压扁。然而,在这种情况下,它只是“noop”,当rebase完成时,我看到三个提交移到了master。我想这里虽然祖先没有分歧,但是快速的前进是可能的,所以这就是发生了什么。但我想压扁提交。

我试过使用--no-ff,但它和我原来的情况完全一样(noop +不压缩)。

我试着也做的(而在Dev分支)

$git rebase -i HEAD~3 
$git checkout master 
$git rebase dev 

但是,这是一个痛苦真的,我要知道有多少提交壁球的HEAD〜X部分。

脚注: 这对我来说很重要的原因是,它是这个压扁的变更集,将在gerrit中进行审查。如果他们是分开的,它使审查变得不可能。

回答

3

我不太清楚你为什么要在你的问题中做一些事情,例如在提交之前,你真的不是指$git branch dev && git checkout dev吗?无论如何,使用你的版本,你只需在master上创建它们。 (顺便说一句,如果我是正确的,你可以做git checkout -b dev作为快捷方式。)

你只会得到一个空操作,是git rebase试图重新所有提交的当前分支之所以不在您提供的分支为<upstream>参数。所以,当你在master上执行git rebase -i dev时,在master中没有任何不在dev上的提交。本质上,你想要反过来做。我会做到以下几点:

git checkout dev 
git rebase -i master 
[... change to 'squash' all but the first of the actions ...] 

那么你的Dev分支将只是一个压扁承诺,你可以合并到这主如果你喜欢。

或者,你可以使用git merge --squash

git checkout master 
git merge --squash dev 
git commit -m "The changes from dev squashed into one commit" 

然后master将有一个新的承诺,表示合并dev到主压扁成一个承诺的结果,而新的承诺,只会有一个父,而不是合并提交。

+0

这里的关键实际上是使用'master'作为rebase的基础,而不是一些专门命名的commit。即使主人太远了,你也知道你可能想要压扁的东西从那时开始。 (另外,'merge --squash'还是自动提交吗?) – Cascabel 2011-05-20 12:11:27

+0

@Jefromi:在我最近使用的所有版本的git中,'git merge --squash'只是对变化进行阶段化。那是不是曾经是这种情况? – 2011-05-20 12:13:20

+0

在引入'git merge --squash'的提交中添加的文档(7d0c68871a8)也表示“实际上不提交提交”。 – 2011-05-20 12:16:33