Git Stash 用法详解
一、什么是 Git Stash?
Git Stash 是 Git 提供的一个非常实用的功能,用于临时保存工作目录中未提交的更改,以便你可以切换到其他分支工作,稍后再返回到这些更改。这在以下场景特别有用:
- 当你正在开发一个功能,但需要立即修复一个紧急 bug
- 当你需要切换到另一个分支,但不想提交当前未完成的工作
- 当你需要拉取远程分支的更新,但本地有未提交的更改
二、基本用法
1. 保存当前更改
git stash
这是最基本的命令,它会将工作目录中所有未提交的更改(包括修改的文件和暂存的文件)保存到一个新的存储中,并将工作目录恢复到上一次提交的状态。
示例:
# 假设你修改了文件 file1.txt 和 file2.txt
echo "修改内容" >> file1.txt
echo "新内容" >> file2.txt# 查看状态
git status
# 输出显示有未暂存的更改# 保存更改
git stash
# 输出:Saved working directory and index state WIP on master: xxxxxxx 上次提交的信息# 再次查看状态
git status
# 输出显示工作目录干净,没有未提交的更改
2. 保存当前更改并添加注释
git stash save "你的注释信息"
添加注释可以帮助你在有多个存储时更容易识别它们。
示例:
git stash save "实现用户登录功能 - 未完成"
3. 列出所有存储
git stash list
这个命令会显示所有已保存的存储列表。
示例:
git stash list
# 输出示例:
# stash@{0}: WIP on master: xxxxxxx 实现用户登录功能 - 未完成
# stash@{1}: WIP on develop: yyyyyyy 修改首页布局
4. 应用最近的存储
git stash apply
这个命令会将最近的存储应用到当前工作目录,但不会从存储列表中删除它。
示例:
git stash apply
# 应用最近的存储到当前工作目录# 查看状态
git status
# 可以看到之前保存的更改已经恢复
5. 应用指定的存储
git stash apply stash@{n}
其中 n 是存储在列表中的索引。
示例:
git stash apply stash@{1}
# 应用第二个存储(索引为1)
6. 应用并删除存储
git stash pop
这个命令会应用最近的存储并从存储列表中删除它。
示例:
git stash pop
# 应用最近的存储并删除它git stash list
# 可以看到最近的存储已经被移除
7. 应用并删除指定的存储
git stash pop stash@{n}
示例:
git stash pop stash@{2}
# 应用索引为2的存储并删除它
8. 丢弃最近的存储
git stash drop
这个命令会删除最近的存储,但不会将其应用到工作目录。
示例:
git stash drop
# 删除最近的存储
9. 丢弃指定的存储
git stash drop stash@{n}
示例:
git stash drop stash@{1}
# 删除索引为1的存储
10. 清空所有存储
git stash clear
示例:
git stash clear
# 清空所有存储
git stash list
# 输出为空
11. 查看存储的内容
git stash show
这个命令会显示最近存储中更改的文件和行数。
示例:
git stash show
# 输出示例:
# file1.txt | 3 +++
# file2.txt | 5 +++++
要查看更详细的更改内容,可以使用:
git stash show -p
示例:
git stash show -p
# 输出详细的差异内容
三、高级用法
1. 只保存暂存的更改
git stash --staged
这个命令只会保存已经暂存的更改,而不会保存未暂存的更改。
示例:
# 修改文件并暂存部分更改
echo "修改1" >> file.txt
git add file.txt
echo "修改2" >> file.txt# 只保存暂存的更改(即"修改1")
git stash --staged# 此时工作目录中只剩下"修改2"
git status
2. 保存未跟踪的文件
默认情况下,git stash 不会保存未跟踪的文件。要保存未跟踪的文件,可以使用:
git stash -u
# 或者
git stash --include-untracked
示例:
# 创建一个新文件(未跟踪)
echo "新文件" > newfile.txt# 保存所有更改,包括未跟踪的文件
git stash -u# 此时工作目录干净,没有文件
dir
3. 保存所有文件(包括忽略的文件)
git stash -a
# 或者
git stash --all
这个命令会保存所有更改,包括未跟踪的文件和被 .gitignore 忽略的文件。
示例:
# 创建一个被忽略的文件(假设 node_modules/ 在 .gitignore 中)
mkdir -p node_modules
echo "忽略的文件" > node_modules/ignored.txt# 保存所有更改,包括被忽略的文件
git stash -a
4. 从存储创建分支
如果你想基于某个存储创建一个新的分支,可以使用:
git stash branch 分支名 stash@{n}
这个命令会创建一个新的分支,应用指定的存储,然后删除该存储。
示例:
git stash branch login-feature stash@{0}
# 基于第一个存储创建一个名为 login-feature 的分支
# 并在创建后删除该存储
5. 暂存的保留和恢复
Git Stash 不仅保存修改的文件内容,还会保存暂存的状态。当你应用存储时,暂存的文件会被恢复到暂存状态,未暂存的文件会被恢复到未暂存状态。
示例:
# 修改两个文件
echo "修改1" >> file1.txt
echo "修改2" >> file2.txt# 暂存其中一个文件
git add file1.txt# 保存所有更改
git stash# 切换分支、执行其他操作...# 恢复存储
git stash pop# 此时 file1.txt 仍然处于暂存状态,file2.txt 处于未暂存状态
git status
四、最佳实践
-
使用有意义的注释:使用
git stash save "注释"为存储添加描述性的注释,这样更容易在列表中识别它们。 -
定期清理:使用
git stash list查看所有存储,删除不再需要的存储以保持存储列表的整洁。 -
不要过度依赖:Git Stash 适合短期存储未完成的工作,不建议长期使用。对于长期未完成的功能,考虑创建特性分支。
-
谨慎处理未跟踪的文件:记住
git stash默认不会保存未跟踪的文件,需要时使用-u或-a参数。
