git stash 用法
文章目录
- [`git stash` 用法](#
git stash用法) -
-
- [1. 为什么需要 `git stash`?(解决了什么问题)](#1. 为什么需要
git stash?(解决了什么问题)) - [2. 核心命令与用法](#2. 核心命令与用法)
-
- [a. `git stash` 或 `git stash save "message"`](#a.
git stash或git stash save "message") - [b. `git stash list`](#b.
git stash list) - [c. `git stash pop`](#c.
git stash pop) - [d. `git stash apply`](#d.
git stash apply) - [e. `git stash drop`](#e.
git stash drop) - [f. `git stash clear`](#f.
git stash clear)
- [a. `git stash` 或 `git stash save "message"`](#a.
- [3. 进阶用法](#3. 进阶用法)
-
- [a. 储藏未被追踪的文件(Untracked Files)](#a. 储藏未被追踪的文件(Untracked Files))
- [b. 查看某个储藏的具体内容](#b. 查看某个储藏的具体内容)
- [c. 从储藏创建新分支](#c. 从储藏创建新分支)
- [4. 完整的工作流示例](#4. 完整的工作流示例)
- 总结
- [1. 为什么需要 `git stash`?(解决了什么问题)](#1. 为什么需要
-
git stash 是一个非常有用的 Git 命令,你可以把它想象成一个**"临时储藏室"**。
1. 为什么需要 git stash?(解决了什么问题)
最经典的场景是:
你正在一个分支(比如 feature-A)上开发一个新功能,代码写了一半,文件又改又新建,工作区是"脏"的(有未提交的修改)。
突然,线上出了一个紧急 Bug,需要你立刻切换到一个新的 hotfix 分支去修复。
这时候,如果你直接 git checkout hotfix-branch,Git 会报错,因为它会担心你辛辛苦苦写的代码在切换分支时会丢失或产生冲突。
你当然可以为了切换分支而创建一个临时的 commit,但这样做会产生很多无意义的提交记录。
git stash 就是为了解决这个问题而生的。 它能将你当前工作区和暂存区里的所有修改临时保存起来,让你的工作目录变得"干净",然后你就可以安心地切换到其他分支了。
2. 核心命令与用法
下面是 git stash 最常用的一系列命令。
a. git stash 或 git stash save "message"
这是最核心的命令,用于将当前的修改(已暂存和未暂存的)保存到一个"储藏"中。
git stash: 最简单的用法。Git 会自动生成一个类似 "WIP on [branch-name]: [commit-hash] [commit-message]" 的描述。git stash save "你的描述信息": 强烈推荐的用法。给你的储藏加上一段描述,方便以后辨认。
示例:
你修改了 a.txt 和 b.txt。
bash
# 查看状态,发现有未提交的修改
$ git status
On branch feature-A
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: a.txt
modified: b.txt
# 将修改储藏起来,并添加描述
$ git stash save "正在开发 feature-A 的一半"
Saved working directory and index state On feature-A: 正在开发 feature-A 的一半
# 再次查看状态,工作区已经干净了
$ git status
On branch feature-A
nothing to commit, working tree clean
现在,你就可以自由地切换分支了。
b. git stash list
查看你所有储藏的列表。
示例:
bash
$ git stash list
stash@{0}: On feature-A: 正在开发 feature-A 的一半
stash@{1}: On main: 修复了一个小拼写错误
stash@{0}是最新的一次储藏。stash@{1}是上一次的储藏。
c. git stash pop
恢复最新 的一次储藏,并从储藏列表中删除它。这是最常用的恢复命令。
示例:
你修复完 Bug,切回了 feature-A 分支。
bash
$ git checkout feature-A
Switched to branch 'feature-A'
# 恢复之前储藏的代码
$ git stash pop
On branch feature-A
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: a.txt
modified: b.txt
Dropped refs/stash@{0} (f7e3478b191c28c8d87a5509c26d7b87c7b8c26f)
现在,你之前修改的 a.txt 和 b.txt 都回来了,可以继续工作了。
注意 :如果在 pop 的过程中发生代码冲突,储藏不会 被自动删除。你需要先解决冲突,然后手动使用 git stash drop 来删除它。
d. git stash apply
恢复储藏,但不从储藏列表中删除它。这在你需要将同一个储藏应用到多个分支时很有用。
示例:
bash
# 恢复 stash@{1} 的内容,但保留它
$ git stash apply stash@{1}
e. git stash drop
删除一个指定的储藏。
示例:
bash
# 删除最新的一次储藏
$ git stash drop
# 删除指定的一次储藏(比如 stash@{2})
$ git stash drop stash@{2}
f. git stash clear
清空所有的储藏。这是一个危险的操作,请谨慎使用!
bash
$ git stash clear
3. 进阶用法
a. 储藏未被追踪的文件(Untracked Files)
默认情况下,git stash 只会储藏已修改 和已暂存 的文件,不会处理你新建 但还未 git add 的文件(untracked files)。
如果你想把这些新文件也一起储藏起来,需要加上 -u 或 --include-untracked 参数。
bash
# 储藏所有修改,包括未被追踪的新文件
$ git stash -u
# 或者
$ git stash save -u "包含了新文件的储藏"
b. 查看某个储藏的具体内容
想知道某个储藏到底改了些什么?
bash
# 查看最新的储藏和当前 HEAD 的差异
$ git stash show
# 查看指定储藏的详细 diff
$ git stash show -p stash@{1}
c. 从储藏创建新分支
这是一个非常安全和好用的功能。如果你储藏了一堆改动,后来发现这些改动应该放在一个新功能分支里,而不是在当前分支上恢复。
bash
# 基于最新的储藏,创建一个名为 new-feature 的新分支,并自动应用储藏
$ git stash branch new-feature
这条命令会:
- 创建一个新分支
new-feature。 - 切换到这个新分支。
- 应用(
pop)最新的储藏。
4. 完整的工作流示例
-
场景 : 你在
main分支上,开始开发一个新功能。bash# 修改了 a.js,并新建了 b.js $ git status On branch main Changes not staged for commit: modified: a.js Untracked files: b.js -
问题: 突然需要修复一个紧急 Bug。
bash# 将所有修改(包括新文件 b.js)储藏起来 $ git stash -u -m "WIP: a new feature on main" Saved working directory and index state On main: WIP: a new feature on main -
切换分支修复 Bug:
bash# 工作区干净了,可以切换分支 $ git checkout -b hotfix/bug-123 # ... 在这里进行修改、提交、合并等操作 ... $ git commit -am "Fix: bug 123" $ git checkout main $ git merge hotfix/bug-123 -
回到原来的工作:
bash# 确认回到了 main 分支 $ git checkout main # 恢复之前的工作内容 $ git stash pop # 你的 a.js 和 b.js 修改都回来了 -
继续开发: 你可以接着之前的进度继续工作了。
总结
git stash: 临时保存当前修改。git stash list: 查看所有临时保存。git stash pop: 恢复并删除最新的保存。git stash apply: 恢复但不删除。git stash -u: 保存时包含新创建的文件。git stash branch <name>: 从保存中创建新分支。
把 git stash 当成你的"代码临时抽屉",需要切换任务时把手头的工作放进去,回来时再拿出来,非常方便。