如何将git diff文件应用到本地分支,而该分支是同一仓库的副本?

671
我有一个由同事创建的 .diff 文件,并想将其中列出的更改应用于我本地的完全相同的代码库分支。我没有访问该同事电脑或用于生成此 diff 文件的分支的权限。
显然,我可以逐行重新键入每个更改,但我宁愿不让系统受到人为错误的影响。怎样是最简单的方法?

我在使用“git diff”和“git apply”时遇到了麻烦,因为我使用了一个别名,它被翻译成“git diff --ignore-all-space”。这使我的补丁无效。请确保只使用裸的“git diff”! - Christian Oudard
2个回答

990

将差异文件复制到仓库的根目录,然后执行:

git apply yourcoworkers.diff

关于apply命令的更多信息可以在其手册页中找到。

顺便说一句:通过使用发送者的git format-patch命令,然后在接收者处使用git am命令的组合,可以更好地通过文件交换整个提交,因为它还传输了作者信息和提交消息。

如果补丁应用失败,并且生成差异的提交实际上在您的存储库中,则可以使用apply命令的-3选项尝试合并更改。

它还可通过Unix管道按如下方式工作:

git diff d892531 815a3b5 | git apply

3
谢谢您的回复,但是这导致了一个错误,显示补丁失败: filename.php:202 错误:filename.php: 补丁无法应用。好消息是它不是文件中的第一个文件名,所以它至少能够处理部分文件。您有什么想法吗? - Mike_K
4
你似乎对那个文件进行了更改,导致补丁无法正常工作。为了解决这个问题,你可以提交你的更改,创建一个新分支,将它重置到你和同事分岔的提交点,应用补丁,提交更改,然后将这两个分支合并。 - Philipp
4
如果你还没有提交,使用git reset --hard命令将你的工作目录恢复到最后一次提交。如果你已经提交了,就需要附加要返回的版本号。 - Philipp
5
抱歉,但你现在可能有麻烦了。Git只是创建一个检查点,当你进行提交时,你可以返回到这个检查点。这就是为什么许多Git指南建议“早提交、频繁提交”。 - Philipp
5
在执行可能需要撤销的操作之前,至少要运行git stash命令。这样无论如何,您都可以恢复您的存储,并在以后的某个时间点提交更改。 - maurice
显示剩余10条评论

19

看起来你也可以使用 patch 命令。将差异放在存储库的根目录中,并从命令行运行 patch

patch -i yourcoworkers.diff
或者
patch -p0 -i yourcoworkers.diff

如果他们在创建差异时没有使用 --no-prefix,则您可能需要删除前导文件夹结构。

如果是这样,那么您可以使用以下命令来删除不适用的文件夹部分:

patch -p1 -i yourcoworkers.diff

-p(n)表示要删除文件夹结构的部分数量。

有关创建和应用补丁的更多信息,请参见此处

您还可以使用

git apply yourcoworkers.diff --stat 

检查默认情况下是否会应用任何更改。如果补丁未正确应用(文件夹结构不同),可能会显示0个受影响的文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接