假设我在工作目录中未提交更改。如何在不创建提交的情况下从这些文件制作补丁?
假设我在工作目录中未提交更改。如何在不创建提交的情况下从这些文件制作补丁?
Answers:
git diff
进行无阶段的更改。 git diff --cached
进行分阶段的更改。
git format-patch
还包括二进制差异和一些元信息。实际上,这是创建补丁的最佳选择,但是afaik这仅适用于签入源/更改,对吗?
git diff --relative
如果您尚未提交更改,则:
git diff > mypatch.patch
但是有时候,您正在做的事情的一部分是新文件,这些新文件未跟踪且不会出现在git diff
输出中。因此,做补丁的一种方法是将所有内容暂存为一个新的提交(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 --no-color
。否则,它看起来像是编码问题。
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
->Create Patch Serial
Since
:FETCH_HEAD
如果你是良好的同步将工作)Tortise Git
->Show Log
reset "<branch>" to this...
Mixed
选项以及如何应用它们:
Tortoise Git
->Apply Patch Serial
Tortise Git
->Show Log
reset "<branch>" to this...
Mixed
选项要同时创建已修改的文件和新文件的补丁,可以运行:
git diff HEAD > file_name.patch
git diff --cached > mypatch.patch
无效。
file_name.patch
可以使用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 ~/path1/file1.ext ~/path2/file2.ext...fileN.ext > ~/whatever_path/whatever_name.patch
我发现答案或注释中没有指定相关内容,而这些答案都相关且正确,因此选择添加它。显式胜于隐式!