Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用git格式的补丁将提交压缩到一个补丁中?_Git_Patch_Squash_Git Squash - Fatal编程技术网

如何使用git格式的补丁将提交压缩到一个补丁中?

如何使用git格式的补丁将提交压缩到一个补丁中?,git,patch,squash,git-squash,Git,Patch,Squash,Git Squash,我在一个分支上有八个提交,我想通过电子邮件发送给一些还不懂git的人。到目前为止,我所做的一切要么给我8个补丁文件,要么开始给我分支历史中每次提交的补丁文件,从时间开始。我使用git rebase-interactive来压缩提交,但现在我尝试的每件事都从一开始就给了我无数的补丁。我做错了什么 git格式的补丁主控头可以生成无数的补丁,即使有 自master之后只有一次提交 正如您已经知道的,git格式的补丁-8头将为您提供八个补丁 如果希望8次提交显示为一次提交,并且不介意重写分支o-o-X-

我在一个分支上有八个提交,我想通过电子邮件发送给一些还不懂git的人。到目前为止,我所做的一切要么给我8个补丁文件,要么开始给我分支历史中每次提交的补丁文件,从时间开始。我使用git rebase-interactive来压缩提交,但现在我尝试的每件事都从一开始就给了我无数的补丁。我做错了什么

git格式的补丁主控头可以生成无数的补丁,即使有 自master之后只有一次提交 正如您已经知道的,git格式的补丁-8头将为您提供八个补丁

如果希望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
或者,这是一个更好的解决方案,在新分支上进行8次提交之前,重播X中的所有8次提交


这样,您在传递分支上只有一次提交,它代表您最后的8次提交,我建议您在一次性分支上执行此操作,如下所示。如果您的提交在换行分支中,并且您已经切换回主分支,那么这应该可以做到:

[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 diff,所以在您的示例中

git diff master > patch.txt

只需向锅中再添加一种溶液: 如果改用此选项:

git format-patch master --stdout > my_new_patch.diff
然后仍然是8个补丁。。。但它们都将在一个补丁文件中,并将作为一个补丁文件应用于:

git am < my_new_patch.diff

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

从我们想要查找运行git-log或使用gitg的SHA密钥的位置创建一个新的一次性分支tmpsquash。选择要成为tmpsquash head的提交,在主控中位于该提交之后的提交将是挤压提交。 合并从master到tmpsquash的更改。 将压缩的更改提交到tmpsquash。 使用压缩提交创建修补程序。 回到主分支
根据亚当·亚历山大的回答:

git签出换行符 必须重新设置为master git签出-b临时 压扁 git rebase-i master git格式补丁主程序
格式化两个标记之间的修补程序:

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,如果您想要squash方法将输出的组合提交消息,请添加git-log。例如,要在提交abcd和1234之间创建修补程序,请执行以下操作:

然后在应用修补程序时:

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

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

我很好奇,在下面的命题中,您最终会使用什么方法。让我们知道;我将按照Rob Di Marco的建议使用git diff。但是我已经两个星期没上班了,因为我昨晚刚刚目睹了我第二个女婴的出生,所以我还需要一段时间才能使用它我希望看到git格式的补丁-squash master HEADTry master..HEAD指定一个版本范围。这是我在本地保存历史记录以备编辑补丁时使用的。否则,我只使用rebase-I和挤压提交。对我来说,使用git comit-m我的挤压提交更可靠,否则它会添加其他未跟踪的文件,您可以切换到一个特定的提交而不是主提交,这样做可以创建一个从提交到提交的修补程序:git checkout 775ec2a&&git checkout-b patch&&git merge-squash branchnameecept,然后释放所有提交消息和元数据。git格式修补程序的优点在于,可以从一组修补程序中重建整个分支。create branch and squash方法的优点是将所有提交消息合并为一个,但如果您想编写自己的提交消息,此方法的速度要快得多实际上,可以使用git log完成合并消息,请参阅一个ExpPultice选项,但是考虑“Git DIFF”不能包含二进制差异,也许有一个选项来做。我喜欢这个解决方案。值得注意的是,它有时可能会创建比@Adam Alexander描述的方法更大的补丁。这是因为某些文件在提交过程中可能会被编辑多次。此方法单独处理每个提交,即使某些文件已还原。但大多数情况下,这不是问题。如果您试图避免合并,此选项非常好!e、 g.您想跳过一些提交。你仍然可以git-rebase-i。。。git merge master只进行快进,不会将提交压缩为一个。更改为git merge-squash master,以在暂存区域中挤压并显示所有提交。您的流程将与此更改一起工作。我使用的是git版本2.1.0。如果您不想自己将它们推到远程,那么在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 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