从当前工作目录中的更改创建一个git补丁

时间:2011-03-01 19:14:36

标签: git git-patch

假设我的工作目录中有未提交的更改。如何在不必创建提交的情况下从那些补丁中获取补丁?

7 个答案:

答案 0 :(得分:1522)

如果您还没有提交更改,那么:

git diff > mypatch.patch

但有时会发生你正在做的部分内容是未跟踪的新文件,而不会出现在git diff输出中。因此,执行补丁的一种方法是为新提交(git add每个文件或仅git add .)暂存所有内容,但不执行提交,然后:

git diff --cached > mypatch.patch

如果要将二进制文件添加到补丁(例如mp3文件),请添加“二进制”选项:

git diff --cached --binary > mypatch.patch

您可以稍后应用补丁:

git apply mypatch.patch

注意:您也可以使用--staged作为--cached的同义词。

答案 1 :(得分:334)

git diff表示未分期更改。 git diff --cached用于分阶段更改。

答案 2 :(得分:77)

git diffgit apply适用于文本文件,但不适用于二进制文件。

您可以轻松创建完整的二进制补丁,但您必须创建临时提交。完成临时提交后,可以使用以下命令创建补丁:

git format-patch <options...>

制作补丁后,运行以下命令:

git reset --mixed <SHA of commit *before* your working-changes commit(s)>

这将回滚您的临时提交。最终结果会使您的工作副本(故意)变脏,并使用您最初的相同更改。

在接收方,您可以使用相同的技巧将更改应用于工作副本,而无需提交历史记录。只需应用补丁和git reset --mixed <SHA of commit *before* the patches>

请注意,您可能必须完全同步才能使整个选项生效。我在应用补丁程序时看到了一些错误,因为制作它们的人并没有像我那样有太多的变化。可能有办法让它发挥作用,但我没有深入研究它。


以下是如何在Tortoise Git中创建相同的补丁(不是我建议使用该工具):

  1. 提交您的工作变更
  2. 右键单击分支根目录,然后单击Tortoise Git - &gt; Create Patch Serial
    1. 选择合理的范围(SinceFETCH_HEAD,如果您已经很好地同步)
    2. 创建补丁
  3. 右键单击分支根目录,然后单击Tortise Git - &gt; Show Log
  4. 右键单击临时提交之前的提交,然后点击reset "<branch>" to this...
  5. 选择Mixed选项
  6. 以及如何应用它们:

    1. 右键单击分支根目录,然后单击Tortoise Git - &gt; Apply Patch Serial
    2. 选择正确的补丁并应用
    3. 右键单击分支根目录,然后单击Tortise Git - &gt; Show Log
    4. 修补程序的提交之前右键单击提交,然后单击reset "<branch>" to this...
    5. 选择Mixed选项

答案 3 :(得分:29)

使用修改后的&amp;创建补丁你可以运行的新文件(暂存):

git diff HEAD > file_name.patch

答案 4 :(得分:9)

如果你想做二进制文件,请在运行--binary时提供git diff选项。

答案 5 :(得分:9)

我喜欢:

git format-patch HEAD~<N>

其中<N>是保存为补丁的最后提交次数。

如何使用命令的详细信息在DOC

UPD
Here,您将找到如何应用它们。

UPD 对于那些不了解format-patch的人
添加别名:

git config --global alias.make-patch '!bash -c "cd ${GIT_PREFIX};git add .;git commit -m ''uncommited''; git format-patch HEAD~1; git reset HEAD~1"'

然后在项目存储库的任何目录中运行:

git make-patch

此命令将在当前目录中创建0001-uncommited.patch。修补程序将包含所有更改和下一个命令可见的未跟踪文件:

git status .

答案 6 :(得分:3)

我们还可以指定文件,以仅包括具有相对更改的文件,尤其是当它们跨越多个目录时。

git diff ~/path1/file1.ext ~/path2/file2.ext...fileN.ext > ~/whatever_path/whatever_name.patch

我发现答案或注释中没有指定相关内容,而这些答案都是相关且正确的,因此选择添加它。显式胜于隐式!