虽然 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 上重新创建,如果您愿意,可以将其重新存储在那里。
如果您需要在接收端直接将更改实现为存储,而无需通过您的工作树和索引 - 例如因为接收方不处于“干净”状态 - 您可以使用捆绑包来做到这一点。但是有一个技巧可以使这项工作。在源代码库上
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 引用从包中取出。如果我们将它直接映射到 refs/stash,那么我们就不能指望创建一个 reflog 条目 - 如果没有 reflog 条目,它就不是一个可用的 stash。因此,我们将其引入临时分支,然后使用 update-ref 创建(或移动)stash 引用并更新 reflog。