如何撤销一个意外的git stash pop并保留相同的stash消息?

3
我知道git存储仅本地可见,消息不会暴露给任何远程方,因此消息比提交消息不太相关。我似乎找不到获取已显式传递给git stash save的消息或检索它的其他方法,因为git stash pop未记录在git reflog中。我经常将信息写入stash消息,说明我为什么要stash以及stash实现的进度如何,因此它们对我非常有价值。我知道使用分支相对于使用git stash具有很多优点,几乎没有缺点。我正在逐渐养成不再使用git stash而是使用分支的习惯,但是我已经丢失了一些消息,因此想澄清一下这个问题。我的git stash pop输出如下:
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   test

no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (958d4b921e7f3e8faa9fd2ecb12af13250e1f739)
1个回答

2

首先,自Git 2.16+(2017年第四季度)起,git stash save现在被称为git stash push

您可以在t/t3903-stash.sh中使用git stash list查看消息(但这是在git stash pop之前)。

git stash仍然是一个shell脚本,并且您可以看到,当它创建存储时,实际上会创建提交

    # create the stash
    if test -z "$stash_msg"
    then
        stash_msg=$(printf 'WIP on %s' "$msg")
    else
        stash_msg=$(printf 'On %s: %s' "$branch" "$stash_msg")
    fi
    w_commit=$(printf '%s\n' "$stash_msg" |
    git commit-tree $w_tree -p $b_commit -p $i_commit $untracked_commit_option) ||
die "$(gettext "Cannot record working tree state")"

因此,git log 命令能够获取到该提交信息。


更准确地说,一个stash至少包含两个,有时候是三个commits;但是stash这个名字特指的是$w_commit这个commit,也就是带有stash名称的那个。所以,在丢弃之前可以使用git log -1 stash命令,或者在之后使用git log -1 <hash>命令(前提是该commit尚未被垃圾回收),来获取相应的消息。 - torek
@torek同意了,现在我更仔细地查看源代码 ;) - VonC

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