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

git format-patch to generate a patch for a specific file part of a commit

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

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

Is there a way to generate a patch for selected files part of a commit so that they can be applied on master?

也许(我不确定您的要求是什么)。让我们从基本事实开始,即 git diff 作为输出提供了将提交 X 更改为提交 Y 的说明。同时,git format-patch 本质上只是 运行s git diff 来获取补丁的差异(几乎所有其他需要差异的 Git 命令也是如此)。

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

git diff X Y -- path/to/file

这会限制 "how to change the files" 指令输出以仅显示给定的文件。因此,如果 "for selected files" 表示 "all of the instructions for files A, B, and C, but nothing for files D and E",那么一个简单的:

git diff X Y -- A B C

会成功的。

没办法像这样把git format-patch变成运行git diff,不过你可以简单的把格式化后的补丁剪下来重新贴上去,即用git format-patch 像往常一样,然后从中删除差异并将其替换为您的自定义生成的差异 git diff.

更好的方法

如果 "for selected files" 不是正确的短语怎么办?如果您需要文件 A、B 和 C 的补丁,除了文件 B 的补丁需要 有些不同 怎么办?有一个更好、更灵活的方法来处理这个问题,可以概括为:不要试图伪造它,只做真实的。

也就是说,首先检查您希望修补的相同 提交。 (如有必要,通过 运行ning git fetch 更新您自己的存储库,以便您拥有 他们的 master 作为 origin/masteranother_remote/master. 你可以将他们的存储库添加为另一个远程,例如 git remote add another_remote <em>url</em>,如有必要。)然后创建一个自己的 new 分支,指向这个特定的提交:

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

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

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

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

git format-patch origin/master

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