我在一个分支上有 8 个提交,我想通过电子邮件发送给一些尚未了解 git 的人。到目前为止,我所做的一切要么给我 8 个补丁文件,要么开始为分支历史记录中的每个提交提供补丁文件,从一开始。我使用 git rebase --interactive 来压缩提交,但现在我尝试的一切从一开始就给了我无数的补丁。我究竟做错了什么?

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

解决方案

我建议在一次性分支上执行此操作,如下所示。如果您的提交位于“换行符”中分支,你已经切换回你的“主人”已经分支了,这应该可以解决问题:

[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

希望这有帮助!

其他提示

只需再添加一个解决方案: 如果你改用它:

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

然后它仍然是8个补丁...但它们都将在一个补丁文件中,并将作为一个补丁:

git am < my_new_patch.diff

我总是在你的例子中使用git diff,比如

git diff master > patch.txt

这是 Adam Alexander 答案的改编,以防您的更改发生在主分支中。这会执行以下操作:

  • 从我们想要的点创建一个新的一次性分支“tmpsquash”(查找运行“git --log”或使用 gitg 的 SHA 密钥)。选择您想要成为 tmpsquash head 的提交,master 中之后的提交将是压缩的提交)。
  • 合并从 master 到 tmpsquash 的更改。
  • 将压缩的更改提交给 tmpsquash。
  • 使用压缩的提交创建补丁。
  • 返回master分支

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 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次提交

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

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方法输出的组合提交消息。例如,要在commit abcd 1234 之间创建补丁:

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

处理非文本文件时,不要忘记 git diff - binary 参数,例如图片或视频。

基于Adam Alexander的回答:

git checkout newlines
## must be rebased to master
git checkout -b temporary
# squash the commits
git rebase -i master
git format-patch master
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top