my-git

Stash

git stash 用于临时保存未提交改动。

它适合处理“我手上有未完成代码,但现在必须切分支、拉代码、修 hotfix”的场景。

适合场景

基础用法

git stash push -u 会保存并从当前工作区移走所有已跟踪的 staged、unstaged 内容和未跟踪文件。先检查范围:

git status --porcelain

只在这些内容都属于自己、并且准备稍后恢复时使用。状态中有其他 owner 的编辑或来源不清的文件时,停止在这个 worktree 操作,改用独立 worktree。

保存当前改动,包括未跟踪文件:

git stash push -u -m "wip: describe current work"

查看 stash 列表:

git stash list

应用某个 stash,但保留 stash 记录:

git stash apply stash@{0}

应用并删除 stash:

git stash pop

删除某个 stash:

git stash drop stash@{0}

apply 和 pop 怎么选

重要改动优先用 apply。

pop 会在应用成功后删除 stash,如果应用过程中出现冲突,处理起来更容易慌。

稳妥流程:

git stash apply stash@{0}
git status
git diff
git diff --cached
git stash drop stash@{0}

确认 staged、unstaged 和未跟踪内容都已按预期恢复后,才执行 git stash drop;不能只因 apply 返回成功就删除保存点。

常见误区

1. 把 stash 当长期存储

stash 适合临时保存,不适合长期保存重要工作。

重要工作应该尽快 commit 到明确分支。

2. 忘记保存未跟踪文件

默认 git stash 不一定保存未跟踪文件,建议使用:

git stash push -u

3. stash 太多不清理

stash 多了之后很难知道每个保存点是什么。

建议每次加 -m 说明用途。

延伸阅读