2

我正在尝试合并一些为名为dev. 一些文件被添加,一些被改变。有没有办法为提交中的选定文件生成补丁,以便它们可以应用于主文件?我期待然后将补丁应用到大师。

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

4

1 回答 1

2

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

也许(我不确定你到底要什么)。让我们从提供将提交X更改为提交Ygit diff的指令作为输出的基本事实开始。同时,基本上只是运行以获取补丁的差异(几乎所有其他需要差异的 Git 命令也是如此)。git format-patchgit diff

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

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

更好的方法

但是,如果“for selected files”不是正确的短语怎么办?如果您需要文件 A、B 和 C 的补丁,文件 B 的补丁需要有所不同,该怎么办?有一种更好、更灵活的方法来处理,可以概括为:不要试图伪装,要真实地去做。

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

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.

于 2016-11-30T14:40:46.453 回答