【问题标题】:git grep <pattern> <stash> shows diff, but git stash show <stash> doesn't?git grep <pattern> <stash> 显示差异,但 git stash show <stash> 不显示?
【发布时间】:2021-01-21 10:48:19
【问题描述】:

我目前正在尝试在存储中查找一些更改,我知道它是 stash@{1}。为此,我使用git grep:

git grep somePattern stash@{1}

这会返回我正在搜索的内容。

但是,在运行 git stash show 时,这些更改不在这里,我得到一个不同的差异,不包含我的更改。

git stash show stash@{1}

如果我尝试 git stash apply 说更改,也是一样。

git stash 在显示/应用时是否有任何行为阻止更改成为此存储的一部分?

【问题讨论】:

    标签: git grep diff


    【解决方案1】:

    git grep 在提交的完整内容中搜索模式(不仅仅是它引入的更改)。

    如果somePattern 存在于任何其他文件中(包括存储中未更改的文件),您将看到输出。


    如果您想发现 更改 包含该模式的文件,而不是 git grep,请尝试以下之一:

    git show -S somePattern stash@{1}
    # or :
    git show -G somePattern stash@{1}
    

    在你的情况下:看起来你正在寻找的模式不是stash@{1}更改的一部分。

    如果您想检查所有存储条目的内容,请使用git reflog stash 上的-S-G 选项之一:

    # * you also need the '-m' option when inspecting the stash, because all
    #   stash entries are actually merge commits
    # * '-p' will print the patch of files matching the pattern, and will
    #   allow you to see if those are the changes you are looking for
    git reflog --oneline -m -S somePattern -p stash
    

    【讨论】:

    • 在这里小心git show:你需要-m和/或--first-parent。 (在即将推出的 Git 中,有一个新标志,表示 -m --first-parent。)
    • 谢谢你。我已经尝试了这两个命令,但它们仍然没有显示我正在搜索的差异。此外,somePattern 似乎不存在于当前提交状态: - 如果我 git grep somePattern stash@{1},它显示文件 - 如果我 cat path-of-file-from-that-grep-output,则不存在更改。所以从逻辑上讲,它应该出现在git showgit stash show 输出中?
    • @torek :我忘记了存储是合并提交,更新了我的答案。谢谢。 [edit] 我需要git reflog -S ...-m 选项,但git show -S ... 可以立即工作(默认情况下,差异以组合差异格式呈现)。这种行为是最近发生的变化吗?
    • 如果合并的文件“与所有父文件不同”(因此,与索引和先前提交都不同),您将获得差异。我在自己的回答中可能夸大了这种情况:如果您没有git add-ed 文件,您可以获得差异。尽管如此,组合的差异会从这个差异中删除一些变化。我从来没有完全清楚在组合差异中哪些差异大块被丢弃;我应该花点时间研究一下……
    【解决方案2】:

    这有多种可能的原因:

    • stash 实际上是两个(或有时三个)提交的复合体。 git grep 操作查看 W(工作树)提交,完全忽略 I(索引状态)提交。1

    • 作为LeGEC notesgit stash show 生成一个差异。差异是从 W 提交的父级到 W 提交。

    • 很容易意外运行git show stash 而不是git stash show。这works,对于work 的某些定义,但也失败了,因为存储是提交的复合体。 W 提交具有合并提交的形式。2 这使得 git show 使用 combined diff 来显示它,并且由于构建存储的方式,这个组合的差异可以完全为空(这取决于您在运行git stashgit add-ed)。

    很难准确地知道您可能遇到了哪些问题,但所有这些问题都会引起混淆。


    1如果存在第三次提交,它会保存未跟踪的文件,git grep 也会忽略它。这是因为refs/stashstash@{<em>whatever</em>} 指向W 提交。

    2这意味着W 提交一个合并提交。但它不是由git merge 制作的,并且应用 它的普通 Git 工具会产生荒谬的结果。 W 是一个合并的原因是能够找到其余的存储提交,以及进行存储的提交,所有这些都使用简单的 gitrevisions 语法。

    【讨论】:

      猜你喜欢
      • 2014-03-11
      • 1970-01-01
      • 2017-11-25
      • 2013-02-23
      • 1970-01-01
      • 2019-03-05
      • 1970-01-01
      • 2012-09-10
      相关资源
      最近更新 更多