2011-01-05 111 views
43

通常,我在Git中使用分支,但我不喜歡在工作樹(Git歷史記錄)中看到數百個分支。我想知道在Git中是否有一個方法在一次提交中「加入」分支中的所有提交(理想情況下使用明確的提交消息)。Git:只合並一個提交

事情是這樣的:

git checkout -b branch 
<some work> 
git commit -a -m "commit 1" 
<some work> 
git commit -a -m "commit 2" 
<some work> 
git commit -a -m "commit 3" 
git checkout master 
git SUPER-JOIN branch -m "super commit" 

在此之後,只有 「超級承諾」 將在git的日誌存在。

回答

41

這是可以做到,看到

Git merge flattening

git: squash/fixup earlier commit

+2

git merge --squash真是太棒了。我希望在2011年我更仔細地閱讀了這個;)+1 – 2013-01-06 21:22:17

+6

git merge --squash的問題在於它實際上並沒有創建合併提交。像GitHub的網絡瀏覽器的GUI不會顯示分支重新加入;一個會突然結束而另一個繼續。 – Maxpm 2013-06-12 17:54:12

66

這聽起來像你正在尋找的--squash選項git-merge:使用git rebase和壁球,或使用git merge --squash

git checkout master 
git merge --squash branch -m "super commit" 
+4

+1性感的回答! – JohnnyQ 2013-05-16 07:09:15

+0

美麗的謝謝你! – Denis 2014-01-03 19:00:50

+3

這可能在過去有效,但它不再起作用。 (git v1.7.9)輸出'Fast-forward(沒有創建任何提交; -m選項被忽略)'消息,並且留下一個未提交的更改。 '--no-ff'選項看起來很有前途,但仍然創建了與所有單獨提交的合併。 – 2014-01-15 02:00:12

13

如果你是積極的,你只想要一個承諾,並罰款從來沒有被標記爲「合併」(也許是因爲你即將與git branch -D my-squash-merged-branch刪除它,再也不想看到它)的分支,使用:

git checkout master 
git merge --squash branch-to-merge 
git commit -m "message for commit" 

然而,許多測試之後,我相信最好的方式合併分支是:

git checkout master 
git merge --no-ff branch-to-merge -m "message for commit" 

這就避免了「快進」合併是不允許指定-m "message"選項很多合併。它不是實際上提供了最初請求的單個提交,但至少可以很容易地看到分支的開始/結束,因此可以輕鬆恢復等等。一個git log將顯示所有被合併,個人提交...

commit a6672a4c3d90c35d5f39c45f307ef6b385660196 
Merge: 015f8d6 f84e029 
Author: Brian White <[email protected]> 
Date: Wed Jan 15 20:47:35 2014 -0500 

    merged something trivial 

commit f84e02915faa02afc9a31b8c93a6e7712420687d 
Author: Brian White <[email protected]> 
Date: Wed Jan 15 20:47:12 2014 -0500 

    added something also trivial 

commit 904d5b5ff00d691d63104a77d2e2ca484732a5fb 
Author: Brian White <[email protected]> 
Date: Wed Jan 15 20:46:26 2014 -0500 

    added something trivial 

commit 015f8d681bdaf65725067ee8058215cedb529dd6 
Author: Brian White <[email protected]> 
Date: Wed Jan 15 20:23:31 2014 -0500 

    optimizations to MyThing 
... 

...但如果你看看日誌(git log --graph)的,你可以看到,混帳確實認識到它作爲一個合併。

* commit a6672a4c3d90c35d5f39c45f307ef6b385660196 
|\ Merge: 015f8d6 f84e029 
| | Author: Brian White <[email protected]> 
| | Date: Wed Jan 15 20:47:35 2014 -0500 
| | 
| |  merged something trivial 
| | 
| * commit f84e02915faa02afc9a31b8c93a6e7712420687d 
| | Author: Brian White <[email protected]> 
| | Date: Wed Jan 15 20:47:12 2014 -0500 
| | 
| |  added something also trivial 
| | 
| * commit 904d5b5ff00d691d63104a77d2e2ca484732a5fb 
|/ Author: Brian White <[email protected]> 
| Date: Wed Jan 15 20:46:26 2014 -0500 
| 
|  added something trivial 
| 
* commit 015f8d681bdaf65725067ee8058215cedb529dd6 
| Author: Brian White <[email protected]> 
| Date: Wed Jan 15 20:23:31 2014 -0500 
| 
|  optimizations to MyThing 
... 

如果提交或其他活動發生在主分支,該圖表將顯示合併後的分支開始在正確的地方,在目前的頭部結合,但當然,所有提交仍將日誌與中所示來自頂部的分支承諾。

+0

像我以爲'git merge --squash'會工作。 – r0hitsharma 2014-06-03 21:26:07