开发人员常常遇到这种情况:花了几天时间一直在做一个新功能,已经改了差不多十几个文件,突然有一个bug需要紧急解决,然后给一个build测试组。在Git问世之前基本上靠手动备份,费时且容易出错。
git stash命令简而言之就是帮助开发人员暂时搁置当前已做的改动,倒退到改动前的状态,进行其他的必要操作(比如发布,或者解决一个bug,或者branch,等等),之后还可以重新载入之前搁置的改动,很cool吧?
首先,用git add把所有的改动加到staging area。
git add .
接着用git stash把这些改动搁置。
git stash
到这里,当前工作平台就回复到改动之前了。该干嘛干嘛,此处省略1万字。
需要找回之前搁置的改动继续先前的工作了?
git stash apply 即可。
也可以用 git stash list 来查看所有的搁置版本(可能搁置了很多次,最好不要这样,容易搞混)
在出现一个搁置栈的情况下,比如如果你想找回栈中的第2个,可以用 git stash apply stash@{1}
如果想找回第1个,可以用 git stash pop
如果想删除一个stash,git stash drop <id>
删除所有stash,git stash clear
转载二:
我第一次用这个命令时被坑过,经过是这样的:我发现有一个类是多余的,想删掉它又担心以后需要查看它的代码,想保存它但又不想增加一个脏的提交。这时我想到了git stash
,于是那一天我执行了下这个命令就回去睡觉了。 第二天我继续在这个目录里工作,coding了半天才发现前一天的修改都不见了,暂存区里也没有任何昨天修改的纪录。是我忘了保存了吗?
相信git老手们早就看出问题所在了,修改消失了并不是因为我忘了保存,而是git stash
在保存完当前工作目录和暂存区以后,会用HEAD重置这两者。因为我昨天的修改没有提交,HEAD指向的是前天的版本,所以stash以后工作目录和暂存区就会被前天的的版本所重置。
正确的做法应该是在git stash
后再执行git stash apply
,当前的工作目录就恢复回来了。
git stash apply
相当于利用过去贮藏(stashed)的工作目录快照,恢复当前的工作目录。如果工作目录在贮藏之后发生了变化,恢复时就会产生冲突(conflict),这种情况下git stash apply
会对工作目录进行merge操作。
和merge一样,git stash apply之前要保持当前目录是干净的(没有未提交的改变),否则会保错:
error: Your local changes to the following files would be overwritten by merge: Please, commit your changes or stash them before you can merge.
git stash apply
只能恢复工作目录,如果想把暂存区也按照贮藏时的暂存区恢复的话,可以加上--index
,如果暂存区恢复时发生冲突了会怎么办呢?嘿嘿,它会直接报错不允许你这么做: