2010-04-29 81 views
40

我目前工作的一個分支,並希望一些提交合併到其他分支:重新排序提交

a-b-c-d-e-f-g (branchA) 
/
--o-x-x-x-x-x-x-x-x-x-x (master) 
    \ 
    x-x-x-x-x (branchB) 

(字母表示承諾,而「X」是無關的提交。)

但是我注意到集合一些提交是個好主意。我想「連接」提交a,d,e和g到一個補丁並將其提交給主控。提交b和f應該作爲一個提交給branchB。有沒有一個很好的'git'-ish方法來實現它?

+4

這兩個答案已經給出提正確的命令,但我認爲與基本任務,因爲這一個,它的值得在StackOverflow上有真正的指示,所以我已經發布了一些。 (我很驚訝,我找不到以前需要鏈接的問題。) – Cascabel 2010-04-29 21:10:13

回答

0

git rebase是你想要的。查看--interactive選項。

+0

請在您的鏈接中添加相關詳細信息,以提供一個完整的,自包含的答案。 SO對「僅鏈接答案」皺眉。 – SherylHohman 2018-02-09 18:37:43

69

您正在查找的命令是git rebase,特別是-i/--interactive選項。

我打算假設您希望在分支A上留下提交c,並且您確實意味着您要將其他提交移動到其他分支,而不是合併,因爲合併非常簡單。讓我們通過操縱分支A.

git rebase -i <SHA1 of commit a>^ branchA 

^意味着先前的承諾,所以這個命令的意思是衍合分支使用在提交前「一」爲基礎一個開始。 Git會爲您提供此範圍內的提交列表。重新排序,並告訴混帳壁球合適的:

pick c ... 
pick a ... 
squash d ... 
squash e ... 
squash g ... 
pick b 
squash f 

現在,歷史應該是這樣的:

c - [a+d+e+g] - [b+f] (branchA) 
/
--o-x-x-x-x-x-x-x-x-x-x (master) 

現在,讓我們抓住新壓扁提交B + F的branchB。

git checkout branchB 
git cherry-pick branchA # cherry-pick one commit, the tip of branchA 

與同爲A + d + E + G對主:

git checkout master 
git cherry-pick branchA^ 

最後更新branchA使其指向C:

git branch -f branchA branchA^^ 

我們現在應該有:

c (branch A) - [a+d+e+g] - [b+f] (dangling commits) 
/
--o-x-x-x-x-x-x-x-x-x-x-[a+d+e+g] (master) 
    \ 
    x-x-x-x-x-[b+f] (branchB) 

請注意,如果你有多個提交喲u想分支之間的移動,你可以使用再次衍合(非交互):

# create a temporary branch 
git branch fromAtoB branchA 
# move branchA back two commits 
git branch -f branchA branchA~2 
# rebase those two commits onto branchB 
git rebase --onto branchB branchA fromAtoB 
# merge (fast-forward) these into branchB 
git checkout branchB 
git merge fromAtoB 
# clean up 
git branch -d fromAtoB 

最後,免責聲明:這是完全有可能重新排序提交以這樣的方式,一些不再幹淨的應用。這可能是因爲你選擇了一個錯誤的命令(在提交補丁前提交補丁)。在這種情況下,您需要中止rebase(git rebase --abort)。否則,您將不得不智能修復衝突(就像處理合並衝突一樣),添加修復程序,然後運行git rebase --continue繼續前進。這些說明也由衝突發生時打印的錯誤消息提供。

+0

不是'git branch -f branchA branchA ^^'錯誤後的圖嗎?也就是說,不應該在這一點上指向c,所以圖的第一行是'c(branchA)'而不是'c - [a + d + e + g] ​​ - [b + f]( branchA)'? – ntc2 2012-06-05 05:27:43

+0

@enoksrd:是的,有一個錯誤,但你的編輯有錯誤。當我在這裏得到機會時我會解決它。 – Cascabel 2012-06-05 15:11:31