git format-patch,用于为提交的特定文件部分生成补丁

时间:2016-11-30 11:31:33

标签: git format-patch

我正在尝试合并为名为dev的分支中的功能添加的一些文件。添加了一些文件,一些文件被更改。有没有办法为提交的选定文件生成一个补丁,以便它们可以应用于master?我希望然后将补丁应用于主人。

git format-patch -1 SHA1 --stdout正在为整个提交生成补丁,但我需要在提交中仅生成补丁特定文件。

1 个答案:

答案 0 :(得分:2)

  

有没有办法为提交的部分选定文件生成补丁,以便它们可以应用于master?

也许(我不确定你要的是什么)。让我们从git diff作为输出提供将commit X 更改为commit Y 的指令作为输出的基本事实开始。同时,git format-patch基本上只运行git diff来获取补丁的差异(就像几乎所有其他需要差异的Git命令一样)。

如果您手动运行git diff ,则可以添加其他参数。特别是,git diff接受选项后的 pathspecs 列表(基本上是文件名)和两个要比较的提交:

git diff X Y -- path/to/file

这限制了"如何更改文件"指令输出只显示给定的文件。因此,如果"选择文件"表示"文件A,B和C的所有指令,但对于文件D和E"没有任何说明,那么简单:

git diff X Y -- A B C

会做到这一点。

无法让git format-patch像这样运行git diff,但您可以简单地剪切并重新粘贴格式化的补丁,即像往常一样使用git format-patch,然后从中移除差异并将其替换为您的自定义git diff生成的差异。

更好的方法

如果"对于所选文件"虽然不是很合适的短语吗?如果你需要文件A,B和C的补丁,除了,文件B的补丁需要有些不同,该怎么办?有一种更好,更灵活的方式可以解决这个问题,可以概括为:不要试图伪造它,只是真实地做。

也就是说,首先查看要修补的相同的提交。 (如有必要,运行git fetch更新您自己的存储库,以便他们的 masterorigin/masteranother_remote/master。您可以添加他们的存储库作为另一个远程,例如,git remote add another_remote url,如果有必要的话。)然后创建一个自己的 new 分支,指向这个特定的提交:

git checkout -b for-patching-them origin/master

(这也会使您的分支for-patching-them将远程跟踪分支作为其上游。)

既然您拥有自己的分支,您可以git cherry-pick提交,如果您愿意,可以使用-n。然后,您可以根据需要和/或需要更改更改,测试它们并提交。您可以使用--amend进行提交,或进行多次提交,最终进行交互式rebase并压缩提交,或者使用您喜欢的任何Git工具。

最终,您将准备好一个或多个提交给他们的提交,现在您可以运行:

git format-patch origin/master

获取发送它们的精确补丁,而无需编辑该补丁并希望它适用。此外,如果他们在您开始所有这些工作后更新了他们的分支,您可以再次运行git fetch来获取他们的更新,然后git rebase您的补丁分支根据他们的更改进行调整,以便您再次准备好运行git format-patch