我可以从git-diff获得与补丁兼容的输出吗?

Mal*_*lio 151 git

我正在做一些非常简单的错误.我正在尝试准备一个普通的补丁文件,所以我可以重新应用一些更改:

$ git diff > before
$ git diff something_here > save.patch
$ git checkout . 
$ patch < save.patch
$ git diff > after
$ diff before after
$
Run Code Online (Sandbox Code Playgroud)

something_here 空白几乎工作,但文件名是不正确的.我想我只是缺少一些选择.

在现实生活中,我会在结账后进行合并,因此补丁可能会在那里失败,但你会看到我得到的东西.

编辑 我的错在这里提出错误的问题.实际的问题是,我想保存我的更改,进行合并,然后重新应用更改,如果可能的话?我问错了方法,因为我习惯使用补丁来解决这些问题,git diff看起来就像是我想要的那样.

Charles Bailey的评论得到了正确答案.对我来说,git-apply是正确的事情(git-stash看起来比我需要的更重,并且变调和捆绑肯定超出了我目前的技能水平.)我将接受Charles给出的答案(因为你不能接受评论).感谢所有的建议.

编辑,6年后 任何熟悉该主题的人都知道,我高估了难度git stash.几乎每天都有,我将使用以下顺序:

$ git stash
$ git merge
$ git stash pop
Run Code Online (Sandbox Code Playgroud)

ndi*_*dim 215

只需使用-p1:您将需要使用-p0--no-prefix情况下,无论如何,所以你可以离开了--no-prefix和使用-p1:

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

$ git diff --no-prefix > save.patch
$ patch -p0 < save.patch
Run Code Online (Sandbox Code Playgroud)

  • 这不适用于重命名;`git diff` 输出一行被 `patch` 忽略的行。`git apply` 是要走的路。 (3认同)
  • 如果您想知道为什么,[man 文档](http://www.gnu.org/software/diffutils/manual/diffutils.html#patch-Directories) 很好地总结了它 - [来源](http:// unix.stackexchange.com/a/26502/17836)。 (2认同)

CB *_*ley 132

如果你想使用补丁,你需要删除a/ b/git默认使用的前缀.您可以使用该--no-prefix选项执行此操作(您也可以使用patch的-p选项执行此操作):

git diff --no-prefix [<other git-diff arguments>]
Run Code Online (Sandbox Code Playgroud)

通常,直接git diff使用更容易,然后使用输出来输入git apply.

大多数时候我都试图避免使用文本补丁.通常一个或多个临时提交与rebase相结合,git stash捆绑包更容易管理.

对于您的用例,我认为这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
Run Code Online (Sandbox Code Playgroud)

  • `git diff --no-prefix master> diff.patch`然后`git checkout master``patch -p0 <diff.patch` (5认同)
  • @Natim为了最终的安全,我建议在发出最后一个命令之前使用“patch --dry-run &lt; diff.patch”。 (3认同)
  • @Natim 正如我所说,只是为了最终的安全,在发生错误时无需撤消任何操作。我也在考虑那些阅读本文并希望在 git 之外使用“patch”的人(可能使用由“diff”生成的补丁文件)在更一般的用例中。 (2认同)

Hen*_*son 17

git diffs在文件路径之前有一个额外的路径段.您可以通过使用patch指定-p1来删除路径中的此条目,如下所示:

patch -p1 < save.patch
Run Code Online (Sandbox Code Playgroud)


cod*_*nja 9

  1. 我保存当前目录的差异(包括未提交的文件)对当前的HEAD.
  2. 然后您可以将save.patch文件传输到任何位置(包括二进制文件).
  3. 在目标计算机上,使用修补程序 git apply <file>

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

$ git diff --binary --staged HEAD > save.patch
$ git reset --hard
$ <transport it>
$ git apply save.patch
Run Code Online (Sandbox Code Playgroud)


slo*_*art 8

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

git diff | patch -p1 -d [dst-dir]
Run Code Online (Sandbox Code Playgroud)