也许我经常使用git stash,但这是我想要删除项目中的实验时通常采用的方法。
问题1:
- 如何在所有当前的stash中搜索文件名?
问题2:
如何将该文件提取到单独的文件夹中?
另一种选择:如何为该存储的文件启动可视化差异工具?
也许我经常使用git stash,但这是我想要删除项目中的实验时通常采用的方法。
问题1:
问题2:
如何将该文件提取到单独的文件夹中?
另一种选择:如何为该存储的文件启动可视化差异工具?
更加确切的是要认识到refs/stash
是一个伪分支(ref)的引用日志(reflog):
git rev-list --walk-reflogs stash # (long option)
git rev-list -g stash # (short option)
因此您可以找到该文件:
for sha in $(git rev-list -g stash);
do
git ls-tree -r $sha:;
done |
grep "$SOMEFILENAME" |
sort --unique
(The unique sort是为了删除不同stash中相同版本的重复项。)$ 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
你可以使用以下方式启动视觉差异比较:
kompare numeric.js <(git cat-file -p f1c9a61910ae1bbd562615444a45688b93e9d808)
当然,如果你已经有了一个直觉,知道哪个reflog包含了不同的文件,那么这将会更容易:
git diff stash@{3} -- numeric.js
stashshowall.sh
的Shell脚本,然后我会对输出进行grep操作。#!/bin/sh
# stashshowall.sh
for stash in `git stash list | sed 's/\(\w*\)\:.*/\1/'`
do
echo
echo "$stash"
git stash show $stash
done
> stashshowall.sh | grep "stash\|some-file"
这给了我
stash@{0}
stash@{1}
.../some-dir/some-file | 16 ++--
stash@{2}
stash@{3}
stash@{4}
.../some-dir/some-file | 2 ++--
stash@{5}
这样我就知道我需要应用
或进一步查看stash{1}
或stash{4}
$ sh stashshowall.sh | grep "stash\|your_file"
- Wolandtl;dr
grep stash for filename:
git reflog stash -- '*fileglob*'
git log -g stash -- '*fileglob*'
git stash list -G<regex>
从git帮助stash中得知:
你创建的最新存储项存储在
refs/stash
中;旧的存储项可以在此引用的reflog中找到,并且可以使用通常的reflog语法进行命名(例如stash@{0}
...)
从git帮助reflog中得知:
git reflog show
是git log -g --abbrev-commit --pretty=oneline
的别名。
从git帮助log中得知:
-g
--walk-reflogs
不要遍历提交祖先链,而是从最近的一个向较旧的条目遍历reflog。
git log [<options>] [<revision range>] [[\--] <path>...]
从Git修订规范中:
<refname>
,例如master、heads/master、refs/heads/master
一个符号性的引用名称……
当有歧义时,通过以下规则找到第一个匹配的来消除<refname>
的歧义:
如果存在
$GIT_DIR/<refname>
,那么就是指该引用(这通常只对HEAD
、FETCH_HEAD
、ORIG_HEAD
、MERGE_HEAD
和CHERRY_PICK_HEAD
有用);否则,如果存在
refs/<refname>
,则指该引用;
现在我们把所有东西汇集在一起:
git reflog stash -- '*fileglob*'
git log -g stash -- '*fileglob*'
因此,我们的 stash
会被解析为 refs/stash
,而 -g
将导致整个分支被遍历,`--'fileglob'` 将匹配该提交中的任何路径。
... 该命令采用适用于 git log 命令的选项以控制显示内容和方式。请参见 git-log。
来自git help log:
-G
<regex>
查找差异的补丁文本包含与<regex>
匹配的已添加 / 已删除行的内容。
因此,简单的命令为:
git stash list -G<regex>
其他镐子命令也应该能够正常工作。
git stash list | cut -d ":" -f 1 | xargs -L1 git diff --stat | grep <filename>
您可以创建一个包含存储内容的新分支 (git checkout -b <new_branch> <stash>
),然后将文件复制到其他地方并稍后合并回来。git difftool
命令来获得您的差异的可视化效果。for i in $(git stash list | cut -d ":" -f 1 | xargs -L1 git show | grep commit |
cut -d" " -f 2)
do
if git show $i --oneline --stat | grep ht.h
then
echo $i
fi
done