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

时间:2011-01-06 00:39:04

标签: git

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

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

something_here 空白它几乎可以正常工作,但文件名不正确。我想我只是缺少一些选择。

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

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

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

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

$ git stash
$ git merge
$ git stash pop

5 个答案:

答案 0 :(得分:208)

只需使用-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

答案 1 :(得分:129)

如果你想使用补丁,你需要删除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

答案 2 :(得分:16)

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

patch -p1 < save.patch

答案 3 :(得分:8)

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

git diff | patch -p1 -d [dst-dir]

答案 4 :(得分:8)

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

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

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