我第一次用这个命令时被坑过,经过是这样的:我发现有一个类是多余的,想删掉它又担心以后需要查看它的代码,想保存它但又不想增加一个脏的提交。这时我想到了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,如果暂存区恢复时发生冲突了会怎么办呢?嘿嘿,它会直接报错不允许你这么做:
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!