假设我的工作目录中有未提交的更改。我如何从这些补丁,而不必创建一个提交?


当前回答

Git diff和Git apply适用于文本文件,但不适用于二进制文件。

您可以轻松地创建一个完整的二进制补丁,但必须创建一个临时提交。一旦你做了临时提交,你可以创建补丁:

git format-patch <options...>

在你做了补丁之后,运行这个命令:

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

这将回滚你的临时提交。最终的结果(有意地)使您的工作副本与您原来的更改相同。

在接收端,可以使用相同的技巧将更改应用到工作副本,而不需要提交历史记录。简单地应用补丁,git重置-混合<SHA的提交*之前*补丁>。

请注意,要使整个选项正常工作,您可能必须保持良好的同步。我曾经在应用补丁时看到过一些错误,因为做补丁的人没有像我那样做出那么多的更改。可能有办法让它工作,但我还没有深入研究。


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

提交您的工作更改 右键单击分支根目录,然后单击Tortoise Git -> Create Patch Serial 选择任何有意义的范围(因为:FETCH_HEAD将工作,如果你是良好同步) 创建补丁 右键单击分支根目录,然后单击Tortise Git -> Show Log 右键单击临时提交之前的提交,然后单击重置“<分支>”到此… 选择混合选项

以及如何应用它们:

右键单击分支根目录,然后单击Tortoise Git -> Apply Patch Serial 选择正确的补丁并应用它们 右键单击分支根目录,然后单击Tortise Git -> Show Log 在补丁提交之前右键单击提交,然后单击reset“<branch>”to this… 选择混合选项

其他回答

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

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

Git diff和Git apply适用于文本文件,但不适用于二进制文件。

您可以轻松地创建一个完整的二进制补丁,但必须创建一个临时提交。一旦你做了临时提交,你可以创建补丁:

git format-patch <options...>

在你做了补丁之后,运行这个命令:

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

这将回滚你的临时提交。最终的结果(有意地)使您的工作副本与您原来的更改相同。

在接收端,可以使用相同的技巧将更改应用到工作副本,而不需要提交历史记录。简单地应用补丁,git重置-混合<SHA的提交*之前*补丁>。

请注意,要使整个选项正常工作,您可能必须保持良好的同步。我曾经在应用补丁时看到过一些错误,因为做补丁的人没有像我那样做出那么多的更改。可能有办法让它工作,但我还没有深入研究。


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

提交您的工作更改 右键单击分支根目录,然后单击Tortoise Git -> Create Patch Serial 选择任何有意义的范围(因为:FETCH_HEAD将工作,如果你是良好同步) 创建补丁 右键单击分支根目录,然后单击Tortise Git -> Show Log 右键单击临时提交之前的提交,然后单击重置“<分支>”到此… 选择混合选项

以及如何应用它们:

右键单击分支根目录,然后单击Tortoise Git -> Apply Patch Serial 选择正确的补丁并应用它们 右键单击分支根目录,然后单击Tortise Git -> Show Log 在补丁提交之前右键单击提交,然后单击reset“<branch>”to this… 选择混合选项

Git差异为非阶段的变化。

Git diff——用于阶段性更改的缓存。

对于阶段性和非阶段性的更改,git diff HEAD。

我们还可以指定文件,只包括有相对变化的文件,特别是当它们跨越多个目录e.x时。

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

我发现在答案或评论中没有说明这一点,这些都是相关的和正确的,所以选择添加它。明确的比含蓄的好!

uncomminetted

git diff --cached > name.patch

已提交(更有用)

git diff HEAD~commit_count > name.patch