本文主要总结 git 本地的相关命令,多用就能熟练起来,同时好记性不如烂笔头,形成文档沉淀下来。

git stash

情景是这样的,秋高气爽的一天你开开心心地来上班,准备在 dev 分支上继续完成开发需求,但是同事小明突然跑过来说,线上出 bug 了,现在急需修复。但是你刚才开发的内容并还没有完成,匆忙 commit 的话感觉很恶心,以后回滚的话,也是不友好的,怎么办呢?

这时候,git stash 命令就能很好地起作用了,它可以将所有未 commit 的代码,暂时从「工作区」和「暂存区」移除,回到上一条 commit 时的状态,这时候「工作区」和「暂存区」就已经干净了。

具体使用方法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 暂存没有 commit 的所有改动
$ git stash

# 列出所有暂存过的「工作」
$ git stash list
stash@{0}: WIP on feature/dev: 1a2b3cx 完成第2期需求

# 列出所有暂存过的「改动」
$ git stash show

# 恢复某个暂存过的工作
# 可以不指定 <stash_name>
# 如果不指定,则会应用最近的一条
# git stash apply [<stash_name>]
$ git stash apply stash@{0}

# 恢复最近一次暂存的工作
$ git stash pop

# 丢弃暂存的改动
# $ git stash drop [<stash_name>]
$ git stash drop

# 删除清空所有的 stash
$ git stash clear

git stash 命令可以运行多次,将会以先进后出的「stack」结构保存。

关于 git stash apply
git stash apply 命令有点坑和复杂。

第一,git stash apply 可以带上具体的 <stash_name>,如果不带,自动应用恢复最近的一条工作。

第二,git stash apply 带上的 <stash_name>,可以是任意一条不按顺序的,但是不建议。

第三,git stash apply [<stash_name>] 默认只恢复已暂存的「工作区」的改动,但是不会恢复已暂存的「暂存区」的改动,如果要一并恢复,则需要使用 git stash apply [<stash_name>] --index

第四,git stash apply 应被理解为「尝试恢复」暂存的内容,执行后内容仍处于栈上,要移除它就要使用 git stash drop;另外,使用 git stash pop 就不会有这个问题,执行后会自动移除记录。