情况是这样的:
>
我们基于现有的开源git repo(例如source-repo)创建了一个“私有”repo(例如our-repo)。
我们一直在开发代码,大约有20次合并到我们的repo中。所以,repo从“State_Initial”变成了“State_Current”。
现在,出于商业原因,我们想把我们所有的开发交给第三方。基于一些法律问题,唯一的选择是我们给他们一个包含我们所有更改的“单一”补丁文件。那是一个介于“State_Initial”和“State_Current”之间的压扁补丁。
我环顾四周,发现
git format-patch -X
但是,它会生成“n”. patch文件。
有没有一种方法可以创建单个补丁文件,这样如果我们基于“源代码-存储库”创建一个存储库并应用补丁,它就需要我们“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 diff?
创建一个名为squed
的新分支,它有一个压缩的提交。该分支将具有与您的普通分支完全相同的内容,但没有历史记录。
仔细查看,如果您满意,请使用format-patch
创建补丁文件。
$ git checkout -b squashed $(git commit-tree HEAD^{tree} -m 'Squashed history')
$ git format-patch --root HEAD
这是一个非破坏性操作,之后您可以直接切换回正常的开发分支。您可以标记
压缩的分支以保存对您通过电子邮件发送给他们的内容的引用,或者使用分支-D
删除它,如果您不再需要它。
$ git branch -D squashed