您如何获取 git diff 文件,并将其应用到作为同一存储库副本的本地分支?

Posted

技术标签:

【中文标题】您如何获取 git diff 文件,并将其应用到作为同一存储库副本的本地分支?【英文标题】:How do you take a git diff file, and apply it to a local branch that is a copy of the same repository? 【发布时间】:2012-09-01 12:00:09 【问题描述】:

我有一个同事创建的 .diff 文件,并且想将该 diff 文件中列出的更改应用到完全相同存储库的本地分支。我无权访问用于生成此差异文件的那个工人的电脑或分支。

显然,我可以逐行重新输入所有内容,但我不想让系统出现人为错误。最简单的方法是什么?

【问题讨论】:

我在使用git diffgit apply 时遇到了麻烦,因为我使用了一个翻译为git diff --ignore-all-space 的别名。这使我的补丁无效。确保只使用裸git diff 【参考方案1】:

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

git apply yourcoworkers.diff

有关apply 命令的更多信息,请访问its man page。

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

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

它也适用于 Unix 管道,如下所示:

git diff d892531 815a3b5 | git apply

【讨论】:

感谢您的回复,但这导致错误提示,patch failed: filename.php:202 error:filename.php: patch does not apply。好消息是它不是文件中的第一个文件名,因此它至少能够处理一些文件。有什么想法吗? 您似乎也对该文件进行了更改,导致补丁无法正常工作。为了解决这个问题,您可以提交您的更改,创建一个新分支,将其重置为您和您的同事分歧的提交,应用补丁,提交它,然后合并两个分支。 @orlybg 如果您还没有提交它,请执行 git reset --hard 以将您的工作树返回到最后一次提交。当你已经提交它时,附加你想要返回的修订。 @orlybg 对不起,但你搞砸了。 Git 只会创建一个检查点,您可以在提交时返回到该检查点。这就是为什么很多 git 指南推荐给commit early and often。 @orlybg 至少,在执行某些您可能想要在之后撤消的操作之前运行git stash。然后无论哪种方式,您都可以带回您的存储,并在稍后提交。【参考方案2】:

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

patch -i yourcoworkers.diff

patch -p0 -i yourcoworkers.diff

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

如果是这样,那么您可以删除文件夹中不适用的部分:

patch -p1 -i yourcoworkers.diff

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

更多关于创建和应用补丁的信息here。

你也可以使用

git apply yourcoworkers.diff --stat 

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

【讨论】:

以上是关于您如何获取 git diff 文件,并将其应用到作为同一存储库副本的本地分支?的主要内容,如果未能解决你的问题,请参考以下文章

如何提交两个分支的“git diff”?

使用 git diff,如何获得添加和修改的行号?

如何在未安装 Git 的情况下应用“git diff”补丁?

获取合并提交的git diff输出结果

设置为 diff-highlight 的 Git 寻呼机在 Windows 10 中不起作用

如何使 git diff --ignore-space-change 成为默认值