如果修改了代码且commit未提交到本地库,git将拒绝切换分支的命令。 如果不想提交不完整的代码,但必须修复紧急错误,stash可以将当前未提交到本地仓库的代码存储(stash )在Git的堆栈中,而不是存储在仓库中。 stash后的工作区与上次提交的内容相同,工作区已被清理。 修复并提交错误,将其推送到远程仓库,然后使用git stash apply或pop命令撤消以前完成的一半工作区。 在修改代码时,stash经常用于切换到其他分支。 stash可以“保存”当前工作空间的修改,以便以后在git stash pop中恢复现场。 stash是本地的,不会传递到远程仓库。
基本命令将git stash保存到git堆栈git stash命令将工作区和临时区域的更改保存到git堆栈,并创建说明信息。 默认值是最后发送的节点编号。
git stash save git stash save ‘说明信息’是定制的说明信息,命令比git stash多一点。 同样,它表明信息有助于理解stash的内容。
在APP中,建议在每个stash中添加消息以记录版本,然后使用git stash save而不是git stash命令。 例如以下所示。
$ git stash save 'test-cmd-stash '
savedworkingdirectoryandindexstateonautoswitch : test-cmd-stash
HEAD目前位于296 E8 D4 removeunnecessarypostionresetinonresumefunction
恢复工作区git stash pop git stash pop命令会从git堆栈中弹出stash的内容,并恢复以前的工作区修改。 默认情况下,会显示顶部的栏,即stash@{0}。 注:此命令将删除堆栈中最近保存的内容。 堆栈是先进先出的。
您也可以通过在pop后加上stash@{n}来指定要弹出的项目。
git stash pop stash@{1}
将指定的进度恢复到工作区。 stash_id是通过git stash list命令获取的
按顺序运行git stash save “test1”和git stash save “test2”命令可以获得以下效果:
$ git状态列表
sash @ {0} : on master : test 2
stash @ {1} : on master : test 1
$ git stash pop
On branch master
Changes not staged for commit:
(use ' git addfile . ' toupdatewhatwillbecommitted )
(use ' git check out-- file . ' todiscardchangesinworkingdirectory )
modified : src/main/ja dddddd.Java
nochangesaddedtocommit (use ' gitadd ' and/or ' git commit-a ' )。
dropped refs/stash @ {0} (a fc5 fsdfsfafasdffgegwea ) ) ) ) ) ) ) ) ) ) 65
$ git状态列表
stash @ {0} : on master : test 1
git stash apply git stash apply将堆栈中的内容应用于当前目录。 与git stash pop不同,此命令不从堆栈中删除内容。 git stash apply命令可以按名称指定要使用的stash,缺省情况下使用最近的stash@{0}。
$ git状态应用程序
On branch master
Changes not staged for commit:
(use ' git addfile . ' toupdatewhatwillbecommitted )
(use ' git check out-- file . ' todiscardchangesinworkingdirectory )
modified : src/main/jarwerwe.Java
nochangesaddedtocommit (use ' gitadd ' and/or ' git commit-a ' )。
$ git状态列表
sash @ {0} : on master : test 2
stash @ {1} : on master : test 1
堆栈的内容没有被删除
。git stash list
列出当前仓库下所有的stash条目,每一条stash用stash@{n}标识。
$ git stash list
stash@{0}: On autoswitch: test-cmd-stash
一个典型的输出如下:
$ git stash list
stash@{0}: WIP on master: 049d078 added the index file
stash@{1}: WIP on master: c264051 Revert "added file_size"
stash@{2}: WIP on master: 21d80a5 added number to log
git show stash@{n}
当有多条记录并且过了一段时间忘记stash内容时通过该命令可以查看stash的具体内容
删除stash git stash drop
丢弃stash条目,默认丢弃最上面的那条,即stash@{0},此外还可以在drop后加stash@{n}来指定要丢弃的stash条目。
可以使用git stash drop命令,后面可以跟着stash名字。下面是一个示例:
$ git stash list
stash@{0}: WIP on master: 049d078 added the index file
stash@{1}: WIP on master: c264051 Revert "added file_size"
stash@{2}: WIP on master: 21d80a5 added number to log
$ git stash drop stash@{0}
Dropped stash@{0} (364e91f3f268f0900bc3ee613f9f733e82aaed43)
或者使用git stash clear命令,删除所有缓存的stash。
git stash clear
清除所有的stash条目
具体执行
现有两个分支master和dev001,当前的工作分支是dev001。
$ git branch
master
* dev001
当前分支dev001的工作尚未完成,而另一项任务需要优先完成,需要创建一个新分支来工作,此时可以把当前工作现场“保存stash”起来,等紧急任务做完,再恢复stash pop工作区后继续工作。
1、保存工作区的修改
$ git stash
执行上面命令后,查看状态
$ git status
On branch dev001
nothing to commit (working directory clean)
可见工作区是干净的
2、创建分支
假设需要在分支master上修复,就切换到master上。
$ git checkout master
在master上创建新分支bug001,并设为当前工作分支。
$ git checkout -b bug001
创建bug001分支并且切换到该分支,开始紧急任务工作
$ git add test.txt
$ git commit -m "fix bug 100"
3、等我们修改完bug,提交后,切换到master分支,准备把分支bug001的新改代码合并到master上。
$ git checkout master
在master分支上合并bug001分支。
$ git merge --no-ff -m "merge bug001" bug001
(--no-ff参数,表示禁用Fast Forward模式,禁用后Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息)。
最后,删除分支bug001。
$ git branch -d bug001
4、恢复工作现场
现在,我们可以恢复到dev001分支继续之前的工作了。
$ git checkout dev001
恢复工作现场。
$ git stash pop