git stash 用法

git stash 用法

文章目录

  • [`git stash` 用法](#git stash 用法)
      • [1. 为什么需要 `git stash`?(解决了什么问题)](#1. 为什么需要 git stash?(解决了什么问题))
      • [2. 核心命令与用法](#2. 核心命令与用法)
        • [a. `git stash` 或 `git stash save "message"`](#a. git stashgit 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)
      • [3. 进阶用法](#3. 进阶用法)
        • [a. 储藏未被追踪的文件(Untracked Files)](#a. 储藏未被追踪的文件(Untracked Files))
        • [b. 查看某个储藏的具体内容](#b. 查看某个储藏的具体内容)
        • [c. 从储藏创建新分支](#c. 从储藏创建新分支)
      • [4. 完整的工作流示例](#4. 完整的工作流示例)
      • 总结

git stash 是一个非常有用的 Git 命令,你可以把它想象成一个**"临时储藏室"**。

1. 为什么需要 git stash?(解决了什么问题)

最经典的场景是:

你正在一个分支(比如 feature-A)上开发一个新功能,代码写了一半,文件又改又新建,工作区是"脏"的(有未提交的修改)。

突然,线上出了一个紧急 Bug,需要你立刻切换到一个新的 hotfix 分支去修复。

这时候,如果你直接 git checkout hotfix-branch,Git 会报错,因为它会担心你辛辛苦苦写的代码在切换分支时会丢失或产生冲突。

你当然可以为了切换分支而创建一个临时的 commit,但这样做会产生很多无意义的提交记录。

git stash 就是为了解决这个问题而生的。 它能将你当前工作区和暂存区里的所有修改临时保存起来,让你的工作目录变得"干净",然后你就可以安心地切换到其他分支了。


2. 核心命令与用法

下面是 git stash 最常用的一系列命令。

a. git stashgit stash save "message"

这是最核心的命令,用于将当前的修改(已暂存和未暂存的)保存到一个"储藏"中。

  • git stash: 最简单的用法。Git 会自动生成一个类似 "WIP on branch-name: commit-hash commit-message" 的描述。
  • git stash save "你的描述信息" : 强烈推荐的用法。给你的储藏加上一段描述,方便以后辨认。

示例:

你修改了 a.txtb.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.txtb.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

这条命令会:

  1. 创建一个新分支 new-feature
  2. 切换到这个新分支。
  3. 应用(pop)最新的储藏。

4. 完整的工作流示例

  1. 场景 : 你在 main 分支上,开始开发一个新功能。

    bash 复制代码
    # 修改了 a.js,并新建了 b.js
    $ git status
    On branch main
    Changes not staged for commit:
      modified:   a.js
    Untracked files:
      b.js
  2. 问题: 突然需要修复一个紧急 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
  3. 切换分支修复 Bug:

    bash 复制代码
    # 工作区干净了,可以切换分支
    $ git checkout -b hotfix/bug-123
    # ... 在这里进行修改、提交、合并等操作 ...
    $ git commit -am "Fix: bug 123"
    $ git checkout main
    $ git merge hotfix/bug-123
  4. 回到原来的工作:

    bash 复制代码
    # 确认回到了 main 分支
    $ git checkout main
    
    # 恢复之前的工作内容
    $ git stash pop
    # 你的 a.js 和 b.js 修改都回来了
  5. 继续开发: 你可以接着之前的进度继续工作了。

总结

  • git stash: 临时保存当前修改。
  • git stash list: 查看所有临时保存。
  • git stash pop: 恢复并删除最新的保存。
  • git stash apply: 恢复但不删除。
  • git stash -u: 保存时包含新创建的文件。
  • git stash branch <name>: 从保存中创建新分支。

git stash 当成你的"代码临时抽屉",需要切换任务时把手头的工作放进去,回来时再拿出来,非常方便。

相关推荐
anew___6 小时前
常用的 Git 工作流
git
shimly1234566 小时前
git diff 生成一部分文件的补丁
git
m0_579146657 小时前
Git 重置模式详解:四种重置方式的原理与应用场景
git
恋喵大鲤鱼7 小时前
git grep
git·git grep
霸王龙的小胳膊7 小时前
Git基础知识
git
恋喵大鲤鱼8 小时前
git fetch
git·git fetch
Java知识技术分享8 小时前
安装sourcetree
java·git·源代码管理
恋喵大鲤鱼8 小时前
git revert
git·git revert
爱和冰阔落8 小时前
【Codex项目实战】从模糊需求到可验证交付:Plan、测试、Review与Worktree完整流程
人工智能·git·codex
恋喵大鲤鱼18 小时前
git rebase
git·git rebase