git stash 是 Git 中非常实用的命令,用于临时保存当前工作目录中未提交的更改(包括已暂存和未暂存的修改),以便将工作区恢复到干净的状态。这在需要紧急切换分支修复 Bug,但又不想提交未完成的功能时特别有用。

以下是 git stash 相关的核心命令及用法总结:

1. 保存更改 (Save / Push)

  • 基本保存:保存当前工作区和暂存区的修改,并清理工作区。
    1. git stash
    2. # 或
    3. git stash push
  • 带描述信息保存:为保存的更改添加备注,方便后续查找。
    1. git stash push -m "描述你的更改"
  • 包含未追踪的文件:默认 stash 不会保存新建但未追踪的文件,加上 -u 可以一并保存。
    1. git stash -u
    2. # 或
    3. git stash push -u
  • 包含所有文件(含忽略文件):保存所有修改,包括被 .gitignore 忽略的文件。
    1. git stash -a
    2. # 或
    3. git stash push -a
  • 保留暂存区修改:保存工作区修改,但保留暂存区(已 git add 的内容)不动。
    1. git stash -k
    2. # 或
    3. git stash push -k
  • 仅保存已暂存的修改:只保存执行过 git add 的内容,未暂存的保留在工作区。
    1. git stash push -S
  • 交互式保存:手动选择哪些代码块(hunk)需要被 stash。
    1. git stash -p

2. 查看更改 (List / Show)

  • 列出所有 stash 记录:查看保存的 stash 列表,最新的在最上面(如 stash@{0})。
    1. git stash list
  • 查看 stash 的修改摘要:查看某个 stash 修改了哪些文件及行数。
    1. git stash show
    2. # 或指定某条记录
    3. git stash show stash@{1}
  • 查看 stash 的具体代码差异:以补丁(patch)形式查看完整的代码改动。
    1. git stash show -p stash@{0}

3. 恢复更改 (Apply / Pop)

  • 恢复并删除记录:应用最近一次(或指定)的 stash,并从 stash 列表中删除该记录。
    1. git stash pop
    2. # 或指定某条记录
    3. git stash pop stash@{1}
  • 仅恢复但保留记录:应用 stash 的修改,但从列表中删除(适合需要多次应用同一份代码的情况)。
    1. git stash apply
    2. # 或指定某条记录
    3. git stash apply stash@{1}
  • 恢复并保留暂存状态:默认恢复后代码都在工作区,加上 --index 可以让之前已暂存的代码恢复后依然处于暂存状态。
    1. git stash apply --index

4. 删除更改 (Drop / Clear)

  • 删除某一条 stash
    1. git stash drop stash@{0}
  • 清空所有 stash 记录
    1. git stash clear

5. 高级用法:基于 stash 创建新分支

如果你 stash 了一段代码,过了很久才想起来,担心直接 pop 会产生严重的合并冲突,可以基于该 stash 创建一个新分支来测试:

  1. git stash branch <新分支名> stash@{0}

执行后,Git 会检出 stash 创建时的提交,创建一个新分支,应用该 stash,并在成功后自动删除该 stash 记录。

💡 常见工作流示例:

  1. git stash push -m "开发中的登录功能" (保存当前进度)
  2. git checkout bugfix-branch (切换到紧急修复分支)
  3. …修复并提交…
  4. git checkout feature-branch (切回原分支)
  5. git stash pop (恢复之前的进度继续开发)

如果要放弃本地的修改:

  1. git reset --hard
  2. git pull origin 分支名</pre>