优雅的源代码管理(三):本地优雅的使用 Git Rebase 变基

本文为日常工作使用,仅做简单的解析,不做深入探究。
温馨提示
如果你不熟悉命令行,推荐使用可视化界面操作,git 的可视化软件有很多,例如:fork、sourcetree等等。
本文是针对个人本地单机上的Git操作,不是 GitFlow 管理流程,注意区分。
Git Merge 和 Rebase
其实我要吐槽的一个点就是我在项目中看到大量的 Merge 记录,但其实 Merge 并不是这样使用的,大多数情况应当使用 Rebase 变基。
首先,为了方便演示,我们先设定两个分支,master 分支和 renfei 分支,其中 master 分支就是我们的基线分支,所以任何冲突和修改都以 master 分支为主,renfei 分支为我自己个人的开发分支,我在这个分支下工作。
如果,master 分支上有人提交了新的功能,我需要依赖或者避免后续冲突,我希望把 master 分支的内容拉取到我自己的 renfei 分支,这个时候应该用 git rebase 操作,将我自己的 renfei 分支进行变基变到当前 master 的节点上。
如果,我的功能开发完了,需要贡献给 master 分支,这个时候应该用 git merge 操作,将我个人的 renfei 分支融合到 master 分支,并且产生一个 merge commit 提交。
Git Rebase 的理解
我用大白话和图来讲一下,可能不严谨,我只表示一下意思。
在 git 中每个提交都是一个节点,组成的链条,就像链表一样,我们只需要修改一下链表的指针,就可以快速的编辑这个链条,所以变基操作我理解的是下面这个图:

由于 master 分支继续提交,原本的链表落后了,我们只需要修改链表的指针,指向最新的节点即可把 master 分支的变化拉取进自己的分支。
Git Merge 的理解
我用大白话和图来讲一下,可能不严谨,我只表示一下意思。
我的理解,merge 就是把一个分支的所有修改打包成一个 commit 提交,作为新的提交连接到目标分支,如下图:

有同学可能会问,为什么不用变基那样改指针?我是这样理解的,master 分支作为基线分支,上面的代码是可信的、安全的、权威的,而自己的开发分支是不可信的、不安全的,所以需要把你的任何修改都作为一个 commit 提交,如果一旦有问题,可以快速回滚这个提交,从而把有问题的代码恢复回去。
什么时候使用 Git Merge/Rebase
我做个总结,如果你是把权威分支的代码拉取到自己的分支或者不信任的分支中,那就使用 Git Rebase 变基;如果你要往权威分支中贡献代码,那你应该使用 Git Merge。
关于 MR(Merge Requests)
有些团队会要求往权威分支合并时提交 MR(Merge Requests)合并请求,而不是自己 Merge 以后 push,保护分支禁止 push。
有些团队则没有这类规定,如果团队较小、大家合作默契,可以不使用 MR,虽然不符合规定,但往往大家都很忙没有时间跟你 review 代码。
不过,我认为 MR 有个好功能,那就是甩锅功能,如果你代码变动巨大,你有点慌,你可以打开一个 MR,然后喊上团队的小伙伴或领导来 review 你的 MR 请求,让他们来点 Merge 按钮,嗯~~出了问题大家一起被锅啊。
总结
我总结一下我的习惯,从来没出事儿:
commit 你可以随便 commit,但是,当你想 push 前,你应该先 pull 并且使用 rebase 变基,然后再 push。
commit 的规范
此规范推荐执行,但不强制。
一个 Commit Message 主要由 Header + Body + Footer 组成,最主要的是 Header,另外两个可选。
Header 又由 type、scope、subject 构成,其中 scope 是可选,意思是 commit 受影响的范围,type 主要有以下选项:
- feat: 新增功能
- fix: 修复错误
- docs: 仅更改文档
- style: 不影响代码含义的更改(空格、格式、缺少分号等)
- refactor: 既不修复bug也不添加功能的代码更改
- perf: 提高性能的代码更改
- test: 添加缺失测试或更正现有测试
- build: 影响构建系统或外部依赖关系的更改(示例范围:gulp, broccoli, npm)
- ci: 更改ci配置文件和脚本(示例范围:Travis、Circle、BrowserStack、SauceLabs)
- chore: 不修改sre或测试文件的其他更改
- revert: 还原以前的提交
- subject 就是最主要的,对你本次提交进行简短的描述,不要超过50个字、结尾不加句号
举个标准的例子:build(deps): update xxx maven version 这个 Header 的含义就是这个提交将影响构建功能中的依赖,升级了 xxx 的 maven 版本。
商业用途请联系作者获得授权。
版权声明:本文为博主「任霏」原创文章,遵循 CC BY-NC-SA 4.0 版权协议,转载请附上原文出处链接及本声明。
相关推荐
猜你还喜欢这些内容,不妨试试阅读一下评论与留言
以下内容均由网友提交发布,版权与真实性无法查证,请自行辨别。微信订阅号
扫码关注「任霏博客」微信订阅号- 你写得非常清晰明了,让我很容易理解你的观点。
- 感谢分享!拿走了~
- 您是说 UCClient 类接收来自Discuz的UCenter的消息吧,请求是来自 Discuz 的 UCenter吗?code 为 null 说明请求URL地址中没有 code 参数 (?code=xxx) ,确定是 UCenter 发起的请求吗?
- String code = request.getParameter("code"); code一直是null 这是为什么啊
- 你好,我想问一下如果是分析型的数据库要怎么制作docker镜像呢 是修改V008R003C002B0320版本号吗
- 可以的,我也正在开发分享的程序,可以邮件或群联系我都可以,关于页面里有联系方式:https://www.renfei.net/page/about 。
- 有破解软件的需要可以私下联系您吗?
- 您好,手机APP只是个客户端,用于数据呈现展示,数据均保存在服务器上,只留个APP没有任何用处,无能为力哦。
- 老哥 看你弄了这么多软件好厉害啊。 我有个软件 我买过几个小会员 没用几天 然后商家跑路了,软件服务器关闭了,连不上去 用不了。 你能做成一个打补丁版本可以本地用的么? 方便看下么?https://haodezhe.lanzouw.com/iD0f30h9joza 谢谢老哥!
- 您好,由于版权投诉和我国知识产权法的完善,我已经下架所有破解软件的下载链接了。
- 生花妙笔信手来 – 基于 Amazon SageMaker 使用 Grounded-SAM 加速电商广告素材生成 [1]
- github.renfei.net 不再完整代理 Github 页面改为代理指定文件
- 优雅的源代码管理(三):本地优雅的使用 Git Rebase 变基
- 优雅的源代码管理(二):Git 的工作原理
- 优雅的源代码管理(一):版本控制系统 VCS(Version Control System)与软件配置管理 SCM(Software Configuration Management)
- ChatGPT 开发商 OpenAI 买下极品域名 AI.com
- 火爆的 AI 人工智能 ChatGPT 国内注册教程、使用方式和收费标准
- 解决 SpringCloud 中 bootstrap.yml 不识别 @activatedProperties@ 参数
- Cron表达式书写教程搞定Linux、Spring、Quartz的定时任务
- 阿里云香港可用区C发生史诗级故障