Git -- 储藏 stash

5,627 阅读3分钟

有一种场景,当你我们正在一个分支开发某个功能时(还未完成),突然需要我们切换到其他分支上处理一些事情(比如修改bug),直接切换是不可以的,一种方法是我们可以将目前的改动提交,而我们此时并不想commit,我们就可以使用stash将代码暂时储藏起来。

=== stash 储藏

git stash : 将全部未保存的代码添加到储藏


基本命令:

保存当前代码:
  1. git stash: 快速储藏代码,默认储藏名称为"WIP on <branch_name> : <latest_commit_id> <latest_commit_message>"
  2. git stash save "message": 执行储藏时,添加message信息,注明储藏名称,方便查找

查看stash代码:
  1. git stash list: 查看stash列表
  2. git stash show: 查看第一个储藏做了哪些改动(并不是改动详情)
  3. git stash show stash@{num}: 查看其他储藏做了哪些改动
  4. git stash show -p: 查看第一个储藏的改动
  5. git stash show -p stash@{num}: 查看其他储藏做的改动
应用stash代码:
  1. git stash apply: 应用第一个储藏,但不会删除
  2. git stash apply stash@{num}: 应用列表中的储藏

  3. git stash pop: 应用第一个储藏并删除
  4. git stash pop stash@{num}: 应用stash list中的储藏并删除,例如应用并删除第二个:git stash pop stash@{1}
删除stash代码:
  1. git stash drop: 删除以一个储藏
  2. git stash drop stash@{num}: 删除stash list中的储藏,例如删除第二个:git stash drop stash@{1}
  3. git stash clear: 删除所有储藏的stash
以stash储藏创建一个分支:
  1. git stash branch branchName stash@{1}: 创建新分支branchName,并切换到此分支,分支的状态与stash储藏时的状态一致,此时新分支应用的stash代码进了暂存区。

如图,展示了几个常用的stash命令:

image


more?

git stash信息存储到哪了?

项目路径下的.git文件中存储着版本管理的所有信息,在文件 .git/log/refs/stash 中可以看到全部的 stash 记录信息

在有新增文件(不是新增代码)时,git stash并不会储藏新增的文件?

也就是说 没有在git 版本控制中的文件,是不能被git stash 存起来的 ,此时需要先执行下git add 将新增文件加到git版本控制中,然后再git stash就可以了

只保存某些文件,其他的不变我继续工作?

总共分3步:(1)add 那些你不想备份的文件:git add file1.js, file2.js;(2)用git stash --keep-index:只会保存那些没有被add的文件;(3)git reset HEAD,将暂存区的修改重置到工作区继续coding

git stash save -u ?

(待确认。。。)

git stash push ?

git stash push 可以用来代替 git stash save,git stash push 等同于 git stash save,git stash push -m "message" 等同于 git stash save "message";另外 git stash push dir/file.js 可以指定储藏路径(即上面的问题-只保存某些文件,git stash save 无此功能)


参考链接

  1. git stash用法详解
  2. git-stash简单用法
  3. 使用 git stash
  4. git stash save与git stash push区别