清除所有的git stash,除了一个特定的stash。

4
有时我使用`git stash`快速摆脱一些可能想要重新审查的突发事件或实验。很多情况下,我不会再回去看它们,我的存储列表变得混乱无序。
我想删除除一个特定的stash之外的所有内容。
例如:我的`git stash list`如下:
stash@{0}: On test-branch: try something
stash@{1}: WIP on spiked-branch: 2cc4751 another spike attempt
stash@{2}: On master: 2cc4751 experimental refactoring
stash@{3}: WIP on spiked-branch: 3ccfc4d first spike attempt

我希望只保留stash@{2}。有没有简单的方法实现这个目标?

我知道可以通过以下步骤来实现我的目标:

git reset --hard origin/master #=> ensure I have clean branch
git stash pop stash@{2} #=> put stash on current branch
git stash clear #=> clear all stashes
git stash #=> re-stash what I popped in step 2

这看起来很繁琐。有没有更高效的方法?

这可能是您的解决方案。https://dev59.com/Q2Qn5IYBdhLWcg3wZGd4 - Anthony C
1
@AnthonyC 嗯,我不这么认为。我并不想运行 git cherry-pick,整个存储应该保持完整,并在我的 git stash list 中。 - farisj
1个回答

4

为了让这个过程更加简单,一种方法是将命令放在脚本中。在这里,我已经这样做了,并进行了一些修改以使其更加强大:

#!/bin/sh

git reset --hard HEAD && git stash pop stash@{$1} && git stash clear && git stash

与您的版本不同之处:

  1. 使用HEAD而不是分支名称,以避免意外移动分支指针。
  2. 根据第一个参数选择要弹出的存储。
  3. 使用&&将命令链接在一起,因为如果一个命令失败,您可能不希望继续执行下一个命令。

然后,您可以像这样调用它:

mystashclear.sh 2

您想保存第二个隐藏区的位置。

或者,您可以使用别名:

git alias.clear-except "! git reset --hard HEAD && git stash pop stash@{$1} && git stash clear && git stash"

再次使用时,您可以这样做:

git clear-except 2

1
这是一个很棒的想法。谢谢! - farisj

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