我如何用我藏起来的东西格式化补丁


140

在git中,我隐藏了所有更改。是否可以用我藏匿的东西创建补丁?然后在其他存储库(我的同事的存储库)中应用该补丁?

我知道git format-patch -1,但是我认为这是我的承诺。但是我正在寻找相同的东西来实现我藏匿的变化。

以及如何在其他存储库中应用补丁?

Answers:


155

当然,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
我有一个有关应用补丁的相关问题。假设我的补丁涉及多个文件。有没有办法“交互式”应用补丁?选择应该对补丁应用哪些补丁文件?我可以那样做吗?
西尔弗堡

1
@silverburgh:我快速浏览了一下man patch,但没有看到交互式补丁应用程序的任何选项。但是,由于补丁文件本身就是纯文本文件,因此通常要做的是在文本编辑器中编辑补丁,以裁剪出要应用的相关部分patch。或者,如果您要将补丁应用到另一个Git存储库中,则可以全部应用它,然后有选择地选择git checkout不想更改git checkout的文件(使用文件名会丢弃未进行的更改)。
格雷格·休吉尔

1
@silverburgh您可以使用git apply的“ --exclude”和“ --include”参数来限制修补的文件集。
开尔文

@silverburgh,如果您有补丁,则可以执行以下操作。完全应用补丁,然后再做git add --interactive ${YOUR_FILES},它将为您提供部分提交的机会。
亚历克斯

15
谢谢。这对我git stash show -p stash@{1} > patch.txt
Ryan

63

该答案提供有关保存补丁以及将补丁应用到您想要使用它的信息。

要将输出存储在文件中:

 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

这个对我来说适用于纯文本代码文件,但是我不得不考虑空格。验证补丁看起来不错: 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没有拿到差异。
最多

16

$> 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}

然后,您可以发布此分支,而您的同事可以合并或选择该提交。


13

上述解决方案不适用于二进制数据。以下是对此的支持:

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

编辑

注意:我只是想在以上答复中添加评论,但我的声誉还不够。


3

我相信这可能是最近Git提出的建议之一。您不必再修补您藏匿的更改。您可以将已隐藏的更改应用到一个分支上。

例如,在分支A上,您已保存了一些更改,称为stash @ {1}。

您现在切换到分支B。您可以执行以下操作:

$git stash apply stash@{1}

这将您的分支A更改应用到分支B。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.