假设我的工作目录中有未提交的更改。如何在不必创建提交的情况下从那些补丁中获取补丁?
答案 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 diff
和git 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中创建相同的补丁(不是我建议使用该工具):
Tortoise Git
- &gt; Create Patch Serial
Since
:FETCH_HEAD
,如果您已经很好地同步)Tortise Git
- &gt; Show Log
reset "<branch>" to this...
Mixed
选项以及如何应用它们:
Tortoise Git
- &gt; Apply Patch Serial
Tortise Git
- &gt; Show Log
reset "<branch>" to this...
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
我发现答案或注释中没有指定相关内容,而这些答案都是相关且正确的,因此选择添加它。显式胜于隐式!