有没有办法重新订购Git stashes?

mac*_*ost 8 git git-stash

在Git中,可以制作多个藏匿处:

git stash save "quick temp stash"
git stash save "another quick temp stash"
git stash save "This is important but I need to put it on the back burner"
git stash save "This is almost certainly garbage, but just in case ..."
Run Code Online (Sandbox Code Playgroud)

现在,我知道我可以按任何顺序取回那些藏匿物:

git stash pop stash@{3} # recover quick temp stash
git stash pop stash@{2} # recover another quick temp stash
Run Code Online (Sandbox Code Playgroud)

但显然更方便的语法更可取:

git stash pop
Run Code Online (Sandbox Code Playgroud)

这不仅仅是因为打字的次数较少,而且因为需要的思维也较少:如果我有几个藏匿处,我必须仔细查看它们,也许git stash show还有一些,直到找到我想要的那个.但是,如果我只是将最近的"临时"藏匿在顶部(接着是下一个临时藏匿等),我根本不需要思考; 我只是pop.

所以,我的问题是,有什么方法可以重新订购我的藏匿处,以便我可以考虑在我保存它们时应该"弹出"它们,而不是在我"弹出"它们的时候.这将允许我仍然保存"这几乎肯定是垃圾,但以防万一......"和"这很重要,但我需要把它放在后面","但是在藏匿列表的后面,他们在不要复杂访问更简单的快速存储.

tor*_*rek 5

正如Whymarrh的回答Donnie的评论一样,我认为仅通过承诺可能会更好地为您服务。不过,我会指出:

如果您真的想继续使用存储并重新排序,可以refs/stash在工作时进行调整...

完全不使用即可执行此操作git stash pop。这很棘手。(编辑:我在重新阅读时看到这就是Whymarrh的回答中的想法。)

引用日志文件,.git/logs/refs/stash通过引用日志保持1条目Ñ(但许多存在)。该stash基准本身持有进入零。

一个drop操作包括删除特定的reflog条目(git reflog delete知道如何处理特殊的零情况):

drop_stash () {
        assert_stash_ref "$@"

        git reflog delete --updateref --rewrite "${REV}" &&
                say "$(eval_gettext "Dropped \${REV} (\$s)")" ||
                die "$(eval_gettext "\${REV}: Could not drop stash entry")"

        # clear_stash if we just dropped the last stash entry
        git rev-parse --verify --quiet "$ref_stash@{0}" >/dev/null ||
        clear_stash
}
Run Code Online (Sandbox Code Playgroud)

(其中clear_stash删除refs/stash自身)。该$REV论点是,或者如果你没有指定特定的一个。refs/stash@{N}refs/stash

store操作使用git update-ref以下命令将条目插入零:

[snip]
        w_commit="$1"
        if test -z "$stash_msg"
        then
                stash_msg="Created via \"git stash store\"."
        fi

        git update-ref --create-reflog -m "$stash_msg" $ref_stash $w_commit
        ret=$?
        test $ret != 0 && test -z "$quiet" &&
        die "$(eval_gettext "Cannot update \$ref_stash with \$w_commit")"
        return $ret
Run Code Online (Sandbox Code Playgroud)

因此,尽管有些棘手,却有可能实现“滚动”操作(如果您熟悉Forth或Postscript)。要向上滚动底部的三个条目,例如,更改:

E  stash@{4}
D  stash@{3}
C  stash@{2}
B  stash@{1}
A  stash@{0}
Run Code Online (Sandbox Code Playgroud)

变成:

E  stash@{4}
D  stash@{3}
B  stash@{2}
A  stash@{1}
C  stash@{0}
Run Code Online (Sandbox Code Playgroud)

您只需复制C到底部,就像通过new一样store,然后放下stash@{3}(由于插入为零而向上移动)。

实际上,您可以通过运行git stash -q store和并git stash -q drop使用适当的参数来执行此操作。