如何反向应用一个"stash"?

327

我有一个小的补丁保存在我的git储藏中。 我使用git stash apply将其应用于我的工作副本。现在,我想通过反向应用补丁(类似于git revert但是针对储藏)来撤销这些更改。

有人知道如何做到这一点吗?

澄清:我的工作副本中还有其他更改。 我的特殊情况很难描述,但您可以想象一些调试或实验代码在储藏中。现在,它与我的工作副本中的其他更改混合在一起,并且我想查看来自储藏的更改和不带有这些更改的效果。

看起来储藏目前不支持此功能,但git stash apply --reverse将是一个不错的特性。


1
难道不能通过对比当前版本和上一个版本之间的差异来创建一个反向补丁,然后应用它吗? - ralphtheninja
工作树中是否有除应用的存储之外的更改? - Greg Bacon
将此添加到这里,本应是一个常见问题解答,而不是一个问题... https://stackoverflow.com/questions/59973103/git-how-to-undo-revert-a-saved-stash-by-message-easily/59973105#59973105 - Don Thomas Boyle
14个回答

0

这是除了上面的答案之外,还添加了基于消息搜索git stash的功能,因为当保存新的stash时,stash号码可能会发生变化。 我编写了几个bash函数:

apply(){
  if [ "$1" ]; then
    git stash apply `git stash list | grep -oPm1 "(.*)(?=:.*:.*$1.*)"`
  fi
}
remove(){
  if [ "$1" ]; then
    git stash show -p `git stash list | grep -oPm1 "(.*)(?=:.*:.*$1.*)"` | git apply -R
    git status
  fi
}
  1. 创建一个名为(message)的stash $ git stash save "my stash"
  2. 应用命名的stash $ apply "my stash"
  3. 删除命名的stash $ remove "my stash"

0
如果有任何合并冲突,使用git stash show -p | git apply --reverse将不起作用。如果您使用的是IntelliJ或Android Studio,请尝试在文件菜单下使用本地历史。这对我进行还原很有帮助。

0

我自己也遇到了类似的问题,我认为你只需要执行 git reset --hard 命令,就可以不会丢失你的修改或未跟踪的更改。

如果你在 git stash --help 中阅读文档,它会说明 apply 命令是“像 pop 命令,但不会从存储列表中删除状态”,因此该状态仍然驻留在那里,你可以将其取回。

另外,如果没有冲突,你可以在测试完你的更改后再次使用 git stash 命令。

如果你有冲突,不用担心,git reset --hard 命令不会丢失它们,因为“应用状态可能由于冲突而失败。在这种情况下,它不会从存储列表中删除。你需要手动解决冲突,并之后手动调用 git stash drop 命令。”


0

对我来说,当我检出时,我只是输入了错误的存储库名称。因此,实际上没有远程内容可供拉取。

因此,在检查大小写的同时,请检查分支名称的拼写,或者更好的方法是将其复制并粘贴以排除可能性。


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