本文首发于个人博客 https://maclaren0920.github.io
那些不常用的Git高级命令
Git作为版本控制管理工具的顶流,时至今日已经成为前后端开发必不可少的一项技能,掌握Git是开发工程师们的必备需求。但是大部分日常使用的都是写比较基础的命令,对于有些高级命令有些使用Git多年的开发人员可能都从未用过,所以本文的目的就是带你了解几个不常用但是非常有用的高级命令。
git stash
git stash命令可以用于将工作区和暂存区未提交的修改进行保存。
假如你正在feature分支上开发中,突然你的leader告诉你dev分支有一个紧急的bug需要你去修复,但是你在feature分支上的功能还没开发完成,这个时候你只能把feature分支未开发完成的代码先提交,再切换到dev分支去修复它,那么有没有其他办法呢?
那就是用git stash命令将工作区的修改进行保存,当你执行完git stash命令后,再执行git status你会发现你之前在工作区的修改全部被取消了,你的工作区是干净的,这个时候你就可以直接切换到dev分支进行开发,当你在dev分支的bug修复完成之后,再切换回feature分支再执行git stash pop就可以将之前在feature分支未开发完成的修改还原回来,然后就可以继续开发了。
git stash作用其实就是将未commit的修改操作保存在堆栈中。
git stash主要有以下几个参数:
- git stash 将未commit的修改操作保存
- git stash list 列出已保存的记录
- git stash pop 将最近保存的一条记录还原到工作区,并且从list中删除
- git stash apply 将最近保存的一条记录还原到工作区,并且不删除list中的记录
- git stash clear 清空list中的是所有保存记录
git cherry-pick
git cherry-pick的作用就如其名摘樱桃,见名知意,就是将某个分支中的某个commit转移到另一个分支中。
你在dev1分支中开发完成一个功能,现在有个需求需要将dev1分支上这功能挪到dev2分支中,但是dev1和dev2两个分支的功能并不同步,所以不能直接在dev2分支的基础上直接合并dev1分支,这个时候就可以用cherry-pick这个命令。
首先在dev1分支上使用git reflog命令找到提交该功能的这commit id,它是一个hash值,
将其copy出来,再切换到dev2分支,使用cherry-pick命令:
这样dev1分支中该功能的commit修改记录就成功转移到了dev2分支上。
以上操作cherry-pick只是转移了一个comit记录,该命令也支持同时转移多个commit,只需要用空格隔开即可。
git cherry-pick xx1 xx2 xx3
除此之外,cherry-pick命令参数还可以是一个分支名,此操作会将该分支最新的一次提交转移过去。
git cherry-pick dev3
git rebase
git rebase命令主要有两种功能:
- 合并commit
- 合并分支
合并commit
合并commit是比较常见的需求,我在开发一个模块时同时产生了3个commit记录,这3次记录都针对该模块的,对于后面两次来说是没必要的记录,这里可以使用git rebase命令来将这三个commit合并成一个。
首先使用git log命令找到需要合并的这三个commit之前的那个commit id,
然后使用git rebase命令:
git rebase -i 1ed74ac3c35c4f78f7eff2b61c22b6346cb68296
这时会出现一个交互命令窗口,这里我们将3个commit合并成一个,那么将第二三个commit id前面的pick改成squash,
改完之后wq保存,会出来另外一个弹窗,需要重新修改commit message,修改完成之后wq保存,git log你会发现之前三个commit成功合并成了一个。
提交记录一下子变干净了。
合并分支
合并分支通常是使用git merge命令,但是git merge有个问题,就是提交记录产生多条,而git rebase可以让commit记录变成一条整齐的git flow。
现在需要将main分支合并到dev1中,首先将main分支更新到最新,然后切换到需要rebase的分支dev1,执行git rebase main
你会发现main分支中的commit修改记录成功转移到了dev1分支上,并且并没有新增commit,查看下commit提交记录,git flow是一条整齐的git flow。
总结
以上介绍几个并不是很常用的Git高级命令,虽然并不是非常常用,但是在关键时刻却能达到事半功倍的效果,以上命令只是做了基础使用介绍,其他更多高级用法可以参考查询官方文档和其他资料。
参考
《Git权威指南》