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 当成你的"代码临时抽屉",需要切换任务时把手头的工作放进去,回来时再拿出来,非常方便。

相关推荐
rockmelodies6 小时前
本地 PyCharm 生成的 Git 仓库与 GitHub 远程仓库关联起来
git·pycharm·github
阿萨德528号7 小时前
Git 与 SVN 对比详解
git·svn
郑州光合科技余经理7 小时前
定制开发实战:海外版外卖系统PHP全栈解决方案
java·服务器·开发语言·javascript·git·uni-app·php
艾小码7 小时前
解锁Git隐藏力量:从熟练到大师的高级命令指南
git
BestOrNothing_20157 小时前
Git分支实操指南:本地学习分支创建+远程同步避坑全解析
git·分支管理·版本控制·开发规范·新手教程
Lenyiin8 小时前
Linux 项目托管 `git`
linux·运维·服务器·git·lenyiin
提笔了无痕18 小时前
git基本了解、常用基本命令与使用
git·后端
一苓二肆1 天前
代码常用工具使用
git·vscode·docker·github·vim
Elieal1 天前
12 Git 多人协作(完整版工作流)
git