【问题标题】:Is it possible to preview stash contents in git?是否可以在 git 中预览存储内容?
【发布时间】:2011-04-04 04:04:45
【问题描述】:

我经常把工作放在后面,然后其他东西出现,几周后,我想检查存储,看看如果我将它应用到当前状态的工作树会产生什么变化。

我知道我可以在 stash 上执行 git diff,但这向我展示了工作树和 stash 之间的所有差异,而我只是想知道 stash 应用会发生什么变化。

我该怎么做?

【问题讨论】:

  • 彩色差异输出:git stash show -p stash@{1} >~/.diff && vim ~/.diff(不一定是vim。任何文本编辑器只要您的文本编辑器支持diff 输出的语法高亮显示)。
  • 注意,如果你使用 Visual Studio,你实际上可以在 Git Changes 窗口中双击 stash 条目来预览 stash pop 所做的更改

标签: git git-stash


【解决方案1】:

以下命令可用于提取隐藏更改与任何其他存储或提交或分支或 HEAD 的差异。

git stash show
git show
git diff
git difftool

让我们看看,我们如何使用上述每个命令。

  1. git stash show

简单的命令 git stash show 给出了非常简短的更改摘要 文件,但不会显示与当前 HEAD 的更改差异。

  1. git show

命令 git-show 用于查看各种类型的对象。

命令 git-show 不仅用于可视化存储更改,还用于 也用于查看一个或多个对象,如 blob、树、标签和 提交。

  1. git diff

命令 git-diff 也是常用的命令之一,用于 显示提交、提交和工作树等之间的变化。

默认情况下,git diff 将显示所选存储的差异 反对(修改文件)存储库的当前状态,除非其他存储 指定了引用或提交。

要获得最顶层存储 stash@{0}master 分支之间的区别:

git diff stash@{0} master

仅显示文件名而不显示更改的差异:

git diff --name-only stash@{0} master

查看所选文件的所选存储之间的差异:

git diff stash@{0}^1 stash@{0} -- <filename>
  1. git difftool

命令 git-difftool 也可以用来查找两者之间的差异 选定的存储和选定的提交或分支或存储

查看最近两次存储的区别:

git difftool stash@{0} stash@{0}^1

git difftool --dir-diff stash@{0} stash@{0}^1

总结:

可用于从选定存储中提取差异的命令:git stash showgit showgit diffgit difftool

使用命令git stash show查看差异,

git stash show -p stash@{0}

使用命令git show查看存储中的变化,

git show stash@{1}

使用命令git diff查看最新存储和选定提交之间的区别,

git diff stash@{0} <commit-hash>

参考资料:

https://howto.lintel.in/how-to-see-stashed-changes-using-git-stash/

https://git-scm.com/docs/git-show

https://git-scm.com/docs/git-stash

