我在我的私房钱里存了一小块。我已经使用git stash apply将它应用到我的工作副本。现在,我想通过反向应用补丁来撤销这些更改(有点像git revert会做的事情,但针对的是stash)。

有人知道怎么做吗?

澄清:在我的工作副本中有其他更改。我的具体情况很难描述,但您可以想象在存储库中有一些调试或实验代码。现在,它混合在我的工作副本与其他一些变化,我想看看效果与不从隐藏的变化。

目前看来stash还不支持这个功能,但是git的stash apply—reverse将是一个不错的功能。


当前回答

我自己也有类似的问题,我认为你所需要做的就是git重置——很难,你不会失去你的变化或任何未跟踪的变化。

如果你阅读git stash——help中的文档,它声明apply是“像pop一样,但不从stash列表中删除状态”,所以状态仍然驻留在那里,你可以取回它。

或者,如果没有冲突,您可以在测试更改后再次git stash。

如果你确实有冲突,不要担心,git重置-hard不会失去他们,因为 “应用状态可能会因冲突而失败;在这种情况下,它不会从收藏列表中删除。你需要手动解决冲突,然后手动调用git stash drop。”

其他回答

我自己也有类似的问题,我认为你所需要做的就是git重置——很难,你不会失去你的变化或任何未跟踪的变化。

如果你阅读git stash——help中的文档,它声明apply是“像pop一样,但不从stash列表中删除状态”,所以状态仍然驻留在那里,你可以取回它。

或者,如果没有冲突,您可以在测试更改后再次git stash。

如果你确实有冲突,不要担心,git重置-hard不会失去他们,因为 “应用状态可能会因冲突而失败;在这种情况下,它不会从收藏列表中删除。你需要手动解决冲突,然后手动调用git stash drop。”

如何反向应用收藏?

除了别人提到的,最简单的方法是先做

git reset HEAD

然后签出所有本地更改

git checkout . 

除了@Greg Bacon的答案之外,如果二进制文件被添加到索引中,并且是存储使用的一部分

git stash show -p | git apply --reverse

可能导致

error: cannot apply binary patch to '<YOUR_NEW_FILE>' without full index line
error: <YOUR_NEW_FILE>: patch does not apply

add -binary解决了这个问题,但不幸的是还没有找到原因。

 git stash show -p --binary | git apply --reverse

这早就应该了,但如果我正确地解释这个问题,我已经找到了一个简单的解决方案,注意,这是我自己的术语解释:

Git stash [save]将保存当前的更改,并将当前分支设置为“清洁状态”

git的存储列表提供如下内容

Git应用stash@{0}将当前分支设置为之前的stash [save]

Git结帐。将当前分支设置为存储[保存]之后

保存在stash中的代码不会丢失,它可以通过git apply stash@{0}再次找到。

不管怎样,这对我很管用!

git stash[save]获取你的工作目录状态和索引状态,并将它们存储起来,将索引和工作区域设置为HEAD版本。

Git stash apply会带回这些更改,所以Git reset—hard会再次删除它们。

Git stash pop带回这些更改并删除顶部存储的更改,因此Git stash [save]将在这种情况下返回到之前(预弹出)状态。