Git 进阶(八):git stash 与 git add
一、git stash
能够将所有未提交的修改(工作区和暂存区)保存至堆栈中,用于后续恢复当前工作目录。
总的来说,git stash
命令的作用就是将目前还不想提交的但是已经修改的内容进行保存至堆栈中,后续可以在某个分支上恢复出堆栈中的内容。这也就是说,stash
中的内容不仅仅可以恢复到原先开发的分支,也可以恢复到其他任意指定的分支上。git stash
作用的范围包括工作区和暂存区中的内容,也就是说没有提交的内容都会保存至堆栈中。
1.1 git stash 两种应用场景
对于多人并行开发,维护同一仓库工作场景,经常会出现文件合并冲突的情况,常见场景如下:
1.1.1 改动同一分支
我在本地修改好后,发现远程分支已经被改动了,此时我本地也被改动了就造成了冲突,无法push
或者pull
。
此时可以使用git stash
:
git stash save "本地缓存内容标识" //把本地的改动暂存起来
;git pull //拉取远端分支(此时本地分支会回滚到上次
commit的情况,新的改动都已保存在了
stash中)
;git stash pop // 将栈顶改动内容重新加回本地分支,就可以继续修改了,当然,如果改好了就是
add,commit,push操作。
1.1.2 不小心改动其他分支
当正在dev
分支上开发某个项目,这时项目中出现一个bug
,需要紧急修复,但是正在开发的内容只是完成一半,还不想提交,这时可以用git stash
命令将修改的内容保存至堆栈区,然后顺利切换到hotfix
分支进行bug
修复,修复完成后,再次切回到dev
分支,从堆栈中恢复刚刚保存的内容。
或者由于疏忽,本应该在dev
分支开发的内容,却在master
上进行了开发,需要重新切回到dev
分支上进行开发,可以用git stash
将内容保存至堆栈中,切回到dev
分支后,再次恢复内容即可。
例如忘记切换分支,直接在master
分支上做改动,这里假设我的分支是 test 分支。
git stash save "本地缓存内容标识" // 把本地当前改动暂存起来,此时master分支就恢复到了上次拉取时的状态
git checkout test // 切换到需要改动的分支
git stash pop // 将改动pop到自己当前的分支
顾名思义,stash
就是一个栈,把需要暂存的文件存到栈中,把代码恢复到上次拉取的状态以进行操作,而git stash pop
就是让栈顶元素出栈并删除。
git stash apply
则是只取栈顶元素,但是不删除。
这样会有一个显而易见后果,如果我再次执行git stash
,新的改动将会出现在栈顶,栈中元素会越来越多,此时可以使用 git stash list
命令查看栈中元素,此时每个栈中元素会有自己对应的编号。
使用git stash apply stash@{0}
(0 可以换成对应编号),来添加不同改动。同样,也可以 git stash drop stash@{0}
来删除对应改动。
git stash clear
可以清空。
1.2 git stash 常用命令
git stash
常用命令:
git stash save “save message”
: 执行存储时,添加备注,方便查找,只有git stash
也可以,但查找时不方便识别。git stash list
:查看stash
了哪些存储。git stash show
:显示做了哪些改动,默认 show 第一个存储,如果要显示其他存贮,后面加stash@{$num}
,比如第二个git stash show stash@{1}
。git stash show -p
: 显示第一个存储的改动,如果想显示其他存储,命令:git stash show stash@{$num} -p
,比如第二个:git stash show stash@{1} -p
。git stash apply
:应用某个存储,但不会把存储从存储列表中删除,默认使用第一个存储,即stash@{0}
,如果要使用其他个:git stash apply stash@{$num}
, 比如第二个:git stash apply stash@{1}
。git stash pop
:恢复之前缓存的工作目录,并将缓存堆栈中的对应stash
删除,同时将对应修改应用到当前的工作目录下,默认为第一个stash
,即stash@{0}
,如果要应用并删除其他stash
,命令:git stash pop stash@{$num}
,比如应用并删除第二个:git stash pop stash@{1}
。git stash drop stash@{$num}
:丢弃stash@{$num}
存储,从列表中删除这个存储。git stash clear
:删除所有缓存的stash
。
!说明!: 新增的文件,直接执行
stash
是不会被存储的,如果要保存这个新增的文件,需要首先执行git add
命令把文件添加到git
版本控制中,然后再执行git stash
命令进行缓存。
二、git stash 与 git add 关系
git add
只是把文件加到 git
版本控制里,并不等于就被 stash
起来了,git add
和 git stash
没有必然关系,但是执行 git stash
能正确存储的前提是文件必须在 git
版本控制中才行。
常规 git stash
的一个限制是它会一下暂存所有的文件。有时,只备份某些文件更为方便,让另外一些与代码库保持一致。一个非常有用的技巧,用来备份部分文件:
add
那些你不想备份的文件(例如:git add file1.js, file2.js
);调用
git stash –keep-index
。只会备份那些没有被 add 的文件。调用
git reset
取消已经add
的文件的备份,继续自己的工作。
三、拓展阅读
版权声明: 本文为 InfoQ 作者【No Silver Bullet】的原创文章。
原文链接:【http://xie.infoq.cn/article/3ebf3f9d8c0df6e5c7cb88902】。文章转载请联系作者。
评论