我为一个功能写了相当多的代码,并在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
.
Dag*_*ahl 14
要搜索存储中的更改,请使用git stash list
pickaxe选项-G
(from git log
):
git stash list -G regex_matching_some_added_or_removed_string
Run Code Online (Sandbox Code Playgroud)
注意:在存储合并提交的情况下,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,所以我们甚至不关心父母.
这是我使用的命令。它可以帮助我确定所引用的藏匿处。
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 具有我正在寻找的内容:
如果您只列出了几个藏品,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)
然后搜索您的字符串或文件,或者只是浏览它。这可能很大。