从Git stash中查找并解压缩文件

Dan*_*Dan 13 git

也许我经常使用git stash,但当我想在项目中丢弃我的实验时,这就是我通常做的事情.

问题1:

  • 我如何在当前所有的藏匿处搜索文件名?

问题2:

  • 我怎么能把这个文件解压缩到单独的文件夹?

  • 或其他选项:如何为该藏匿文件启动可视化差异工具?

seh*_*ehe 12

更重要的是要认识到这refs/stash是一个伪分支(ref)的reflog:

git rev-list --walk-reflogs stash # (long option)
git rev-list -g stash # (short option)
Run Code Online (Sandbox Code Playgroud)

所以你可以找到该文件:

for sha in $(git rev-list -g stash); 
do 
     git ls-tree -r $sha:; 
done |
   grep "$SOMEFILENAME" | 
   sort --unique
Run Code Online (Sandbox Code Playgroud)

(唯一的排序是删除不同藏匿处中相同版本的重复项).

例如:

$ for sha in $(git rev-list -g stash); do git ls-tree -r $sha:; done | grep numeric.js | sort -u
100644 blob f1c9a61910ae1bbd562615444a45688b93e9d808    LSPO.Web/DaVinci/JScript/numeric.js
Run Code Online (Sandbox Code Playgroud)

因此,您可以使用例如启动视觉差异

kompare numeric.js <(git cat-file -p f1c9a61910ae1bbd562615444a45688b93e9d808)
Run Code Online (Sandbox Code Playgroud)

当然,如果您已经预感到reflog包含不同的文件,那么这将更容易:

git diff stash@{3} -- numeric.js 
Run Code Online (Sandbox Code Playgroud)


Kir*_*rby 6

@sehe的答案为问题2提供了一个很好的答案.

我来到这个页面寻找问题1的答案比我目前使用的答案更好.我目前使用的是一个shell脚本stashshowall.sh然后我grep输出.

我的答案的不同之处在于,虽然这里的其他答案告诉您,您要查找的文件是否已更改,但是如果您想要存储,他们不会告诉您该文件存在哪个apply存储.

我的回答纯粹是使用"瓷器"git命令,但它对我有用.

#!/bin/sh
#  stashshowall.sh
for stash in `git stash list | sed 's/\(\w*\)\:.*/\1/'`
do
    echo
    echo "$stash"
    git stash show $stash
done
Run Code Online (Sandbox Code Playgroud)

所以为了回答问题1,我跑了

> stashshowall.sh | grep "stash\|some-file"
Run Code Online (Sandbox Code Playgroud)

这给了我

stash@{0}
stash@{1}
 .../some-dir/some-file     | 16 ++--
stash@{2}
stash@{3}
stash@{4}
 .../some-dir/some-file     | 2 ++--
stash@{5}
Run Code Online (Sandbox Code Playgroud)

这样我知道我需要apply或进一步观察stash{1}stash{4}


unt*_*ght 6

tl;博士

文件名的 grep 存储:

git reflog stash -- '*fileglob*'
git log -g stash -- '*fileglob*'
Run Code Online (Sandbox Code Playgroud)

grep 存储内容:

git stash list -G<regex>
Run Code Online (Sandbox Code Playgroud)

搜索文件名的存储条目

git help stash

您创建的最新存储存储在refs/stash; 在此引用的引用日志中可以找到较旧的存储,并且可以使用通常的引用日志语法(例如stash@{0}...)

git help reflog

git reflog show 是别名 git log -g --abbrev-commit --pretty=oneline

git 帮助日志

-g
--walk-reflogs
不是走提交祖先链,而是将 reflog 条目从最近的条目遍历到较旧的条目。

git 日志概要

git log [<options>] [<revision range>] [[\--] <path>...]
Run Code Online (Sandbox Code Playgroud)

git 修订规范

<refname>, 例如 master, head/master, refs/heads/master
一个符号引用名称。...
当有歧义时, a<refname>通过采用以下规则中的第一个匹配项来消除歧义:

  1. 如果$GIT_DIR/<refname>存在,那就是你的意思(这通常只对HEAD, FETCH_HEAD, ORIG_HEAD,MERGE_HEAD和有用CHERRY_PICK_HEAD);

  2. 否则,refs/<refname>如果存在;

现在我们拥有了一切:

git reflog stash -- '*fileglob*'
git log -g stash -- '*fileglob*'
Run Code Online (Sandbox Code Playgroud)

因此,我们stash将解析为refs/stash-g并将导致遍历整个分支,并且`--' fileglob ' 将匹配该提交中的任何路径。

搜索存储内容

git 帮助藏匿

...该命令采用适用于git log命令的选项来控制显示的内容和方式。请参阅git-log

git 帮助日志

-G<regex>
查找补丁文本包含匹配的添加/删除行的差异<regex>

所以简单的命令是:

git stash list -G<regex>
Run Code Online (Sandbox Code Playgroud)

其他镐命令也应该有效。