写点什么

用 Git 解决 5 个开发常见问题

  • 2019-02-01
  • 本文字数:1968 字

    阅读完需:约 6 分钟

用Git解决5个开发常见问题

Git 是目前最流行的版本控制系统,GitHub 和 GitLab 是当前最流行的代码托管平台,熟练掌握 Git,可以说是程序员的必备技能。用 Git 可以解决很多问题,我整理了大家普遍关切的 5 个问题,并附上使用场景和解决思路,希望这样的方式可以让大家对 Git 有更进一步的认识,更好地掌握 Git、GitHub 和 GitLab。

1、怎么修改版本树的历史?

使用场景:在快节奏的开发过程中,为了及时保存某项开发成果,开发人员往往会通过创建一个 commit 的方式,把变更集正式保存下来,再继续后面的开发。过了一段时间,当开发人员回头审视代码的版本树,通常会发现有些 commit 需要重新修改,诸如 “commit 的说明内容有误”、“commit 涉及的功能被砍掉,需 删掉这些 commit” 和 “几个 commit 合并成 1 个后,才能完整地代表同一个功能” 等情况。


解决思路:上述的场景都反映出:开发人员对于曾经的阶段性变更(commit)有重新修改的需求,希望通过修改,可以把每个 commit 变得更有条理性、表述更准确和更易维护。我们可以借助 Git 交互式变基(git rebase -i )来修改代码版本的历史。


视频详解:怎么修改最新commit的message?

2、开发到一半被告知须立即修复线上 Bug,怎么办?

使用场景:开发人员正在为 A 项目的新功能敲着代码的时候,QA 过来通知线上发现重大 Bug,须开发人员立刻修复。这位开发人员如何快速地把 A 功能开发到一半的代码保存起来,然后切换到线上版本对应的分支解决 Bug 呢?


解决思路:开发到一半的代码,开发人员还不想通过 commit 的方式保存变更,但又想快速地把当前的工作进度保存起来,等修复完 Bug 后再调用出来。我们可以借助 Git Stash 的方式,分别对暂存区和工作区的状态进行保存。


视频讲解:开发中临时加塞了紧急任务怎么处理?

3、如何排除 Git 仓库里没必要的文件?

使用场景:IT 研发项目中,通常存在部分文件,在某些时刻它们会出现在项目的路径中,但又不能把它们存放到 Git 代码仓库中。比如,有些应用的配置文件(里面含有访问数据库的账号信息);还有一些编译后产生的二进制文件,它们由源代码就可以再次创建出来,因此没必要纳入 Git 进行版本管理。就不同的开发语言,开发团队如何快速识别不用 Git 管控的文件,并让 Git 不再理会这些文件呢?


解决思路:在项目开始就把不用 Git 管理的文件配置到 .gitignore 文件中,Git 就不会理会这些文件了。而不同的开发语言该如何配置 .gitignore ,我们可以借鉴 GitHub 的做法。


视频详解:如何指定不需要 Git 管理的文件?

4、分支集成的时候,怎么让主干分支保持 linear 的历史?

使用场景:有些团队为了后期定位问题更加高效,特性分支合入到主干分支的时候,主干分支只会创建出只有 1 个 parent 的 commit,而不会生成有两个 parents 的 commit。一旦特性分支的变更合入到主干分支后,就可以把特性分支及其只属于该分支的 commit 删除掉。这么做的好处:整个项目主干分支的版本历史永远呈一条清晰的、无分叉的线;分支演变的历史很清晰,查看历史不易出错;用 revert 做代码回滚比较容易;用 bisect 查找哪个 commit 引入了问题,只需在主干分支上查找即可,因此效率较高。


解决思路:想要让主干分支保持 linear 线性的历史,我们不妨看看 GitHub 提供的集成策略,Merge Button 不要选择 “Allow merge commits”,而应该选择 “Allow squash merging” 或者 “Allow rebase merging”。除此之外,大家还可以注意一下 GitLab 的 Merge method,看看 “Fast-forward merge ” 是否也能帮我们创建 linear 的历史。


视频详解:团队协作时如何做多分支的集成?

5、基于主干分支做 rebase 的时候,怎么省掉处理文件冲突的重复性的工作?

