【问题标题】:stashed some code but don't know which stash it is in - how to figure out?隐藏了一些代码,但不知道它在哪个隐藏处 - 如何弄清楚?
【发布时间】:2014-02-03 12:41:49
【问题描述】:

我为一个特性编写了大量代码,并将更改隐藏在 git 中。

之后,我将几个更改推送到存储库中,并进行了 git stash 并多次应用(阅读超过 100 次)。

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

尝试了几个git stash applygit stash listgit stash list -p。没有任何效果。我找不到那些旧的隐藏更改。

希望我有备份而不是信任 git 来存储它们...叹息...

谁能帮忙?

【问题讨论】:

  • 一个 stash 仅保存在最初存储它们的存储库中 - 它不会通过克隆、推送或拉取进行复制。您是否在同一个存储库中运行?你有没有在 HEAD 中检查过这些变化?
  • git stash list 的输出是否显示 anything
  • Git stash 不是一个可靠的长期存储更改。通常最好提交,然后将它们移到一个单独的分支中。
  • 好吧,查看git show 'stash@{0}'git show 'stash@{1}' 等隐藏文件以找到您的代码。单引号很重要,因为 { 是一个 bash 元字符。

标签: git git-stash


【解决方案1】:

试试这个:

git stash list -p | grep 'diff --git' | grep <your file name>

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

有一件事:git stash apply 不会丢弃存储。成功申请后,您应该git stash drop 这样它就不会弄乱您的列表。就个人而言,我使用git stash pop 应用存储。

【讨论】:

  • 很好 - 我喜欢 git stash list -p,我以前没见过。
  • 感谢@Alex Siri 的帮助。隐藏弹出提示帮助
  • git stash pop不是邪恶的吗?
  • 这个问题是它只是简单地显示 diff 行 1 次或多次,但你不知道它们在什么存储区。
【解决方案2】:

要在您的 stash 中搜索更改,请使用 git stash list 和镐选项 -G(来自 git log):

git stash list -G regex_matching_some_added_or_removed_string

【讨论】:

  • 感谢@VonC 提供有关git log 选项的提示。
【解决方案3】:

注意:如果是隐藏的合并提交git stash list -p 将不会返回任何内容。
这将随着 Git 2.2(2014 年第四季度)和 commit 288c67c Jeff King (peff) 改变:

stash:工作树差异的默认列表

当您列出存储时,您可以提供任意git log 选项来更改显示。然而,只添加“-p”什么也没做,因为每个存储实际上都是一个合并提交

这个实现细节很容易忘记,导致困惑的用户认为“-p”不起作用。我们可以通过默认为“--first-parent -m”来简化此操作,这将 显示与工作树的差异。
这完全省略了存储的索引部分,但它很简单,并且与“git stash show”提供的内容相匹配。

对 stash 的真实形式更加了解的人可以使用“--cc”覆盖“-m”,然后“--first-parent”将什么也不做。
对于差异,它只影响非组合差异,因此“--cc”会覆盖它。
对于遍历,无论如何我们都在走线性 reflog,所以我们甚至不在乎 关于父母。

【讨论】:

    【解决方案4】:

    这是我使用的命令。它可以帮助我确定所引用的存储。

    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>'
    

    我还将它与我的 .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
    

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

    githunt LoanApplicationFee

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

    【讨论】:

      【解决方案5】:

      如果您在git stash list 中只列出了几个 stash,那么您可以一一检查它们是否是正确的:

      git show 'stash@{0}'
      git show 'stash@{1}'
      

      等等

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

      for i in `git reflog --pretty=format:%H stash`; do git grep DUNKIRK $i; done
      

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

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

      或者,只搜索差异

       git reflog -p stash | less
      

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

      【讨论】:

      • git reflog -p stash 可能与@siri 回答中的git stash list -p 的逻辑相同。
      【解决方案6】:

      上述答案中的 git 命令组合帮助了我满足我的需要。在这里发布我的答案,因为它可能会帮助其他人,因为我不能接受任何一个答案/评论

      git stash list -p - showed me the list of stashes
      
      git stash pop 'stash@{12}' - popped out the 12th stash which contains my code.
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-11-03
        • 2014-10-24
        • 1970-01-01
        • 1970-01-01
        • 2023-02-14
        • 1970-01-01
        • 2021-07-31
        相关资源
        最近更新 更多