是否可以搜索Git Stash项目?

Eli*_*jah 9 git search

所以我正在学习本周使用Git Stash,并且发现所有这些stashes一直在我的系统上积累.我放错了一些代码,现在我有十几个代码0-11.

有没有办法可以在存储区中的文件中搜索这些存储区中的字符串值,以找到我正在寻找的代码?或者我是否只需要通过并重新应用每个存储来搜索/查看它们我想要找到的代码?

小智 19

git stash list -S "my string"适用于 Git 2.28,查找添加或删除"my string".

我不知道这个功能已经存在多久了;该文档暗示它应该接受与 相同的所有选项git log,包括-S,但我清楚地记得几年前无法以这种方式进行搜索。


Jos*_*erg 17

有一些有用的想法 这个要点和讨论主题中

首先,只列出匹配的 stashes 很容易(有或没有 -i,取决于大小写)

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

如果没有太多可挖掘的内容,您可以添加-p以完整打印匹配的存储。

git stash list -i -p -G<regexp>
Run Code Online (Sandbox Code Playgroud)

为“真实”案例提供更多功能,添加到.gitconfig

[alias]
    stashgrep = "!f() { for i in `git stash list --format=\"%gd\"` ; \
              do git stash show -p $i | grep -H --label=\"$i\" \"$@\" ; done ; }; f"
Run Code Online (Sandbox Code Playgroud)

然后你可以git stashgrep用你喜欢的任何grep参数(-w,-i)调用。例如,

git stashgrep -i <regexp>
Run Code Online (Sandbox Code Playgroud)

这与上面的一些答案不同,因为它预先设置了存储 ID 以显示每个差异的来源:

% git stashgrep -i tooltip
stash@{5}: //            resetBatchActionTooltip();
stash@{5}:         addAcceleratorsAndTooltips(lToolMenu, lToolButton, iListener, iTool);
stash@{5}:     private void addAcceleratorsAndTooltips(AbstractButton lToolMenu,
stash@{5}:+        String lToolTip = iTool.getToolTipText();
stash@{5}:             lToolButton.setToolTipText(lToolTip);
stash@{20}:+    private static final String invalidSelectionTooltip = "Invalid selection.  Please choose another.";
stash@{20}:-    private final String invalidSelectionTooltip = "Invalid selection.  Please choose another.";
stash@{20}:                         ((JTextField)lComponent).setToolTipText(
Run Code Online (Sandbox Code Playgroud)


And*_*ovs 11

git stash show -p stash@{n} | grep "john cena" 是我认为唯一的选择.

当然你可以编写自己的脚本.

  • https://gist.github.com/libinvarghese/e899fb4f6978734f1910b7ead6d6bc06 这将帮助您搜索所有藏品 (3认同)
  • @ LibinVarghese,oneliner:`git show $(git存储列表| cut -d“:” -f 1)| grep“约翰·塞纳” (2认同)

Tar*_*mán 7

单线:

git grep whatever $(git stash list -q | cut -d":" -f 1)
Run Code Online (Sandbox Code Playgroud)

和 git grep 方便地输出带有存储名称和文件名称的更改行:

stash@{43}:common/ot/whatever.js:exports.whatever = (foo, deps) => {
stash@{44}:common/ot/whatever.js:exports.whatever = (foo, deps) => {
Run Code Online (Sandbox Code Playgroud)

  • 这不会搜索存储中已更改的代码。它搜索整个结果工作树,包括在隐藏提交中未更改的文件。(因此,如果我以这种方式在我的存储中搜索“无论什么”,每个存储都会显示来自相同长期未触及的文件的相同匹配行) (4认同)