git 小技巧(一)—— git stash,暂存你的修改

625 阅读3分钟

这是我参与8月更文挑战的第19天,活动详情查看:8月更文挑战

1.1 情景再现

假设在使用 git 时我们的应用场景是这样的(这也是大多数情况):
老大要求小王在 2H内把线上的某个按钮换成节目图标,命名为 “变色001”,小王一看,卧槽,这简单了,然后慢慢的新建了一个本地分支 “变色001”,改呀改呀,写呀写呀。 突然,线上出紧急bug了,要小王在1H内修复,不然不让参加团建。但“变色001”的代码都写了一部分了,不可能放弃呀。小王急了,怎么办呀?

1.2 命令介绍

git stash

stash(储藏),顾名思义,就是将你当前分支下的修改保存到一个临时缓存区,这个缓存区是一个栈,可存储多个 stash 命令。延续上述情景,因为“变色001”还没做完,小王肯定没法提交代码。

首先,敲下 git stash ,git便储藏了小王针对“变色001”所做出的的变更。 储藏后,小王的工作区(或者看 IDE,代码是不是变回去了?)恢复到了修改“变色001”之前的状态,小王一看,又是一头冷汗,难道变色001 白做了?!但是小王毕竟是资深程序员,光脚的不怕穿鞋的,慢慢来。紧接着小王敲下:

git stash list

发现了类似于下面的状态(图中的三次是因为之前 stash 过2次):

image

stash@{0} 即为最新的一次 stash。

哦哦哦哦哦,小王长舒一口气,江山依旧在,团建还没丢。

现在,小王可以安心的切换到紧急bug的分支了(git checkout -b JJBUG 猛地一看,这名字叼了),他的变更保存到了栈上。噼里啪啦一顿操作,bug 修复完了,JJBUG 也合并到 master 上了,擦完头上的冷汗,小王这个时候想切回来他的“变色001”分支上,并恢复到最新的修改状态。

git checkout 变色001
git stash pop

pop 是恢复栈顶的储藏区,同时删除掉这个储藏。

git stash apply stash@{X} //取出相应的暂存

apply 也是恢复栈顶的储藏区,不同于git stash pop,该命令不会将内容从堆栈中删除,也就说该命令能够将堆栈的内容多次恢复,适应于多个分支的情况。

小王不慌不忙的敲下 git stash apply stash@{0} ,诶,确实恢复过来啦,不用重头再来啦, 小王高兴的像个200斤的大胖子。

当我们 stash 储藏的多了后,会在栈上生成好多储藏信息,其实好多已经没用了,这个时候我们可以清除这些储藏:

git stash drop stash@{X} //将记录列表中取出的对应暂存记录删除 或者
git stash clear          //清除堆栈上的所有内容

小王改吧改吧一会后,本地代码已经比stash上的代码新了,因此小王想要查看本地代码和stash的区别(比如小王想撤回呢?想恢复到stash的版本呢?),这还有个命名可供小王使用:

git stash show stash@{0} -p     // -p 参数可查看具体代码细节
src/main/XXXTest/Test.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

至此,我相信小王已经彻底掌握 stash 的用法了,拯救世界,指日可待!