这是这种情况:
我们基于现有的开源 git 存储库(例如源存储库(创建了一个"私有"存储库(例如我们的存储库(。
我们一直在开发代码,并将大约 20 个合并到我们的存储库中。因此,回购从"State_Initial"移动到"State_Current"。
现在,出于商业原因,我们希望将所有开发移交给第三方。基于一些法律问题,唯一的选择是我们给他们一个包含所有更改的"单个"补丁文件。这是"State_Initial"和"State_Current"之间的挤压补丁。
我环顾四周,发现
git format-patch -X
但是,它会生成"n".patch 文件。
有没有办法创建一个补丁文件,这样如果我们创建一个基于"source-repo"的存储库并应用补丁,它会带我们"State_Current"?
以下命令创建包含多个提交的单个.patch
文件。
git format-patch cc1dde0dd^..6de6d4b06 --stdout > foo.patch
然后,您可以像这样应用它:
git am foo.patch
注意:如果您希望包含第一个提交 SHA,请务必使用^..
而不是..
。
您可以在
具有提交历史记录
生成补丁:
git format-patch <COMMIT1>^..<COMMIT2> --stdout > commits.patch
应用补丁:
git am commits.patch
没有提交历史记录
生成补丁:
git diff <COMMIT1>^..<COMMIT2> > diff.patch
应用补丁:
git apply diff.patch
笔记
在Windows上,你最好在Git Bash中运行上述命令。如果使用 PowerShell 并在应用修补程序时出现错误,则可以尝试将修补程序文件转换为 UTF-8 编码。
如果您出于某种原因想要将第一次提交包含在补丁中。你可以做:
git format-patch --root --stdout > all.patch
或
git diff 4b825dc642cb6eb9a060e54bf8d69288fbee4904 HEAD > diff.patch
4b825dc642cb6eb9a060e54bf8d69288fbee4904 表示"空树",请参阅如何获取第一次提交的 Git 差异?
创建一个名为squashed
的新分支,该分支具有单个压缩提交。此分支将具有与正常分支完全相同的内容,但没有历史记录。
仔细查看,如果您满意,请使用format-patch
创建补丁文件。
$ git checkout -b squashed $(git commit-tree HEAD^{tree} -m 'Squashed history')
$ git format-patch --root HEAD
这是一个非破坏性操作,之后您可以直接切换回正常的开发分支。您可以tag
被压扁的分支以保存对通过电子邮件发送给他们的内容的引用,或者在不再需要它时使用branch -D
将其删除。
$ git branch -D squashed
您可以使用git diff
:
git diff 0f3063094850 > ./test.patch
"单个补丁文件中的最后 10 个补丁:">
git format-patch -10 HEAD --stdout > 0001-last-10-commits.patch
来源:https://stackoverflow.com/a/16172120/9478470 类似问题的答案:如何为特定提交生成 Git 补丁?
如果出于某种原因您不希望创建一个一次性分支并在state_initial
和state_current
之间压缩所有提交,然后使用git format-patch
,还有另一种选择。如果从state_initial分支出来,并且分支基于源分支的顶部重新定位:
git format-patch source_branch <patch_file_name>
当你做git am <patch_file_name>
时,它不会重建你的整个提交链。但此修补程序文件将是更改的顺序列表。如果您在多个提交中更改并更改了内容,如果有人检查补丁文件,它仍然可见。
使用以下命令:
$ git format-patch -n <commit string>
-n 表示要为此修补程序生成的提交数,以及要从哪个提交生成
。git format-patch
可以将修订范围作为参数。请参阅git help format-patch
:
概要
git format-patch [-k] [(-o|--output-directory) <dir> | --stdout] ... (many flags omitted) [--progress] [<common diff options>] [ <since> | <revision range> ]
描述
。
有两种方法可以指定要操作的提交。
单个提交
<since>
指定指向当前分支尖端的提交不在导致输出<since>
的历史记录中。泛型
<revision range>
表达式(参见gitrevisions(7( 中的 "指定修订" 部分(表示指定范围内的提交。
例如,以下命令为当前分支上的最后三个提交生成修补程序:
git format-patch HEAD~3..HEAD