首先,简单介绍下Git Stash命令的用法,详细的用法在man文档中有相关介绍,下面我来说明常见的使用。
git stash: 备份当前的工作区的内容,从最近的一次提交中读取相关内容,让工作区保证和上次提交的内容一致。同时,将当前的工作区内容保存到Git栈中。
git stash pop: 从Git栈中读取最近一次保存的内容,恢复工作区的相关内容。由于可能存在多个Stash的内容,所以用栈来管理,pop会从最近的一个stash中读取内容并恢复。
git stash list: 显示Git栈内的所有备份,可以利用这个列表来决定从那个地方恢复。
git stash clear: 清空Git栈。此时使用gitg等图形化工具会发现,原来stash的哪些节点都消失了。
关于Git Stash的详细解释,适用场合,这里做一个说明:
使用git的时候,我们往往使用branch解决任务切换问题,例如,我们往往会建一个自己的分支去修改和调试代码, 如果别人或者自己发现原有的分支上有个不得不修改的bug,我们往往会把完成一半的代码 commit提交到本地仓库,然后切换分支去修改bug,改好之后再切换回来。这样的话往往log上会有大量不必要的记录。其实如果我们不想提交完成一半或者不完善的代码,但是却不得不去修改一个紧急Bug,那么使用'git stash'就可以将你当前未提交到本地(和服务器)的代码推入到Git的栈中,这时候你的工作区间和上一次提交的内容是完全一样的。
命令详解
[]方括号中内容为可选,[<stash>]里面的stash代表进度的编号形如:stash@{0}, <>尖括号内的必填
git stash 对当前的暂存区和工作区状态进行保存。
git stash list 列出所有保存的进度列表。
git stash pop [--index] [<stash>] 恢复工作进度
--index 参数:不仅恢复工作区,还恢复暂存区
<stash> 指定恢复某一个具体进度。如果没有这个参数,默认恢复最新进度
如:以下命令恢复编号为0的进度的工作区和暂存区
# git stash pop --index stash@{0}
git stash [save message] [-k|--no-keep-index] [--patch]
这是git stash保存进度的完整命令形式
使用save可以对进度添加备注
# git stash save "这是保存的进度"
现在执行list,会发现后面会出现自定义的被合租
# git stash list
stash@{0}: On master: 这是保存的进度
-k和--no-keep-index指定保存进度后,是否重置暂存区
--patch 会显示工作区和HEAD的差异,通过编辑差异文件,排除不需要保存的内容。和git add -p命令类似
git stash apply [--index] [<stash>] 不删除已恢复的进度,其他同git stash pop
git stash drop [<stash>] 删除某一个进度,默认删除最新进度
git stash clear 删除所有进度
git stash branch <branchname> <stash> 基于进度创建分支
再讲一下自己最近项目中遇到的一个问题,本来我们的线下开发分支叫做develop,我在这上面在开发,然后leader说现在加了一个分支叫做pre_dev,这个分支是用来进行code review的,所以要求开发人员以后都要在这个分支上面进行开发,然后再发merge_request,给leader进行code review,但是我现在在的分支是develop分支做的修改,如何保存这些修改到pre_dev,并且将develop恢复到最后一次提交之前的代码,可以通过如下命令进行操作:
1、git stash //对当前的暂存区和工作区状态进行保存。
2、git fetch //一旦远程主机的版本库有了更新(Git术语叫做commit),需要将这些更新取回本地
3、git checkout pre_dev //切换到pre_dev分支
4、git stash pop //恢复工作进度
5、git add . //把文件修改添加到暂存区
6、git commit -m "修改" // 暂存区的所有内容提交到当前分支
7、git pull //拉下远程分支,默认进行合并,git pull = git fetch + git merge
8、git push //没有冲突,代码push到远程端