使用场景:某个时间点从主干分支创建出了特性分支,当这条特性分支想合回主干分支的时候,主干分支已经向前新增了 commit。为了让特性分支顺利合回主干,开发人员通常在开发本地,把自己维护的特性分支基于主干分支做 rebase。如果特性分支有多个 commit 需要做 rebase,有时候要求开发人员反复解决相同的文件冲突,这些活干起来不仅麻烦还没有什么价值。


解决思路: 我们可以借助 Rerere 这个 Git 工具,Rerere 是指“reuse recorded resolution” ,它允许我们让 Git 记住解决一个块冲突的方法,这样在下一次遇到相同冲突时,Git 可以为我们自动地解决它。


视频详解:团队协作时如何做多分支的集成?

作者寄语:

学好 Git、GitHub 和 GitLab 三剑客,仿佛乘上了安全且高速的列车,可以让团队更高效地完成研发任务,也可以让个人更顺利地参与协作,何乐而不为呢?


我在这门课里,不光讲简单的 Git 命令使用,还会讲更多 Git 原理性方面的内容,以及 GitHub 和 GitLab。知其然更知其所以然,怎么用这些做代码 review ,做项目管理,怎么去做持续集成,这些都是更高维度的东西,而不仅仅是去学几个工具。


点击试看或订阅《玩转 Git 三剑客》


2019-02-01 14:036143

评论 1 条评论

发布
用户头像
有bug了明显应该做hotfixes吧,而不是stash
2019-02-02 13:41
回复
没有更多了
发现更多内容

Amazon SageMaker Debugger 推出模型分析功能啦 | 新服务上线

亚马逊云科技 (Amazon Web Services)

NoCode 实战 | 零代码应用开发,轻松搞定任务跟踪管理难题(下)

亚马逊云科技 (Amazon Web Services)

理查德·斯托曼:为了自由,我决定写一个GNU操作系统(下)

开源青年

开源 开源青年 开源文化 人物志

亚马逊云科技大中华区企业业务拓展总经理凌琦:云计算赋能芯片设计和制造

亚马逊云科技 (Amazon Web Services)

亚马逊云科技发布中国业务战略!

亚马逊云科技 (Amazon Web Services)

架构师实战营[M1]-微信的业务架构和学生管理系统架构设计

LeoWang

模块一:课后作业

黄先生

架构实战营

大数据计算时数据倾斜问题及解决方案

五分钟学大数据

大数据 4月日更

作业内容1

谢博琛

crudapi零代码开发平台应用场景和成功案例

crudapi

RESTful API sdk crud crudapi

Java 并发基础(二):主线程等待子线程结束

看山

Java并发

通过校企合作,我们打造了一个培养应用型人才的“梦工场” | 精选案例

亚马逊云科技 (Amazon Web Services)

社交出海,应如何突破安全与合规困局? | 精选案例

亚马逊云科技 (Amazon Web Services)

理查德·斯托曼:我能发起“自由软件”运动全靠那台打印机(上)

开源青年

开源 #人物志 开源青年 开源文化

Java 并发基础(三):再谈 CountDownLatch

看山

Java并发

KAIFA 的「AMI 智能计量系统解决方案」出海记 | 精选案例

亚马逊云科技 (Amazon Web Services)

开源软件运动|网景公司|大教堂与集市

开源青年

开源 开源青年 开源文化 人物志

架构师实战营 [模块一]- 微信业务架构和学生管理系统架构设计

ifc177

架构实战营

架构实战营第一期作业

王华

架构实战营

全面升级! 星环科技基础软件再升级 赋能数字中国建设

星环科技

大数据分析之分析模型介绍

大数据技术指南

数据分析 4月日更

话说 内存屏障,有序性保证

木子的昼夜

iOS 面试策略之代码考查到offer的比较和选择

iOSer

ios 面试

进程、线程、协程

无心

网络编程 操作系统

Java 并发基础(四):再谈 CyclicBarrier

看山

Java并发

快速学一遍vue的状态管理模式 -- Vuex

空城机

JavaScript Vue 大前端 4月日更 vuex

面试的信心来源于过硬的基础(iOS开发方向)

ios 面试

团队里不能留的三种人

石云升

辞退 28天写作 职场经验 管理经验 4月日更

架构实战训练营-模块一课后作业

Johnny

架构实战营

架构实战营 - 作业01

Kram

中国唯一入选 Forrester 领导者象限,阿里云 Serverless 产品能力全球第一

阿里巴巴中间件

用Git解决5个开发常见问题_开源_苏玲_InfoQ精选文章