我能从 git-diff 获得一个补丁兼容的输出吗?

我正在做一件非常简单的错事。我正在准备一个普通的补丁文件,这样我就可以重新应用一些修改:

$ git diff > before
$ git diff something_here > save.patch
$ git checkout .
$ patch < save.patch
$ git diff > after
$ diff before after
$

对于 something_here 空白,它几乎可以工作,但是文件名不对。我想我只是错过了一些选择。

在现实生活中,我会在检查后进行合并,所以补丁可能会在那里失败,但是你知道我的意思。

剪辑 问错问题是我的错。实际的问题是,如果可能的话,我想保存我的更改,进行合并,然后重新应用更改?我问它错误的方式,因为我是 用过使用补丁程序来解决这些问题和 git diff看起来像这就是它想让我做的。

查尔斯 · 贝利的 评论的答案是正确的。对我来说,git 应用程序是正确的事情(git 隐藏看起来比我需要的更重量级,重新定义基础和捆绑包绝对超出了我目前的技能水平。)我接受查尔斯的回答(因为你不能接受评论)。谢谢你的建议。

编辑,六年后 任何熟悉这个课题的人都知道,我高估了 git stash的难度。大约每天,我都会使用以下顺序:

$ git stash
$ git merge
$ git stash pop

编辑,5年后的路 我已经基本上放弃了 git apply,甚至不怎么使用 git stashgit rebase FTW.

123519 次浏览

如果您想使用补丁程序,您需要删除 git 默认使用的 a/ b/前缀。你可以使用 --no-prefix选项(你也可以使用补丁的 -p选项) :

git diff --no-prefix [<other git-diff arguments>]

通常情况下,直接使用 git diff然后使用输出提供给 git apply会更容易。

大多数时候,我尽量避免使用文本补丁。通常,与 rebase、 git stash和 bundle 相结合的一个或多个临时提交更容易管理。

对于您的用例,我认为 stash是最合适的。

# save uncommitted changes
git stash


# do a merge or some other operation
git merge some-branch


# re-apply changes, removing stash if successful
# (you may be asked to resolve conflicts).
git stash pop

Git 差异在文件路径之前有一个额外的路径段。您可以通过使用 patch 指定-p1来去除路径中的这个条目,如下所示:

patch -p1 < save.patch

只要使用 -p1: 无论如何,在 --no-prefix的情况下你都需要使用 -p0,所以你可以省略 --no-prefix,使用 -p1:

$ git diff > save.patch
$ patch -p1 < save.patch


$ git diff --no-prefix > save.patch
$ patch -p0 < save.patch

避免创建临时补丁文件的一个有用技巧:

git diff | patch -p1 -d [dst-dir]
  1. 我将工作目录的 diff (包括未提交的文件)保存在当前的 HEAD 中。
  2. 然后可以将 save.patch文件传输到任何地方(包括二进制文件)。
  3. 在目标机器上,使用 git apply <file>应用补丁

注意: 它也是当前暂存的文件。

$ git diff --binary --staged HEAD > save.patch
$ git reset --hard
$ <transport it>
$ git apply save.patch