2012-05-25 23 views
1

我有這個如何在Git中結合兩個提交?

* [cf0149e] (HEAD, branch_2) more editing 
* [8fcc106] some edit 
| 
| * [59e643e] (branch_2b) branch 2b 
|/
|/ 
| * [0f4c880] (branch_2_a) branch 2a 
|/
|/ 
* [a74eb2a] checkout 1 
* [9a8dd6a] added branch_2 line 
| 
| 
| * [bb903de] (branch_3) branch 3 
|/ 
| 
| * [674e08c] (branch_1) commit 1 
| * [7d3db01] added branch_1 line 
|/ 
* [328454f] (0.0.0) test 

我想這兩個結合:

* [a74eb2a] checkout 1 
* [9a8dd6a] added branch_2 line 

進入一個

* [a74eb2a] This is old [a74eb2a] + [9a8dd6a] 

我已經試過了我不在乎提更多的排列:復位,重新編號,壁球,編輯。似乎無法將其拉下。每當我成功合併它們時,只有一個分支存在合併。例如,「branch_2」將以位於HEAD〜2的期望組合結束。但是,「branch_2b」和「branch_2_a」仍然指向我要合併的兩個提交。換句話說,我最終得到了一個新的提交,即合併了兩個原始提交。我想要的是讓這兩個提交中的所有分支現在都引用新的統一提交。

回答

2

擠壓這兩次提交後,您會擁有自壁球一個全新的承諾和歷史,所謂的完全是另一回事:

* [cf0149e] (HEAD, branch_2) more editing 
* [8fcc106] some edit 
| 
| * [59e643e] (branch_2b) branch 2b 
|/
|/ 
| * [0f4c880] (branch_2_a) branch 2a 
|/
|/ 
* [a74eb2a] checkout 1 
* [9a8dd6a] added branch_2 line 
| 
| * [cf0149e'] (HEAD', branch_2') more editing (post-squash rebase) 
| * [8fcc106'] some edit (post-squash rebase) 
| * [SQUASHED] "checkout 1" + "added branch_2 line" 
|/ 
| 
| * [bb903de] (branch_3) branch 3 
|/ 
| 
| * [674e08c] (branch_1) commit 1 
| * [7d3db01] added branch_1 line 
|/ 
* [328454f] (0.0.0) test 

注意,其他現存的分支不受影響;那是因爲你所做的全部都是一個新的壓縮提交 - 它不會改變任何其他的歷史。

您的HEAD現在指向cf0149e',它將有一個新的SHA1哈希值,因爲您已更改其歷史記錄。現在

,您可以rebase其他分支,一個接一個,在SQUASHED,因爲這是他們分支點,產生:

* [cf0149e] (HEAD, branch_2) more editing 
* [8fcc106] some edit 
| 
| * [59e643e] (branch_2b) branch 2b 
|/
|/ 
| * [0f4c880] (branch_2_a) branch 2a 
|/
|/ 
* [a74eb2a] checkout 1 
* [9a8dd6a] added branch_2 line 
| 
| * [cf0149e'] (HEAD', branch_2') more editing (post-squash rebase) 
| * [8fcc106'] some edit (post-squash rebase) 
| | 
| | * [59e643e] (branch_2b') branch 2b (rebased on SQUASHED) 
| |/
| |/ 
| | * [0f4c880'] (branch_2_a') branch 2a (rebased on SQUASHED) 
| |/
| |/ 
| * [SQUASHED] "checkout 1" + "added branch_2 line" 
|/ 
| 
| * [bb903de] (branch_3) branch 3 
|/ 
| 
| * [674e08c] (branch_1) commit 1 
| * [7d3db01] added branch_1 line 
|/ 
* [328454f] (0.0.0) test 

老史現在是不相干的,所以我們真的有:

* [cf0149e'] (HEAD', branch_2') more editing (post-squash rebase) 
* [8fcc106'] some edit (post-squash rebase) 
| 
| * [59e643e] (branch_2b') branch 2b (rebased on SQUASHED) 
|/
|/ 
| * [0f4c880'] (branch_2_a') branch 2a (rebased on SQUASHED) 
|/
|/ 
* [SQUASHED] "checkout 1" + "added branch_2 line" 
| 
| * [bb903de] (branch_3) branch 3 
|/ 
| 
| * [674e08c] (branch_1) commit 1 
| * [7d3db01] added branch_1 line 
|/ 
* [328454f] (0.0.0) test 
+0

好的,我明白了。這就是我在玩了一整天的各種想法之後開始懷疑的事情。這樣做後清除舊的(不相關的)歷史的最好方法是什麼? –

+0

你不必!只要沒有分支指向該歷史的任何部分,它就如同走了一樣好,最終Git將垃圾收集它。 – Ashe