仅暂存单个文件后,git stash show为何显示其他暂存区文件?
Git stash指定单个文件却显示多个暂存文件的原因
问题场景
执行git stash push指定仅暂存单个文件,但git stash show却显示包含已暂存区的其他文件,具体操作及输出如下:
$ git status On branch some/0.0.1 Your branch is up to date with 'origin/some/0.0.1'. Changes to be committed: (use "git restore --staged <file>..." to unstage) modified: src/main/java/ServiceServiceImpl.java modified: src/main/java/util/ServiceUtil.java modified: src/test/SystemTest.java Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git restore <file>..." to discard changes in working directory) modified: src/main/java/util/ServiceUtil.java modified: src/main/resources/application-local.yml modified: src/main/resources/application.yml modified: src/main/resources/logback.xml
执行单个文件暂存命令:
$ git stash push src/main/resources/application.yml -m "app.xml stashed" # 仅暂存单个文件 Saved working directory and index state On 0.0.1: app.xml stashed
查看暂存列表:
$ git stash list stash@{0}: On 0.0.1: app.xml stashed
查看暂存内容时,却显示了多个文件:
$ git stash show stash@{0} # 为何除了指定的application.yml,还显示了其他已暂存文件? .../java/ServiceServiceImpl.java | 8 ++++---- .../java/util/ServiceUtil.java | 1 + src/main/resources/application.yml | 20 ++++++++++++++------ .../test/SystemTest.java | 6 +++--- 4 files changed, 22 insertions(+), 13 deletions(-)
根据Git手册对git stash show的说明:
show [-u|--include-untracked|--only-untracked] [
] [ ]
显示暂存条目记录的变更,即暂存内容与创建暂存时的提交之间的差异。
原因解释
这是因为**git stash push默认会同时保存当前的暂存区状态**,哪怕你指定了单个文件。
当你执行git stash push <file>时,Git会执行以下操作:
- 保存你指定的工作区文件的变更
- 同时保存当前整个暂存区的所有变更(也就是
git status里"Changes to be committed"部分的内容)
所以git stash show展示的差异,是暂存的工作区文件 + 暂存区的所有变更与当前分支HEAD提交的对比结果,自然会包含那些原本已暂存的文件。
如果只想暂存指定的工作区文件,且不包含已暂存区的内容,需要加上--keep-index参数:
git stash push --keep-index src/main/resources/application.yml -m "app.yml stashed"
这个参数会让Git保留当前暂存区的状态,只把指定的工作区文件变更存入stash,此时git stash show就只会显示你指定的文件了。
内容的提问来源于stack exchange,提问作者Khanna111
相关产品推荐
相关产品推荐

