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

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

答案

如果您尚未提交更改,则:

git diff > mypatch.patch

但是有时候,您正在做的事情的一部分是新文件,这些新文件未跟踪且不会出现在git diff输出中。因此,做补丁的一种方法是将所有内容git add为一个新的提交( git add每个文件,或者只是git add . ),但是不执行提交,然后:

git diff --cached > mypatch.patch

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

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

您以后可以应用补丁:

git apply mypatch.patch

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

git diff用于未分级的更改。 git diff --cached为阶段性更改git diff --cached

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 > Create Patch Serial
    1. 选择有意义的范围( Since :如果同步良好,则FETCH_HEAD将起作用)
    2. 创建补丁
  3. 右键单击分支根目录,然后单击Tortise Git > Show Log
  4. 右键单击您的临时提交之前的提交,然后单击reset "<branch>" to this...
  5. 选择Mixed选项

以及如何应用它们:

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

要同时创建已修改的文件和新文件的补丁,可以运行:

git diff HEAD > file_name.patch

我喜欢:

git format-patch HEAD~<N>

其中, <N>是另存为补丁程序的最后提交次数。

有关如何使用该命令的详细信息,请参见DOC。

UPD
在这里,您可以找到如何应用它们。

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 .

如果要执行二进制操作,请在运行git diff时提供--binary选项。