git 清空藏品,​​特定藏品除外

git stash clear, except a specific stash

有时我使用 git stash 来快速摆脱任何我认为我可能想重新访问的尖峰或实验。很多时候,我不会重新访问它们,我的收藏列表就会被污染。

我想删除我 git 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

这看起来很乏味。有没有更有效的方法?

一种让它不那么乏味的方法是将命令放在脚本中。我已经这样做了,并进行了一些修改以使其更健壮:

#!/bin/sh

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

与您的版本相比的变化:

  1. 使用 HEAD 而不是分支名称,这样您就不会意外地移动分支指针。
  2. Select 根据第一个参数弹出哪个存储。
  3. 使用 && 将命令链接在一起,因为如果一个失败,您可能不想继续下一个。

您可以这样称呼它,例如:

mystashclear.sh 2

你想保存第 2 号藏品的地方。

或者,您可以只使用别名:

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

您还可以将其用作:

git clear-except 2