git stash 用法总结和注意点

使用场景:一般在公司正常节奏开发时很少用到这个命令,但是当某一天领导非常着急找到你,需要紧急的处理一个其它分支产生的bug,如果直接checkout到其它分支,那么势必会造成当前已经开发代码丢失相当于白干了,那么如何才能在不丢失当前工作代码的情况下切换到其它分支进行开发,开发完成又可以恢复当前手头的工作呢?这个时候就要借助git stash这个命令,它的作用是将本地工作区所有未提交的工作进行“冻结”,在处理完其它临时插入的开发任务之后,可以随时回到先前的工作现场。

常用git stash命令:

  • git stash save "save message"

    • 执行存储时,添加备注,方便查找,只有git stash 也要可以的,但查找时不方便识别。
  • git stash list

    • 查看所有被冻结的工作现场
  • 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@{0},如果要应用并删除其他stash,命令:git stash pop stash@{$num} ,比如应用并删除第二个:git stash pop stash@{1}
  • git stash drop stash@{$num}

    • 丢弃stash@{$num}存储的工作现场,从列表中删除这个工作现场的存储
  • (8)git stash clear

    • 删除所有缓存的工作现场

注意:新增的文件,在没有被git管理管理时,直接执行git stash命令的话,这些新增的文件是不会被存储的。

举例:

  在git status 那一步很明显可以看出来,修改了README,添加了新文件abc.txt,然后执行了git stash save后,在执行git stash list 可以看到刚才的save是的信息,然后使用git stash show ,只显示了README的改动被存起来了。

img

  正常情况下,在执行了git statsh 以后,被存起来的在当前目录再执行git status 就看不到任何工作痕迹了,但是现在再执行git status命令,如下图:

img

  这个没有被git工具管理的abc.txt文件还在,说明工作现场没有被完全冻结起来。说白了就是没有在git 版本控制中的文件,是不能被git stash 存起来的。

  那如果这个文件我们也想存起来该怎么办呢?很明显,先将未被git管理的文件全部使用git add 加到git版本控制中,然后再git stash就可以了,如下:

img

  最后一步可以看出来,这个新增文件已经被stash了。

  这个时候再执行下git status查看工作区的状态 ,被存起来的工作现场,在当前目录就看不到了,如下:

img

  这个时候,想切分支去处理其它事情就不会报错有已改动但未提交的工作了。

  如果要应用这些stash,直接使用git stash apply或者git stash pop就可以再次导出来了。

  总结下:git add 只是把文件加到git 版本控制里,并不等于就被stash起来了,git add和git stash 没有必然的关系,但是执行git stash 能正确存储的前提是文件必须在git 版本控制中才行。

  参考的一个链接中说到了以下,我摘录此处备份下(就是只stash一部分文件):

  常规 git stash 的一个限制是它会一下暂存所有的文件。有时,只备份某些文件更为方便,让另外一些与代码库保持一致。一个非常有用的技巧,用来备份部分文件:

  1. add 那些你不想备份的文件(例如: git add file1.js, file2.js)
  2. 调用 git stash –keep-index。只会备份那些没有被add的文件。
  3. 调用 git reset 取消已经add的文件的备份,继续自己的工作。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利
原文地址:https://www.cnblogs.com/hhddd-1024/p/15354824.html