2011-05-20 54 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