我该如何使用保存的内容格式化补丁?

183
在 Git 中,我可以将我的更改存储在暂存区。那么,我能否创建一个补丁来保存我所保存的内容?然后在其他仓库(如我的同事)中应用该补丁?
我知道可以使用git format-patch -1命令,但我认为这只适用于我已经提交的更改。但是我正在寻找类似于此功能但适用于我所储藏的更改。
另外,我该如何在其他仓库中应用补丁?
5个回答

231
当然,git stash show 支持此功能:
git stash show -p

所以,使用
git stash list

要导出补丁的存储库编号,请执行以下操作:

git stash show -p stash@{<number>} > <name>.patch

导出文件。

例如:

git stash show -p stash@{3} > third_stash.patch

1
我有一个关于应用补丁的相关问题。假设我的补丁涉及多个文件。是否有一种“交互式”方式来应用补丁?选择我应该对哪些补丁文件应用补丁?我可以这样做吗? - silverburgh
1
@silverburgh:我快速浏览了一遍man patch,但没有看到关于交互式打补丁的选项。但是,由于补丁文件本身就是普通文本文件,通常情况下,您可以在文本编辑器中编辑补丁以剪切出与 patch 应用有关的相关部分。或者,如果您正在将补丁应用到另一个 Git 存储库中,则可以全部应用补丁,然后有选择性地使用 git checkout 文件,这样您就不必更改它们(git checkout 加上文件名会丢弃未暂存的更改)。 - Greg Hewgill
1
@silverburgh,您可以使用git apply命令的“--exclude”和“--include”参数来限制打补丁的文件集。 - Kelvin
@silverburgh,你可以按照以下步骤操作:假设你有一个补丁文件,请完全应用该补丁,然后执行 git add --interactive ${YOUR_FILES} 命令,它会让你有机会进行部分提交。 - Alexander Oh
16
谢谢。这对我有用:git stash show -p stash@{1} > patch.txt。意思是将 stash@{1} 的修改内容保存为一个补丁文件 patch.txt - Ryan
显示剩余4条评论

82

这个答案提供了关于保存补丁和在需要使用它的地方应用补丁的信息。

将输出存储到文件中:

 git stash show -p --color=never > my-patch-name.patch

确认补丁看起来不错:

git apply --stat my-patch-name.patch

验证是否有错误:

git apply --check my-patch-name.patch

应用此补丁

git apply my-patch-name.patch

1
这个对于我来说在使用纯文本代码文件时有效,但是我必须考虑空格。验证补丁是否正确:`git apply --check --ignore-space-change --ignore-whitespace my-patch-name.patch`应用补丁:`git apply --ignore-space-change --ignore-whitespace my-patch-name.patch` - Craig Boland
很好的简明解释。为了让它工作,我必须在应用补丁时处于存储库根目录,否则 git apply 就无法捕获差异。 - Max

17

以上解决方案对于二进制数据无效。 以下解决方案支持它:

git stash show stash@{0} -p --binary

编辑

注意:我只是想在上面的回复中添加评论,但我的声望不足。


17

使用

$> git stash list
stash@{0}: WIP on master: 84fx31c Merged with change to /public/
stash@{1}: WIP on master: 463yf85 FlupResource: also takes json as a query parameter

要获取您最近存储的内容列表,Git实际上在存储时创建提交对象。它们与其他所有提交一样。您可以在一个分支中查看它们:

$> git checkout -b with_stash stash@{0}
你可以发布这个分支,你的同事可以将该提交合并或挑选。

4
我相信这可能是Git最近的一个更新之一。您不需要再打补丁来恢复之前存储的更改,而是可以将其应用于另一个分支上。比如在分支A上,您已经存储了一些更改,称为stash@{1}。现在您切换到分支B,只需执行以下操作:
$git stash apply stash@{1}

这段话的意思是将你在分支A上的更改应用到分支B上。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接