业务中git的使用流程
开发阶段:
- 规范Commit message,格式例如
提交类型(模块): 变更,比如feat(packages/components): 增加 button 组件 - 分支命名习惯,开发阶段:feature/项目名字,测试阶段:feature/fix-项目名字
- 保持经常执行gst和glog的习惯(推荐zsh安装git plugin插件)
- rebase和merge不能混着用,全用rebase
下面比较一下三种merge对应的commit history,二和三需要rebase
测试阶段:
从release分支拉取新的hotfix分支去修改,改完向release分支提交MR并且自动删除该hotfix分支。
全程合并代码相关操作只能使用rebase不能使用merge,下面分享一下rebase的使用心得。
rebase合并代码的流程
比如当前我们在feature/grouping分支上开发,现在要去合并到release_test分支,执行命令顺序如下:
git fetch -p //更新分支并且删除多余分支
git switch release //切到当前的release分支
git pull
git switch feature/grouping //切回开发分支
git rebase release
//中间有冲突就解决完就命令行执行git rebase --continue 千万别用vscode,也不能中途pull和commit
git push -f
关键点在于rebase的时候该解决就解决冲突,不是自己写的代码rebase的时候一般用current,merge的时候一般用incoming,是反着的(当然冲突处理还是要看具体情况,不能盲目解决),处理完命令行执行git rebase --continue,从rebase开始,本地代码就是干净新的,远程的是脏的,所以千万别pull和commit,理论上是这样,下面,将演示我的各种不规范操作带来的后果:
如果pull了,它会突如其来的强制引入这样一次merge开头的commit
伴随着会把这期间我们的commit带进来原模原样的重复一遍,这种时候一定要内心坚定,千万别信这些提示,比如下面的
都不能去管,果断的命令行输入git push -f,反正是咱们自己的分支,而且从进入rebase的那一刻起,本地的分支就比远程的要新,所以千万不能把远程的代码拉下来, 也不能执行git commit,不然看到Merge branch的这一刻起就是进入git rebase苦痛之路的开始。所以配合git rebase的翻车,我又尝试了两种补救措施:
reset回滚
如果直接push了,现象如下:
commit结束之后会出现很多重复的提交。
这时候如果及时发现,可以执行git reset HEAD~1后再push -f,把这笔merge记录干掉,但是如果在此基础上又做了一些提交,就比较推荐用下面这种措施了。
拉新分支把代码拷贝进去
万能办法hhh,不行就去新建分支。
交互式Git rebase
这四笔提交对应修改的代码:
如果我们想删除提交记录:
planA: drop
会进入rebase,但是可以看到我们想删除的那笔commit里面的代码也进来了,所以它只能帮我们删除commit,不一定可以删除代码。
planB:用s合并commit,没有进入rebase,直接合并。
Git Rebase vs Git Merge --squash
- 操作方式
rebase:
git rebase master
git push -f
merge --squash
git merge master --squash
git commit
git push
- commit记录
同样可以保证最后commit记录是一条直线,git merge --squash会比git rebase多一次commit记录,记录里自动包含了引入了哪几笔commit
对比直接merge,不仅会多一笔commit记录,右边还会多一条commit的线:
所以还是直接rebase不会有多的提交记录。
最后,贴一张网上找到的文章:
stackoverflow.com/questions/2…
Git的一些秘密工具
fish配置git plugin
用fish是为了懒得折腾,毕竟本文的主题是黑科技嘿嘿,贴一下Mac安装fish和oh-my-fish:
kangxiaoning.github.io/post/2021/0…
输入fish_config可以轻松配置主题
然后安装插件:
附上git plugin官网安装地址:
按照里面的readme,输入
omf install https://github.com/jhillyerd/plugin-git
里面还提供了大量方便的指令,例如:
glog:
能看到清晰明了的git tree.
gdw:
可以看到项目修改变化。
还有更多快捷好用的指令参考GitHub - jhillyerd/plugin-git: Git plugin for Oh My Fish (similar to oh-my-zsh git)
Vscode git 插件
GitLens
安装后在vscode的git栏可以看到下面多了很多功能。
备注:如果遇到GitLens用不了的情况,检查一下git目录添了没有,在 Code -> Perferences -> Settings 中搜索 git.path 编辑 settings.json,加上如下配置
{
"git.enabled": true,
"git.path": "/usr/bin/git"
}
git.path 需要自己电脑 git 的路径,在 Mac 系统下可以直接在命令行中搜 which git 拿到 git 的路径
Git Graph
按照后也是在git操作栏上方多了graph标签。
点击后看到graph展示。
Git History
安装后点击任何一个文件夹,右键可以找到git history,点击可以查看commit记录。
Oh Shit, Git !?!
这里讲了很多补救措施,比如
git stash
会保存当前的工作进度。会分别对暂存区和工作区的状态进行保存
git stash --list 显示进度列表。此命令显然暗示了git stash 可以多次保存工作进度,并用在恢复时候进行选择
git stash pop
如果不使用任何参数,会恢复最新保存的工作进度,并将恢复的工作进度从存储的工作进度列表中清除。
再补充一下文章里提到的git flow的使用方法,场景是有一次我reset的时候犯了一个天大的失误,commit_id用成了别的分支上的,然后还git push -f了,当时我觉得已经凉透了,还好跟我一起开发的另一个同学那里有一份本地代码,她帮我push -f上去才把错误的远程代码还原了,但是细思恐极,如果不是我们两一起开发,我不是相当于删库跑路了,后来发现还有git reflog命令可以抢救,操作如下:
比如这是我当前的分支,我reset到了旁边的cae2cd6的commit上面,然后git push -f
结果相当于把我的分支删了跑到了旁边的这个分支上,还好我及时发现了端倪,没有继续在上面开发了。这时候赶紧执行git reflog:
打印出了之前我所有的git commit变化记录,这些记录存储在本地,第一列是commit id,第二列是索引,第三列是操作记录。
我们看第二列,发现HEAD@{3}是我的错误reset,HEAD@{4}时候还是正常的代码,这时候我们回到HEAD@{4}
git reset HEAD@{4}
git push -f
安全下车
And one more thing
有时候我们正在一个分支上开发还没有push代码,突然要切到另一个分支上改bug,出现下面报错,可以使用哪条指令?