这周我学习了如何使用Git stash,发现所有这些stash都在我的系统中累积。我放错了一些代码,现在我有一打0-11的stash。
有没有一种方法可以让我在这些隐藏文件中搜索字符串值,以找到我要找的代码?或者我只需要遍历并重新应用每个隐藏文件,以在其中搜索/查找我要找的代码?
**2021年3月18日:**我发现了其他相关信息。
你可以创建一个Git别名来搜索所有分支。修改你的.gitconfig
文件并调用git stash-search <pattern>
。
[alias]
stash-search = "!f() { git show $(git stash list | cut -d\":\" -f 1) | grep \"$@\" ; }; f"
7条答案
按热度按时间yeotifhr1#
有一些有用的想法in this Gist and discussion thread。
首先,列出匹配的stash很容易(使用或不使用
-i
,取决于大小写)如果没有那么多需要挖掘的内容,您可以添加
-p
来完整地打印匹配的存储。为“真实的”案例提供更多功能,将其添加到
.gitconfig
:然后你可以用任何你喜欢的grep参数(
-w
,-i
)来调用git stashgrep
。这与上面的一些答案不同,因为它会在隐藏ID之前显示每个差异的来源:
qoefvg9y2#
git stash show -p stash@{n} | grep "john cena"
是我认为唯一的选择。当然你可以写你自己的剧本。
chhkpiq43#
git stash list -S "my string"
在Git 2.28上工作,用于查找添加或删除"my string"
的补丁。我不知道这种能力存在了多久;文档暗示它应该接受与
git log
相同的所有选项,包括-S
,但我清楚地记得几年前还不能用这种方式进行搜索。iaqfqrcu4#
一行:
git grep会很方便地输出修改后的行,其中包含stash的名称和文件的名称:
9rnv2umw5#
git grep
命令接受"树"对象:概要
现在考虑一个隐藏条目是一个树对象,该树对象是从你调用
git stash
时的工作树的内容合成的,它的两个双亲是HEAD
处的状态和索引中的状态;引用该手册:一个stash被表示为一个提交,它的树记录了工作目录的状态,它的第一个父提交是在
HEAD
创建stash时的提交,第二个父提交的树记录了索引在stash创建时的状态,它是HEAD
提交的一个子提交。其中
H
是HEAD
提交,I
是记录索引状态的提交,以及W
是记录工作树状态的提交。因此,您可以有三个位置来grep您的stash条目:
git grep [options] term stash@{n}
将对term
的W
提交进行grep,也就是说,它将对工作树文件的保存状态进行grep。W
的第二个父项;这是使用^2
后缀完成的:git help revisions
手册中对^<n>
表示法进行了解释:<rev>^
,例如HEAD^
,v1.5.1^0
修订参数的后缀^
表示该提交对象的第一个父对象。^<n>
表示第<n>
个父对象(即<rev>^
等于<rev>^1
)。作为特殊规则,<rev>^0
表示提交本身,并且在<rev>
是引用提交对象的标签对象的对象名时使用。TL; DR
对于顶层藏匿项,请使用
git grep whatever stash@{0}
以grep工作树的状态。git grep whatever stash@{0}^2
以grep索引的状态。wqsoz72f6#
基于流行的答案,我用这个:
我觉得这样更好记。
3htmauhk7#
要添加到Andrejs Cainikovs的答案,您可以添加seq以搜索所有
seq 0 5 | xargs -I {} git stash show -p stash@{\{\}} | grep your_pattern