我有一个来自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中进行审核。如果它们是分开的,则无法进行审核。
答案 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
合并到一个提交中的主要压缩的结果,并且新提交将只有一个父提交,而不是合并提交