11

我习惯于将我的更改存储在 git 中并再次使用git stash apply. 这样做的好处是可以防止我意外丢失我创建的存储,但这也意味着我的存储列表增长得相当快。

当我完成一个分支时,我会返回我的存储列表并手动删除与该分支关联的所有存储。有没有办法在一个命令中做到这一点?

例如,我当前的存储列表如下所示:

kevin@localhost:~/my/dev/work$ git stash list
stash@{0}: WIP on master: 346f844 Commit comment
stash@{1}: WIP on second_issues: a2f63e5 Commit comment
stash@{2}: WIP on second_issues: c1c96a9 Commit comment
stash@{3}: WIP on second_issues: d3c7949 Commit comment
stash@{4}: WIP on second_issues: d3c7949 Commit comment
stash@{5}: WIP on second_issues: d3c7949 Commit comment
stash@{6}: WIP on second_issues: 9964898 Commit comment

是否有一个命令可以删除所有的存储second_issues

4

3 回答 3

4

那这个呢?这是一种快速而肮脏的方式,可以删除在给定分支上创建的存储。

它简单地列出所有存储,使用 grep 搜索在分支上创建的存储,获取其存储名称,最后git stash drop通过 xargs 传递这些名称。

git stash list | grep -E 'stash@{[0-9]+}.+ YOUR_BRANCH_NAME' | cut -d ':' -f 1 | xargs git stash drop

编辑

挖掘手册页,它说它git stash list也接受git log格式选项。
所以我们告诉它打印只匹配YOUR_BRANCHNAME的行,并且这些行只打印它的“重新标记身份名称”(%gd: shortened reflag selector, e.g., stash@{1}来自手册页)。
然后,我们将输出传递xargs给以删除存储。

git stash list --grep='YOUR_BRANCHNAME' --format='%gd' | xargs git stash drop
于 2013-07-17T08:20:10.063 回答
2

存储不依赖于任何分支。存储只是存储库的存储。每个存储库都只有一个存储库,但您可以将任意数量的更改集放在一个存储库中,并将它们保留以备后用。因此,分支之间的存储并不相同。在您的情况下,无论您签出哪个分支,stash@{6} 都会向您显示相同的提交。如果您想清除您的存储,您可以运行git stash clear,这将清除您存储的该存储库的所有隐藏更改。这是一个非常具有破坏性的操作,所以使用它时要小心。

于 2013-07-10T22:57:08.277 回答
1

检查存储和给定分支之间关系的一种方法是检查存储的父提交是否包含在您的分支中。

存储的父提交是创建存储的提交。如果此提交存在于您感兴趣的分支中,您可以删除它们或采取必要的措施。

有一个小的 bash 脚本可以检测您的任何存储是否来自当前包含在的提交HEAD

#!/bin/bash

# Get a list of all stashes, like "stash@{0}", "stash@{1}", and so on
stashList=$(git stash list | grep -o "^stash@{[0-9]*}")

for stashRef in $stashList; do

    # Obtain hashes for the stash and its first parent
    currentHash=$(git rev-parse $stashRef)
    parentHash=$(git rev-parse $stashRef^)

    echo "$stashRef: $currentHash"
    echo "parent: $parentHash"

    # merge-base checks for the common parent
    mergeBase=$(git merge-base $parentHash HEAD)

    # If a commit is contained in another commit, it will be the base
    # commit returned by merge-base
    if [[ $mergeBase == $parentHash ]]; then
        echo 'Contained in HEAD'
    else
        echo 'Not contained in HEAD'
    fi
done
于 2013-07-17T01:29:54.187 回答