说起git,相信对于软件开发者来说应该都不陌生,不知道大家在开发过程中有没有遇到过这样的问题,正在开发一个功能,但突然你需要改另一个功能(当然是小改)并且这个新的改动需要提交到远程仓库,但是你不想丢失你当前的修改,也不想把这些未完成的修改混进新的工作中去,你此时应该怎么办?
今天就来讲解一下面对这种场景我的一般做法,当然可能不是最好的,只是一个人的习惯,大家如果有好的方法也可以在评论去交流一下?
新功能开发第一步
不知道大家在开发之前第一步是做什么?拉完代码直接开始开发?这是一个非常不好的习惯,下面看一下我的一般做法,在开发之前一定要确保当前本地仓库是最新的,一般做法是通过 git pull
命令拉取。下面是我的一般做法:
# 查看工作目录和暂存区的状态
git status
# 临时保存当前的更改
git stash
# 切换到需要的分支
git checkout master
-
# 拉取最新代码
git pull origin master
切换出来一个本地临时分支
git checkout -b xxx
接下来可以放心的进行你的开发啦,这样可以避免你在开发过程中遇到因为缺少最新代码而产生的冲突或错误。
stash的巧妙使用
stash主要是为了满足你当前工作目录中修改了代码,又不准备提交时,但突然需要切换到另一个任务或者分支,就可以使用 git stash
将这些更改保存到 git 栈中,并且恢复到上次提交的状态,下面就来给大家介绍一下 git stash
。
git stash
会将当前工作区的内容暂时把它们放一边,并且把工作区恢复到上次提交的状态,这样你的工作区将是干净的,你就可以随时切换去做其他事情,不会影响你当前的工作进度。
而且
git stash
还支持添加备注,你可以下面的命令为你的更改添加备注,这样你就可以同时保存很多次更改:
git stash save "test1"
如果你存了好几个改动,想看看现在保存了哪些,可以用这个命令:
git stash list
它会显示出你所有保存的进度,打印下面的内容:
stash@{0}: WIP on master: 9fceb02 Initial commit
stash@{1}: WIP on feature-branch: a1b2c3d Work on feature B
stash@{0}
是你最近保存的,stash@{1}
是之前保存的,你可以通过这些标识来恢复你想要的进度。
当你准备好继续之前的工作时,直接用 git stash pop
来恢复最近保存的进度,但是注意保持当前工作区是干净的。
git stash pop
这条命令不仅会恢复你的改动,还会把它从 stash 列表里删掉。如果你只想恢复但不想删掉它,可以用:
git stash apply 0
如果你想清空所有保存的进度,直接用:
git stash clear
这样所有的 stash 都会被清理掉。
有时候你可能不想暂存所有的改动,只想暂存一部分内容。这个时候可以用 git stash -p
(或者 git stash --patch
)来选择性地保存你想要的改动。git 会让你逐个选择哪些更改需要保存。
默认情况下,git stash
只会暂存已经跟踪的文件的改动。如果你有一些新创建的文件(还没有加到git跟踪的),并且想一起保存它们,可以加上 -u 选项:
git stash -u
如果你连 .gitignore 里忽略的文件也想保存(无理但是有时候却是有这种需求),可以用 -a:
git stash -a
哪些情况下用 git stash?
你正忙着一个任务,突然需要切换到另一个分支,做点紧急的事。用 git stash
保存当前的改动,去做其他事,等完成后再回来继续。
如果你正在做一个功能,但还没完成,不想提交,可以用 git stash
把修改存起来,等有空时再恢复。
有时你需要拉取最新的代码或者做一些清理工作,这时候可以用 git stash
保持当前工作区的整洁,等需要时再恢复改动。
stash和commit两者的区别
git stash
就像你在工作时突然被打断,手头上有些东西没做完,但你又需要暂时放下它去做别的事情。你把现在的工作状态暂时“藏”起来,等做完别的事再回来继续,随时可以恢复。但是这不会对你的版本历史产生任何影响,就是暂时保存,不会留下任何记录。
git commit
就像你完成了一个阶段的工作,决定把它保存起来并记录下来,别人也能看到这个进展。这是正式的保存,记录会永久留在版本历史里。如果你想回顾或者回退到这个版本,随时可以找到它。

写在最后
其实当前开发内容被突然打断这种场景是非常多的,但是处理的方式每个人却各有不同,方法也有很多,用一个自己喜欢的方式即可,哪怕你再拉一套代码,在新的文件夹里更改你新的内容也未尝不可,这些方法都是可以的,大家也可以在评论区分享一下你们面对这些场景是如何处理的。
作者:JamesBin