如何暂存未跟踪的文件

如何暂存未跟踪的文件

技术背景

在使用Git进行版本控制时,经常会遇到需要暂存工作目录中修改的情况。默认情况下,git stash 命令只会保存已跟踪文件的修改,而未跟踪的文件(尤其是那些在 .gitignore 中的文件)不会被暂存。但在某些场景下,我们可能希望将未跟踪的文件也一起暂存起来,以便后续恢复工作状态。

实现步骤

暂存包含未跟踪文件的工作目录

可以使用以下命令将未跟踪文件也包含在暂存中:

1
git stash --include-untracked

或者使用简写形式:

1
git stash -u

暂存所有文件(包括未跟踪和忽略的文件)

1
git stash --all

需要注意的是,在某些情况下,忽略目录的内容可能会被永久删除。同时,此行为在2018年有变更,确保你的Git是最新版本。

选择性暂存

如果只想暂存特定的未跟踪文件,可以先将其添加到索引,然后再进行暂存:

1
2
git add path/to/untracked-file
git stash

在VS 2019及更高版本中暂存

  1. 打开Git更改窗口(Ctrl + Alt + F7)。
  2. 点击“Commit All” 或 “Commit staged” 按钮附近的下拉箭头,查看暂存选项。如果要暂存未跟踪的文件(如Git忽略的文件或未包含在项目中的文件),选择相应选项。

保存暂存并命名

如果希望给暂存添加名称,可以使用以下命令:

1
git stash save -u "name_of_stash"

暂存已暂存区的内容

在Git 2.35版本及以上,可以使用 --staged 模式:

1
2
git add -A
git stash --staged

只暂存未跟踪文件

1
2
3
git stash save "tracked files I'm working on"
git stash save -u "untracked files I'm trying to stash"
git stash pop stash@{1}

暂存未跟踪文件并保留索引

1
git stash -u -k

核心代码

暂存包含未跟踪文件

1
2
3
git stash --include-untracked
#
git stash -u

恢复暂存

1
git stash pop

查看暂存列表

1
git stash list

应用特定暂存

1
git stash apply stash@{<stash_number>}

最佳实践

  • 命名暂存:使用 git stash save -u -m "description" 给暂存添加有意义的描述,方便后续查找和管理。
  • 脚本化操作:对于复杂的暂存和恢复流程,可以编写脚本或设置别名。例如,在zsh中:
1
2
alias stashall='git ls-files -o > .gftu; git add `cat .gftu`; git stash'
alias unstashall='git stash pop; git rm --cached `cat .gftu`; rm .gftu'

常见问题

使用 git add -Ngit stash 失败

1
2
git add -N path/to/untracked/file
git stash

此操作会失败,因为 git add -N 只是标记文件为有意添加,而不是真正添加到索引。解决方法是真正添加文件,之后再使用 git rm --cached 取消添加:

1
2
3
4
5
6
git add path/to/untracked-file
git stash save "don't forget to un-add path/to/untracked-file"
# 做其他工作
git stash list
git stash pop
git rm --cached path/to/untracked-file

git add 目录时无法正确暂存

如果使用 git add untracked-path 对新目录进行暂存,可能会导致暂存为空。正确的做法是添加整个路径(以 / 结尾):

1
2
git add untracked-path/
git stash "temp stash"

如何暂存未跟踪的文件
https://119291.xyz/posts/2025-05-14.how-to-stash-untracked-files/
作者
ww
发布于
2025年5月14日
许可协议