如何为git stash

时间:2017-11-08 15:23:25

标签: git

我想在.zip/.gz文件中导出我在隐藏列表中看到的一个存储(更改)。我找到了以下命令:

git stash show -p > patch

保存文件中的更改,但我还想保留.png个文件等...我正在寻找一种方法来压缩所有包含的更改存储在文件或文件夹中。你知道任何解决方案吗?

2 个答案:

答案 0 :(得分:2)

虽然Samual Robert的回答确实解决了所述问题,但需要注意:

git stash show会将所有暂存和未暂存的更改合并到一个补丁中,即使您使用了git stash -u,也会排除未跟踪的文件。默认情况下,git apply会将修补程序中的所有更改变为未分阶段的更改;你可以通过提供--index选项让它们上演。但是为了保持暂存和非暂存更改之间的区别,或者包含存储中未跟踪的文件,您需要执行其他操作。

存储内部由两个或三个提交和一些ref操作组成,因此一个选项是从每个提交生成一个补丁,然后在另一端手动重建存储。由于提交的相关方式,获得正确的补丁需要一点点诀窍。

git show stash^2 --binary >index.patch
git show stash^3 --binary >untracked.patch
git diff --binary stash^2 stash >wip.patch

然后在接收端

git apply index.patch
git add .
git apply wip.patch
git apply untracked.patch

现在已经在另一个repo上重新创建了未提交的状态,如果你想要,你可以在那里重新存储它。

如果您需要直接在接收端实现更改作为存储,而无需通过您的工作树和索引 - 例如因为接收方不在"清洁" state - 你可以使用bundle来做。但是有一个技巧可以使这项工作。在源仓库

git bundle create stash.bundle stash^..stash

在接收回购

git remote add bundle stash.bundle
git fetch stash:temp
git update-ref --create-reflog refs/stash temp
git branch -D temp

请注意,我们必须提供一个明确的refspec来从包中获取stash ref。如果我们将它直接映射到refs / stash,那么我们就无法依赖正在创建的reflog条目 - 如果没有reflog条目,它就不是可用的存储。因此,我们将其引入临时分支,然后使用update-ref创建(或移动)stash引用并更新reflog。

答案 1 :(得分:1)

尝试使用--binary选项导出

git stash show -p --binary > changes.patch

如果要导入它,请应用修补程序

git apply changes.patch