天天看点

Git里的stash命令的应用

git stash 使用的频率可能不如git commit、git push那么多,但是在某一些场景下 能起到很好的效果,下面介绍git stash常用场景。

场景一

小明在一家代码管理做的不是很好的公司上班,开发&生产全在master分支上进行。

有一天,小明正开心的敲着新功能业务的代码。

突然,项目经理说。线上出了个BUG,要小明赶紧解决。(MMP的)

小明说:老子新功能还没写完呢,又来BUG要修复。但是小明不能直接修复BUG去提交,因为目前还有未开发完整的功能也在master分支上。

如果将写到一半的代码退回,再去修复BUG,那后面不是需要重新写一遍现在写过的代码。这是在做重复廉价劳动,对于小明这样优雅的程序员来说是万万不可能的。

小明的推荐做法就是:

使用git stash将当前工作区未提交的变动储存起来,然后去再修改BUG提交到远程,修复线上的BUG,然后本地git stash pop继续优雅的写。

场景二:

小明在写一个 统计功能 的业务代码,由于业务简单 小明直接在develop分支上进行开发。

这个时候小李在维护另外一个数据查询模块,小李是个天天混日子的人,经常写BUG,所以这次又写了BUG。但是恰恰不巧的是,这次出的BUG影响到了小明写的 统计功能 业务(小明心里一群可爱的小马奔跑)。

小李修复好BUG后对小明说,我在develop上commit了一个fix修复了那个BUG,你pull一下代码。

小明这时候自己 统计功能的业务代码 还没写完,甚至还有语法错误。但是又必须合并小李提交的代码,因为自己开发的功能基于对方的结果。小明心里难受啊~

现在可以有两种处理方法:

1、直接commit当前工作区到develop分支,然后pull远程的develop合并到本地develop,然后继续开发(pull命令一般需要在当前工作区干净的情况下才被允许)。这样其实没什么问题。但是会产生一个commit,且这个commit是功能不完整的(其实很多程序员就是这样干的)。

2、使用git stash, 先使用git stash 将当前工作区未commit的变动保存起来,然后工作区移除这些变动,当前工作区变成干净的。这个时候就可以git pull拉取远程代码合并。然后在git pop将上一次储存起来的变动代码再放出来。这样没有产生commit,可以继续写了。

场景三:

小明接到一个需求,让他尝试性的去研究一下一个功能的实现。但是小明没做过,也没有人可以请教,只好自己开始折腾。

在尝试性的修修改改了一堆文件后,发现可能顺着这个思路行不通。准备另外换一个方向重写。但是在之前的尝试当中,发现自己写了几段非常棒的地方。想保存下来或者思考也许会对后面的新思路可能有借鉴。

现在可以有三种处理方法:

1、将之前的修改过的地方全部撤回修改,然后复制那段觉得很棒的代码在其他文本里(不过失去上下文环境的 孤立代码段在 以后review将会很难理解)。

2、将修改的代码注释掉,然后在后面写新的代码。

3、使用git stash命令,然后重新写。

其实都不用多说了,哪一种更好。

git stash 相关命令的一些常用介绍

添加一个stash

git stash # 该命令会情况当前工作区 还未commit的变动,储藏起来。
           

添加一个stash并备注

git stash push -m "message" # 储藏工作区中未提交的变动,并添加备注message
           

查看已经储存的stash列表

git stash list # 查看储藏

[email protected]{0}: WIP on master: 049d078 added the index file
[email protected]{1}: WIP on master: c264051 Revert "added file_size"
[email protected]{2}: WIP on master: 21d80a5 added number to log

           

应用最新储存的stash并删除存储栈里面的记录

git stash pop # 应用最新一个,并删除
           

应用储藏 但不删除

git stash apply # 默认最近一个
git stash apply [email protected]{2} # 恢复指定一个储藏
           

删除储藏

git stash drop [email protected]{2}
           

查看储藏(与当前工作区做对比)

git stash show  [email protected]{1} -p # 查看具体某个储藏的差异
           

更近一步理解git stash

你可以看到 git stash 重新修改了你所储藏的那些当时尚未提交的文件。上面的案例中,你应用储藏的工作目录是干净的,并且属于同一分支;

但是一个干净的工作目录和应用到相同的分支上并不是应用储藏的必要条件。

  • 你可以在其中一个分支上保留一份储藏,随后切换到另外一个分支,再重新应用这些变更。
  • 在工作目录里包含已修改和未提交的文件时,你也可以应用储藏——Git 会给出归并冲突如果有任何变更无法干净地被应用。