你如何压缩与git格式补丁一个补丁?

我有一个分支上有8个提交,我想通过电子邮件发送给一些不受启发的人。 到目前为止,我所做的每件事都给了我8个补丁文件,或者从开始的时候开始给我分支历史logging中每个提交的补丁文件。 我使用git rebase –interactive来压缩提交,但是现在我所尝试的所有内容都是从一开始就给我提供了无数的补丁。 我究竟做错了什么?

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

我build议在一次性分支上做这个如下。 如果你的提交是在“新行”分支,你已经切换回到你的“主”分支,这应该做的伎俩:

 [adam@mbp2600 example (master)]$ git checkout -b tmpsquash Switched to a new branch "tmpsquash" [adam@mbp2600 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(-) [adam@mbp2600 example (tmpsquash)]$ git commit -a -m "My squashed commits" [tmpsquash]: created 75b0a89: "My squashed commits" 1 files changed, 2 insertions(+), 0 deletions(-) [adam@mbp2600 example (tmpsquash)]$ git format-patch master 0001-My-squashed-commits.patch 

希望这可以帮助!

只是为了增加一个解决scheme:如果你使用这个,而不是:

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

然后它仍然是8个补丁…但是他们都将在一个补丁文件中,并将作为一个适用于:

 git am < my_new_patch.diff 

我总是在你的例子中使用git diff,就像

 git diff master > patch.txt 

正如你所知道的,一个git format-patch -8 HEAD会给你八个补丁。

如果您希望8次提交显示为1次,并且不介意重写分支历史( ooXABCDEFGH ),则可以:

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

或者,这将是一个更好的解决scheme, 重放所有8个提交从X (8提交之前的提交)在一个新的分支

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

这样,你只有一个提交“交付”分支,它代表你所有的最后8个提交

这是亚当·亚历山大答案的改编,以防你的变化在主分支。 这样做如下:

  • 从我们想要的地方创build一个新的一次性分支“tmpsquash”(查找运行“git -log”的SHA键或者使用gitg)。select你想成为tmpsquash头的提交,之后在master中的提交将是被压扁的承诺)。
  • 合并从主到tmpsquash的变化。
  • 将压扁的更改提交给tmpsquash。
  • 用压扁的提交创build补丁。
  • 回到主分支

 laura@rune:~/example (master)$ git branch tmpsquash ba3c498878054e25afc5e22e207d62eb40ff1f38 laura@rune:~/example (master)$ git checkout tmpsquash Switched to branch 'tmpsquash' laura@rune:~/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(-) laura@rune:~/example (tmpsquash)$ git commit -a -m "My squashed commits" [test2 6127e5c] My squashed commits 11 files changed, 212 insertions(+), 59 deletions(-) laura@rune:~/example (tmpsquash)$ git format-patch master 0001-My-squashed-commits.patch laura@rune:~/example (tmpsquash)$ git checkout master Switched to branch 'master' laura@rune:~/example (master)$ 

两个标签之间的格式化补丁:

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

最简单的方法是使用git diff ,并在git log添加如果你想要输出squash方法的组合提交信息。 例如,要在提交abcd1234之间创build补丁:

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

然后在应用补丁时:

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

在处理非文本文件(例如图像或video)时,不要忘记git diff--binary参数。

基于亚当·亚历山大的答案:

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