如何暂存未跟踪的文件
技术背景
在使用Git进行版本控制时,经常会遇到需要暂存工作目录中修改的情况。默认情况下,git stash
命令只会保存已跟踪文件的修改,而未跟踪的文件(尤其是那些在 .gitignore
中的文件)不会被暂存。但在某些场景下,我们可能希望将未跟踪的文件也一起暂存起来,以便后续恢复工作状态。
实现步骤
暂存包含未跟踪文件的工作目录
可以使用以下命令将未跟踪文件也包含在暂存中:
1
| git stash --include-untracked
|
或者使用简写形式:
暂存所有文件(包括未跟踪和忽略的文件)
需要注意的是,在某些情况下,忽略目录的内容可能会被永久删除。同时,此行为在2018年有变更,确保你的Git是最新版本。
选择性暂存
如果只想暂存特定的未跟踪文件,可以先将其添加到索引,然后再进行暂存:
1 2
| git add path/to/untracked-file git stash
|
在VS 2019及更高版本中暂存
- 打开Git更改窗口(
Ctrl + Alt + F7
)。 - 点击“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 2 3
| git stash --include-untracked # 或 git stash -u
|
恢复暂存
查看暂存列表
应用特定暂存
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 -N
后 git 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"
|