写点什么

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

2019 年 2 月 01 日

用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 年 2 月 01 日 14:035315

评论 1 条评论

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

炸裂!40+图万字长文拿下HTTP

我是程序员小贱

计算机网络

腾讯一面面试官让我关闭连接

我是程序员小贱

关键绩效指标KPI

JackWangGeek

SSIS主要功能

JackWangGeek

如何优雅的编写GO程序?

八两

go 优雅 语法

六张图从HTTP/0.9进化到HTTP3.0

执鸢者

前端 网络 HTTP

远程办公暴露过程管理的不足

翟志军

管理 软件工程 远程办公

微服务与DDD学习总结

qihuajun

架构师训练营第十周作业

qihuajun

有意思:Go函数的闭包

申屠鹏会

go 闭包 函数

Go make 和 new 的区别

曲镇

go golang make

socket通信,你还会实现么?

小隐乐乐

Code Review 失败后总结的几个实践技巧

Phoenix

团队管理 团队协作 技术人 代码质量

Dubbo源码分析--dubbo-config配置层的套路

jason

troubleshoot之:使用JFR解决内存泄露

程序那些事

Java 内存泄露 性能调优

关于微服务架构(中台架构、领域驱动设计、组件设计原则)的一点思考

jason

数据挖掘

JackWangGeek

SSAS查询性能最佳实践

JackWangGeek

微软BI解决方案的优势

JackWangGeek

可读代码编写炸鸡十 - 保持单纯

多选参数

代码质量 代码 代码优化 可读代码编写 可读代码

Newbe.Claptrap 框架如何实现 Claptrap 的多样性?

newbe36524

容器 微服务 .net core ASP.NET Core

Week 10

一叶知秋

热乎的宇宙条总部面经,已拿offer,速来围观

我是程序员小贱

招银网络问了啥?这么尬?妥妥的安排

我是程序员小贱

什么是商业智能?

JackWangGeek

常见的BI项目问题和解决方案

JackWangGeek

40张图入门Linux——(前端够用,运维入门)

执鸢者

Linux 前端

我期待,这是个多彩的世界

瓜藤老祖

大三儿 乐队的夏天 九连真人

数据仓库

JackWangGeek

架构师训练营--第10周作业

Just顾

window form自定义控件类型

JackWangGeek

微服务架构下如何保证事务的一致性

微服务架构下如何保证事务的一致性

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