【讨论】:

    【解决方案2】:

    有几个答案提到了git stash show 上的-p(或--patch)标志

    然而,值得一提的是,您可以在显示 Git 存储时将其设为默认行为(即 git stash show stash@{0}),方法是使用 git config

    git config --global stash.showPatch true
    

    ...或在您的 .gitconfig 文件中:

    [stash]
      showPatch = true
    

    这使得git stash show 默认表现得像git show。如果您只是想查看 diffstat(即添加/删除行的摘要),您仍然可以通过 --stat 标志看到它(再次,就像 git show 一样):

    git stash show --stat stash@{0}
    

    【讨论】:

      【解决方案3】:

      您可以使用gitlen extension查看 VSCode 中隐藏的更改

      screenshot of gitlen stashes

      【讨论】:

      • 知道有用。不过,他们是在 git 中专门询问的,而不是在特定产品中询问。
      【解决方案4】:

      我喜欢 gitk 如何准确地向您显示未跟踪或位于索引中的内容,但默认情况下,它会在当前分支上的所有其他提交中间显示那些隐藏“提交”。

      诀窍是按如下方式运行 gitk:

      gitk "stash@{0}^!"
      

      (引用是为了让它在 Powershell 中工作,但这样它也应该在其他 shell 中工作。)

      如果您在 gitrevisions help page 中查找此语法,您会发现以下内容:

      r1^! 表示法包括提交 r1 但不包括其所有父项。就其本身而言,此符号表示单个提交 r1

      这显然会使 gitk 处于仅显示所选提交的直接父级的模式,这正是我喜欢的。


      如果你想更进一步并列出所有存储,那么你可以运行这个:

      gitk `git stash list '--pretty=format:%gd^!'`
      

      (反引号内的那些单引号是安抚Bash所必需的,否则它会抱怨感叹号)

      如果您在 Windows 上并使用 cmd 或 Powershell:

      gitk "--argscmd=git stash list --pretty=format:%gd^!"
      

      【讨论】:

        【解决方案5】:

        查看当前的存储列表:

        git stash list
        

        你会看到这样的列表:

        stash@{0}: WIP on ...
        stash@{1}: ...
        stash@{2}: ...
        ...
        

        查看任何这些存储的差异:

        git stash show -p stash@{n}
        

        【讨论】:

          【解决方案6】:

          除了建议使用的现有答案(显示倒数第三个存储的差异)

          git stash show -p stash@{2}
          

          注意git-stash documentation中写的是

          也可以通过仅指定存储索引来引用存储(例如整数n 等效于stash@{n})。

          因此也可以使用(相当于上面的命令)

          git stash show -p 2
          

          这也应该避免some Powershell issues

          【讨论】:

            【解决方案7】:

            当第一次问这个问题时,这可能不是一个选项,但是,如果你使用 PyCharm,你可以使用UnStash Changes 工具(VCS->Git->UnStash Changes...)。这允许您查看隐藏更改的列表,以及弹出、删除、清除或应用(如果需要,进入新分支):

            并查看每个存储的更改文件:

            以及每个文件的差异。在差异中,您可以从隐藏的更改中挑选单个更改以应用到工作分支(使用指向左的 V 形):

            【讨论】:

              【解决方案8】:

              是的,查看修改内容的最佳方法是保存在这样的文件中:

              git stash show -p stash@{0} > stash.txt
              

              【讨论】:

                【解决方案9】:

                查看隐藏的更改列表

                git stash list
                

                用于查看特定存储中更改的文件列表

                git stash show -p stash@{0} --name-only
                

                用于查看存储中的特定文件

                git show stash@{0} path/to/file
                

                【讨论】:

                  【解决方案10】:

                  显示所有存储

                  仅文件名:

                  for i in $(git stash list --format="%gd") ; do echo "======$i======"; git stash show $i; done
                  

                  所有存储中的完整文件内容:

                  for i in $(git stash list --format="%gd") ; do echo "======$i======"; git stash show -p $i; done
                  

                  您将获得彩色差异输出,您可以使用 space (forward) 和 b (backwards ) 和 q 关闭当前存储的寻呼机。如果您希望将其保存在文件中,请将 &gt; stashes.diff 附加到命令中。

                  【讨论】:

                    【解决方案11】:

                    查看未弹出的存储中的所有更改:

                    git stash show -p stash@{0}
                    

                    查看未弹出的存储中某个特定文件的更改:

                    git diff HEAD stash@{0} -- path/to/filename.php
                    

                    【讨论】:

                    • 如果不记得文件名,它也适用于所有更改的文件 git diff HEAD stash@{0}
                    • 为了清楚起见:-p--patch 的缩写。该选项来自git-diff。如果你喜欢长格式,你可以写git stash show --patch
                    【解决方案12】:

                    您可以通过以下命令查看所有 stash 的列表:

                    $ git stash list
                    
                    stash@{0}: WIP on dev: ddd4d75 spelling fix
                    
                    stash@{1}: WIP on dev: 40e65a8 setting width for messages
                    
                    ......
                    
                    ......
                    
                    ......
                    
                    
                    stash@{12}: WIP on dev: 264fdab added token based auth
                    

                    最新的存储是第一个。

                    您可以简单地选择上面列表中提供的存储的索引n,然后使用以下命令查看存储的详细信息

                    git stash show -p stash@{3}
                    

                    同样,

                    git stash show -p stash@{n}
                    

                    您也可以使用以下命令检查差异:

                    git diff HEAD stash@{n} -- /path/to/file
                    

                    【讨论】:

                      【解决方案13】:

                      首先我们可以使用 git stash list 来获取所有的存储项:

                      $git stash list
                      stash@{0}: WIP on ...
                      stash@{1}: WIP on ....
                      stash@{2}: WIP on ...
                      

                      然后我们可以利用git stash show stash@{N} 来检查特定stash N 下的文件。如果我们解雇它,那么我们可能会得到:

                      $ git stash show stash@{2}
                      fatal: ambiguous argument 'stash@2': unknown revision or path not in the working tree.
                      Use '--' to separate paths from revisions, like this:
                      'git <command> [<revision>...] -- [<file>...]'
                      

                      造成这种情况的原因可能是 shell 吃掉了花括号,而 git 看到的是 stash@2 而不是 stash@{2}。为了解决这个问题,我们需要在大括号中使用单引号:

                      git stash show stash@'{2'}
                      com/java/myproject/my-xml-impl.xml                     | 16 ++++++++--------
                      com/java/myproject/MyJavaClass.java                    | 16 ++++++++--------
                      etc.
                      

                      【讨论】:

                        【解决方案14】:

                        git stash show 将向您显示最近存储中更改的文件。您可以添加-p 选项来显示差异。

                        git stash show -p
                        

                        如果您感兴趣的存储不是最新的,则将存储的名称添加到命令的末尾:

                        git stash show -p stash@{2}
                        

                        【讨论】:

                        • 使用 git stash show -p stash@{0} 查看特定的存储。 0 表示最后一个音调,1 表示倒数第二个音调.. 等等。git stash list 将显示所有可用的音调。
                        • 如果您使用的是 PowerShell,则必须将存储名称放在引号中。 (即:git stash show -p 'stash@{0}'
                        • 如果你想在文件中保存差异,请使用git stash show -p stash@{0}&gt; stash.txt
                        • 2019 年你只需输入git stash show [-p] [stash index number]
                        【解决方案15】:

                        除了Is it possible to preview stash contents in git? 中的 gitk 建议之外,您还可以安装tig 并调用tig stash。这个免费/开放的控制台程序还允许您选择要比较的存储区

                        【讨论】:

                        【解决方案16】:

                        我用它来查看我所有的带有颜色差异突出显示的存储(在 Fedora 21 上):

                        git stash list | 
                          awk -F: '{ print "\n\n\n\n"; print $0; print "\n\n"; 
                          system("git -c color.ui=always stash show -p " $1); }' | 
                          less -R
                        

                        (改编自Git: see what's in a stash without applying stash

                        【讨论】:

                          【解决方案17】:

                          我是gitk 的图形用户界面的粉丝,用于可视化 git 存储库。您可以查看隐藏的最后一项:

                          gitk stash
                          

                          您还可以使用查看任何隐藏的更改(由git stash list 列出)。例如:

                          gitk stash@{2}
                          

                          在下面的屏幕截图中,您可以在左上角看到作为提交的存储、提交历史中的时间和位置、右下角的修改文件列表以及逐行差异在左下角。一直以来,藏匿处都还藏着。

                          【讨论】:

                          • 您可以在命令行上提供多个stash@{X} 值以一次查看更多结果,但我还没有找到一种简单的方法来在 gitk 中说“显示所有存储条目”。
                          • gitk stash 似乎是gitk stash@{0}的简写
                          • 要显示 gitk 中的所有存储,您可以使用 gitk `git stash list --pretty=format:%gd` 然后搜索“WIP on”以跳转到下一个存储。
                          • gitk --reflog 让您可以看到所有的藏匿处,等等。
                          • gitk 是唯一一个直接向我显示存储区中保存有未跟踪文件的工具。所有其他人都只是向我展示了“没有差异”。
                          猜你喜欢
                          • 1970-01-01
                          • 2021-01-26
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2021-02-27
                          • 1970-01-01
                          • 1970-01-01
                          相关资源
                          最近更新 更多