当快进可用时,Git变速互动而不是挤压

时间:2011-05-20 11:55:56

标签: git

我有一个来自master的分支,有三个更改,并希望将其重新绑定到master。例如:

$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 + no squashing)。

我也尝试过(在dev分支上)

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

但实际上这是一种痛苦,我必须知道为HEAD~X部分进行压扁的次数。

脚注: 这对我来说很重要的原因是,这个被压扁的变更集将在gerrit中进行审核。如果它们是分开的,则无法进行审核。

1 个答案:

答案 0 :(得分:3)

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

您获得noop的原因是git rebase尝试重新应用当前分支中不在您提供的分支{{1}中的所有提交参数。因此,当您在<upstream>时执行git rebase -i dev时,master中的任何提交都不在master上。从本质上讲,你想要反过来做。我会做以下事情:

dev

然后你的dev分支只会有一个被压缩的提交,如果你愿意,你可以将它合并到master中。

或者,您可以使用git checkout dev git rebase -i master [... change to 'squash' all but the first of the actions ...]

git merge --squash

然后git checkout master git merge --squash dev git commit -m "The changes from dev squashed into one commit" 将有一个新的提交,它表示将master合并到一个提交中的主要压缩的结果,并且新提交将只有一个父提交,而不是合并提交