ski*_*ppy 162 git patch squash git-squash
我在一个分支上有八个提交,我想通过电子邮件发送给一些不是git开悟的人.到目前为止,我所做的每件事都给了我8个补丁文件,或者从一开始就开始给分支历史上每次提交的补丁文件.我使用git rebase --interactive来压缩提交,但是现在我尝试的所有内容从一开始就给了我数以万计的补丁.我究竟做错了什么?
git format-patch master HEAD # yields zillions of patches, even though there's
# only one commit since master
Run Code Online (Sandbox Code Playgroud)
Ada*_*der 181
我建议在一次性分支上执行此操作,如下所示.如果您的提交位于"newlines"分支中并且您已经切换回"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
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助!
Tar*_*ast 130
只是为了添加一个解决方案:如果你使用它:
git format-patch master --stdout > my_new_patch.diff
Run Code Online (Sandbox Code Playgroud)
然后它仍然是8个补丁...但它们都将在一个补丁文件中并将作为一个应用:
git am < my_new_patch.diff
Run Code Online (Sandbox Code Playgroud)
Rob*_*rco 20
我总是在你的例子中使用git diff,比如
git diff master > patch.txt
Run Code Online (Sandbox Code Playgroud)
Von*_*onC 18
如您所知,a 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
Run Code Online (Sandbox Code Playgroud)
或者,这将是一个更好的解决方案,重播所有8个提交X
(在8次提交之前提交)在新分支上
git branch delivery X
git checkout delivery
git merge --squash master
git format-patch HEAD
Run Code Online (Sandbox Code Playgroud)
这样,您只在"交付"分支上有一个提交,它代表您最近的8次提交
rec*_*rec 18
这是亚当亚历山大答案的改编,以防你的变化在主分支.这样做如下:
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)$
Run Code Online (Sandbox Code Playgroud)
最简单的方法是使用git diff
, 并添加git log
如果您想要壁球方法将输出的组合提交消息。例如,要在 commitabcd
和之间创建补丁1234
:
git diff abcd..1234 > patch.diff
git log abcd..1234 > patchmsg.txt
Run Code Online (Sandbox Code Playgroud)
然后在应用补丁时:
git apply patch.diff
git add -A
git reset patch.diff patchmsg.txt
git commit -F patchmsg.txt
Run Code Online (Sandbox Code Playgroud)
不要忘记处理非文本文件时的--binary
论点git diff
,例如图像或视频。
两个标签之间的格式补丁:
git checkout <source-tag>
git checkout -b <tmpsquash>
git merge --squash <target-tag>
git commit -a -m "<message>"
git format-patch <source-tag>
Run Code Online (Sandbox Code Playgroud)