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

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

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

随着something_here 空白它几乎工作,但文件名称是不正确的。 我想我只是我错过了一些select。

在现实生活中,我会在结帐后进行合并,所以补丁可能会在那里失效,但是您会看到我正在收到的信息。

编辑我的错在这里问错误的问题。 实际的问题是,我想保存我的更改,做一个合并,然后重新应用更改,如果可能? 我问错了,因为我习惯使用补丁来解决这些问题,而git diff看起来像是我想要的那样。

查尔斯·贝利的评论有正确的答案。 对我来说,git-apply是正确的事情(git-stash看起来比我需要的更重,而rebasing和bundles绝对超出了我目前的技能水平。)我会接受Charles给出的答案(因为你不能接受评论)。 感谢所有的build议。

编辑,6年后熟悉这个问题的人都知道,我高估了git stash的难度。 几乎每天左右,我将使用以下顺序:

 $ git stash $ git merge $ git stash pop 

如果你想使用补丁,你需要删除git默认使用的a/ b/前缀。 你可以用--no-prefix选项来做到这一点(你也可以用patch的-p选项来做到这一点):

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

通常情况下,使用直接的git diff容易,然后使用输出到git apply

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

对于你的使用情况,我认为这是最合适的。

 # 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 

只要使用-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 diffs在文件path前面有一个额外的path段。 您可以通过指定带补丁的-p1来剥离path中的此条目,如下所示:

 patch -p1 < save.patch 

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

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

  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 

正如@ndim所提到的

 $ git diff > save.patch 

创build补丁,save.patch文件被创build在相同的代码库目录中。 这个文件可以与其他人共享。 一旦你有save.patch文件,运行

 $ patch -p1 < save.patch 

将修补程序应用于代码库