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

Mik*_*e_K 440 git diff git-diff

我有一个由同事创建的.diff文件,并希望将该diff文件中列出的更改应用到完全相同的存储库的本地分支.我无权访问用于生成此diff文件的worker的pc或分支.

显然,我可以逐行进行并重新输入所有内容,但我宁愿不让系统受到人为错误的影响.最简单的方法是什么?

Phi*_*ipp 668

将diff文件复制到存储库的根目录,然后执行以下操作:

git apply yourcoworkers.diff
Run Code Online (Sandbox Code Playgroud)

有关该apply命令的更多信息,请参见其手册页.

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

如果修补程序应用程序失败,并且生成的diff的提交实际上是在您的repo中,则可以使用该-3选项apply尝试合并更改.

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

git diff d892531 815a3b5 | git apply
Run Code Online (Sandbox Code Playgroud)

  • 您似乎也对该文件进行了更改,以阻止修补程序正常工作.要解决此问题,您可以提交更改,创建新分支,将其重置为您和您的同事分歧的提交,应用修补程序,提交它,然后合并两个分支. (4认同)
  • @orlybg对不起,但是你被搞砸了.Git只创建一个检查点,您可以在提交时返回.这就是为什么许多git指南推荐[早期和经常提交](http://www.databasically.com/2011/03/14/git-commit-early-commit-often/). (4认同)
  • 感谢您的答复,但是这导致了错误提示,补丁失败:filename.php:202错误:filename.php:补丁不适用。好消息是它不是文件中的第一个文件名,因此至少它能够处理某些文件。有什么想法吗? (2认同)
  • @orlybg当你还没有提交它时,执行`git reset --hard`将你的工作树返回到最后一次提交.当您已经提交它时,请附加要返回的修订. (2认同)
  • @orlybg至少,在你执行一些你可能想要反转的动作之前运行`git stash`.然后,无论哪种方式,您都可以带回您的存储,并在稍后提交. (2认同)
  • @Philipp 这不是严格准确的,请参阅`git apply --reverse`。 (2认同)

1.2*_*tts 22

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

patch -i yourcoworkers.diff
Run Code Online (Sandbox Code Playgroud)

或者

patch -p0 -i yourcoworkers.diff
Run Code Online (Sandbox Code Playgroud)

如果他们创建 diff 时未使用--no-prefix.

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

patch -p1 -i yourcoworkers.diff
Run Code Online (Sandbox Code Playgroud)

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

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

您还可以使用

git apply yourcoworkers.diff --stat 
Run Code Online (Sandbox Code Playgroud)

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