2009-03-05 172 views
144

我在一個分支上有8個提交,我想通過電子郵件發送給一些不是git開明的人。到目前爲止,我所做的每件事都會給我8個補丁文件,或者從開始的時候開始爲分支歷史記錄中的每個提交提供補丁文件。我使用git rebase --interactive來壓縮提交,但現在我嘗試的所有內容都是從一開始就爲我提供了無數的補丁。我究竟做錯了什麼?你如何使用git format-patch來壓縮一個補丁?

git format-patch master HEAD # yields zillions of patches, even though there's 
          # only one commit since master 
+0

我很好奇你將在下面的命題中使用哪種方法。讓我們知道;) – VonC 2009-03-06 06:48:03

+3

我將使用Rob Di Marco建議的git diff。但是我已經離開了兩週的工作,剛剛目睹了我第二個女嬰的誕生,所以在我使用它之前會有一段時間! :) – skiphoppy 2009-03-06 19:56:49

+2

我很想看到git format-patch --squash master HEAD – schoetbi 2011-03-10 10:44:40

回答

168

我建議在一次性分支上進行如下操作。如果你的提交是在「換行」分支,您可以切換回你的「主人」分支已經,這應該做的伎倆:

[[email protected] example (master)]$ git checkout -b tmpsquash 
Switched to a new branch "tmpsquash" 

[[email protected] example (tmpsquash)]$ git merge --squash newlines 
Updating 4d2de39..b6768b2 
Fast forward 
Squash commit -- not updating HEAD 
test.txt | 2 ++ 
1 files changed, 2 insertions(+), 0 deletions(-) 

[[email protected] example (tmpsquash)]$ git commit -a -m "My squashed commits" 
[tmpsquash]: created 75b0a89: "My squashed commits" 
1 files changed, 2 insertions(+), 0 deletions(-) 

[[email protected] example (tmpsquash)]$ git format-patch master 
0001-My-squashed-commits.patch 

希望這有助於!

18

正如你所知道的,git format-patch -8 HEAD會給你八個補丁。

如果你希望你的8個提交呈現爲一個,並且不介意重寫你的分支(o-o-X-A-B-C-D-E-F-G-H)的歷史,你可以:

git rebase -i 
// squash A, B, C, D, E ,F, G into H 

,或者這將是一個更好的解決方案,重播從X所有8個提交(你8個提交前提交)一個新的分支

git branch delivery X 
git checkout delivery 
git merge --squash master 
git format-patch HEAD 

這樣的話,你只需要在「交貨」分支一個承諾,它代表所有你的最後8℃ ommits

+0

`git merge master`只是做一個快進,不會壓縮到一個。更改爲`git merge --squash master`以獲取所有提交在演出區域壓扁並可見的提交。您的流量將適用於此更改。 (我使用的是git 2.1.0版。) – Stunner 2016-01-13 00:30:41

+0

@Stunner好點。我編輯了答案。 – VonC 2016-01-13 05:48:43

21

我一直在你的例子使用git的差異等等,像

git diff master > patch.txt 
120

只是多了一個解決方案添加到鍋: 如果你用這個代替:

git format-patch master --stdout > my_new_patch.diff 

那麼它會仍然是8個補丁...但它們都將在單個補丁文件中並且將與之一起應用:

git am < my_new_patch.diff 
17

這是亞當亞歷山大答案的改編,以防您的更改在主分支中。這做到以下幾點:。

  • 創建一個從我們想要的點(查找運行「混帳--log」或gitg的SHA密鑰生成新的一次性分支「tmpsquash」選擇你想提交tmpsquash頭,那麼在master中的提交將被壓扁的提交)。
  • 合併從主機到tmpsquash的更改。
  • 將壓扁的更改提交給tmpsquash。
  • 用壓扁的提交創建補丁。
  • 去回主分支

[email protected]:~/example (master)$ git branch tmpsquash ba3c498878054e25afc5e22e207d62eb40ff1f38 
[email protected]:~/example (master)$ git checkout tmpsquash 
Switched to branch 'tmpsquash' 
[email protected]:~/example (tmpsquash)$ git merge --squash master 
Updating ba3c498..40386b8 
Fast-forward 
Squash commit -- not updating HEAD 

[snip, changed files] 

11 files changed, 212 insertions(+), 59 deletions(-) 
[email protected]:~/example (tmpsquash)$ git commit -a -m "My squashed commits" 
[test2 6127e5c] My squashed commits 
11 files changed, 212 insertions(+), 59 deletions(-) 
[email protected]:~/example (tmpsquash)$ git format-patch master 
0001-My-squashed-commits.patch 
[email protected]:~/example (tmpsquash)$ git checkout master 
Switched to branch 'master' 
[email protected]:~/example (master)$ 
0

基於亞當亞歷山大的回答是:標籤

git checkout newlines 
## must be rebased to master 
git checkout -b temporary 
# squash the commits 
git rebase -i master 
git format-patch master 
4

格式補丁之間有兩個:

git checkout <source-tag> 
git checkout -b <tmpsquash> 
git merge --squash <target-tag> 
git commit -a -m "<message>" 
git format-patch <source-tag> 
4

最簡單的方法是使用git diff,a如果你想要壓縮方法輸出的組合提交信息,可以在git log中添加。應用修補程序時

git diff abcd..1234 > patch.diff 
git log abcd..1234 > patchmsg.txt 

然後:例如,創建abcd1234之間提交補丁

git apply patch.diff 
git add -A 
git reset patch.diff patchmsg.txt 
git commit -F patchmsg.txt 

與非文本文件打交道時,不要忘了--binary參數git diff,例如圖像或視頻。