隐藏了一些代码,但不知道它藏在哪个 - 如何搞清楚?

use*_*433 20 git git-stash

我为一个功能写了相当多的代码,并在git中隐藏了这些变化.

之后,我将几个更改推送到存储库并执行git stash并多次应用(读取超过100次).

差不多2个月后,我现在想从git stash中检索更改 - 但无论如何我都找不到它们.

试了好几种git stash apply,git stash list,git stash list -p.什么都行不通.我找不到那些陈旧的变化.

希望我采取了备份,而不是信任git来藏匿他们......叹息......

有人可以帮忙吗?

Ale*_*iri 16

试试这个:

git stash list -p | grep 'diff --git' | grep <your file name>
Run Code Online (Sandbox Code Playgroud)

这将在列表中找到您的文件.这可能需要一段时间.

一件事:git stash apply不丢弃藏匿处.申请成功后,你应该git stash drop这样做,不要让你的名单混乱.就个人而言,我使用存储git stash pop.

  • 这样做的问题是,它只是显示 diff 行 1 次或多次,但你不知道它们在什么存储中。 (3认同)

Dag*_*ahl 14

要搜索存储中的更改,请使用git stash listpickaxe选项-G(from git log):

git stash list -G regex_matching_some_added_or_removed_string
Run Code Online (Sandbox Code Playgroud)


Von*_*onC 6

注意:在存储合并提交的情况下,a git stash list -p将不返回任何内容.
这将随着Git 2.2(2014年第4季度)和Jeff King()提交288c67c而改变:peff

stash:默认列出工作树差异

列出存储时,可以提供任意git log选项来更改显示.但是,添加只是" -p"没有任何作用,因为每个存储实际上是一个合并提交.

这个实现细节很容易被遗忘,导致混淆的用户认为" -p"不起作用.我们可以通过默认为" --first-parent -m" 来使这更容易,这将显示工作树的差异.
这完全省略了藏匿的索引部分,但它很简单并且与" git stash show"提供的匹配.

对存储的真实形式更有意义的人可以使用" --cc"覆盖" -m",然后" --first-parent"将不执行任何操作.
对于差异,它只影响非组合差异,因此" --cc"覆盖它.
而对于遍历,无论如何我们都在走线性reflog,所以我们甚至不关心父母.


Unc*_*roh 6

这是我使用的命令。它可以帮助我确定所引用的藏匿处。

git stash list | while IFS=: read STASH ETC; do echo "$STASH: $ETC"; git diff --stat $STASH~..$STASH --; done | grep -e 'stash\|<partial_name_of_file_being_searched_for>'
Run Code Online (Sandbox Code Playgroud)

我还将它与.bashrc文件中的别名结合使用,如下所示:

function gitsearch()
{
   searchCrit='stash\|'$1
   git stash list | while IFS=: read STASH ETC; do echo "$STASH: $ETC"; git diff --stat $STASH~..$STASH --; done | grep -e $searchCrit
}
alias githunt=gitsearch
Run Code Online (Sandbox Code Playgroud)

最终结果是我可以这样搜索我的 git stashes:

githunt LoanApplicationFee

并获得以下结果,我可以在其中快速看到 stash 45 具有我正在寻找的内容:

在此处输入图片说明


Ale*_*own 5

如果您只列出了几个藏品,git stash list那么您可以一项一项地检查它们,看看它们是否正确:

git show 'stash@{0}'
git show 'stash@{1}'
Run Code Online (Sandbox Code Playgroud)

ETC。

如果您在许多存储中都有一些代码,并且可以记住您在文件中输入的字符串或关键字(几乎)唯一标识该代码(我DUNKIRK在这里使用),请使用以下命令搜索它bash

for i in `git reflog --pretty=format:%H stash`; do git grep DUNKIRK $i; done
Run Code Online (Sandbox Code Playgroud)

请注意, git grep 搜索整个结帐 - 而不仅仅是更改。

比较 @siri 的答案,它搜索在存储中更改的文件名 - 这是另一个有用的策略。

或者,仅搜索差异

 git reflog -p stash | less
Run Code Online (Sandbox Code Playgroud)

然后搜索您的字符串或文件,或者只是浏览它。这可能很大。