Git 静静地隐藏 hides/deletes 分阶段更改

Git stash silently hides/deletes staged changes

问题:

$ git status -s
MM myfile
$ git stash save
$ git show stash@{0}
# Only shows unstaged changes NOT staged changes

# To debug:
$ GIT_TRACE=2 git stash show
trace: exec: 'git-stash' 'show'
trace: run_command: 'git-stash' 'show'
trace: built-in: git 'rev-parse' '--git-dir'
trace: built-in: git 'rev-parse' '--show-toplevel'
trace: built-in: git 'config' '--get-colorbool' 'color.interactive'
trace: built-in: git 'config' '--get-color' 'color.interactive.help' 'red bold'
trace: built-in: git 'config' '--get-color' '' 'reset'
trace: built-in: git 'rev-parse' '--no-flags' '--symbolic' '--sq'
trace: built-in: git 'rev-parse' '--symbolic-full-name' 'refs/stash'
trace: built-in: git 'diff' '--stat' 'aaaa' 'bbbb'
trace: run_command: 'pager'
trace: exec: 'pager'
$ git diff --stat aaaa bbbb
# Shows both staged and unstaged changes
$ git stash apply --index
$ git status -s
MM myfile

为什么 git show stash@{0} 不显示本应包含在存储中的暂存更改? git-stash 似乎在悄悄地隐藏暂存的更改。

这是因为git show stash@{0}是错误的命令。你想要 git stash show stash@{0}.

不幸的是,对于存储使用,git show 是一个非常好的命令,当您要求它显示合并提交时,它会显示组合差异。而且,在内部,隐藏提交具有合并提交的形式(但不是正常的 substance),因此组合差异很少有任何好处 - 所以 git show很高兴展示它们,但显示它们是空的。

因为 git stash show 真的很容易 typo/think-o 和 git show stash 一样,你会 非常 糟糕的行为。请记住,当您什么也看不到时,可能是词序倒置的情况。

(这里还值得注意的是 git stash show 将隐藏的工作树与隐藏的父级进行比较。没有 git stash 命令显示隐藏的 index 对比任何东西。要查看索引对比父项,请使用 git diff stash@{<em>number</em>}^1 stash@{<em>数</em>}^2.)