在之前的内容中我们提到过,当你在某个分支上进行开发时,如果要紧急切换回master修复BUG,则可以先在当前分支上提交,之后切换分支,修复BUG并提交,然后,切换回功能分支继续开发。当然,这只是一个理想的情况,现实中,有很多时候,我们的代码还不具备提交条件,面对这种情况,该怎么办呢?
把提交当作代码的临时缓冲区
为了演示这个过程,首先,我们新建一个目录git-stash,在这里,执行git init
创建一个新的repository。然后,在git-stash中新建个文件index.txt,并在master分支提交一次:
git add .
git commit -m "Add index.txt"
接下来,为了开发新功能,我们新建并切换到了feature/about分支上:
git checkout -b feature/about
完成后,我们新建个文件about.txt,并给它添加一些内容,例如:"About us.",模拟正在开发:
echo "About us." > about.txt
这时,假设我们要切换回master分支修复bug,但此时about.txt还未完成,我们又不能提交。在这种情况下,如果直接切换回master分支,就会看到这样的结果:
当然,我们并不想,也不应该在master分支上看到这些之前在feature/about分支上的操作。就像在这一节开始说到的,为了避免这种情况,通常我们会执行下面的命令回到feature/about分支,执行一次"Working In Progress"提交:
git checkout feature/about
git add .
git commit -m "WIP"
然后,回到master需改bug,完成后,再回到feature/about,执行git log
找到WIP前一次提交的ID,并执行:
git reset --soft 519f5da64a88bdf18c540d55d3f125f5f61af68f
回到提交之前,继续我们的开发工作。其实,这算不上是什么“不恰当”的举动,很多时候,我们都在用这种方式缓存代码。要说唯一不好的地方,就是用起来有点儿啰嗦。面对这种常见的场景,git
提供一个更方便的方法,叫做git stash
。
使用git stash临时缓存代码
现在,执行git status
,我们的状态是这样的:
为了在feature/about分支上“缓存”这个修改,我们只要直接执行git stash
就好了。完成后,git
会给我们一个提示信息:
这时,再执行git status
就可以看到feature/about分支变干净了。我们切换到master分支,此时,master分支上也不会再有我们新建的文件:
我们也就可以安全地在master分支上,进行各种必要的工作了。
现在,假设master上的工作完成了,我们切换回feature/about。该怎么取回之前“缓存”的代码呢?我们先执行git stash list
,查看下所有的“缓存”:
可以看到,每个缓存都会有一个形如stash{0}
这样的ID。为了从“缓存”恢复,我们可以执行git stash apply stash{0}
。这里的stash ID是可选的,如果不指定,git
就会使用最新的一次stash把“缓存”的代码恢复回来:
但这时,再执行git stash list
就会发现“缓存”还在。如果我们希望恢复并清除“缓存”,可以执行git stash pop stash{0}
。
我们也可以执行
git stash drop stash{0}
手工清除“缓存记录”。
把stash“推送”到新分支上
在这一节最后,我们来看下面这样的场景:假设我们在feature/about分支上,并在这个分支上“缓存”代码。然后,我们切换回master分支完成了一些工作。
接下来,由于操作失误,我们不小心删掉了feature/about分支,怎么办呢?
这时,执行git stash list
就会看到,之前feature/about上的“缓存”记录还是存在的。我们可以执行git stash pop
把缓存的内容先恢复到master分支上:
然后重新执行git stash
,这时,就是对master分支上的“缓存”了。最后,我们只要执行git stash branch feature/about
,git
就会用缓存的内容创建并切换到feature/about分支。这样,就可以继续之前的开发工作了:
网友评论