写点什么

用 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:036131

评论 1 条评论

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

老板,运维和开发又打起来了!,你连基础的JVM运行时内存布局都忘了

Java 程序员 后端

聊聊多线程(一)线程的基础,linux集群架构师

Java 程序员 后端

腾讯T4:结合我多年工作经验给程序员的几点忠告,别再埋头苦干了

Java 程序员 后端

腾讯、美团等六家大厂收到offer,浅谈大数据面试经历,2021Java面经

Java 程序员 后端

老大让我优化数据库,我上来就分库分表,他过来就是一jio

Java 程序员 后端

聊聊RabbitMQ RabbitMQ相关面试题,kafka入门教程步骤

Java 程序员 后端

脉脉上瞬间爆火的Java高级面试题被全网封杀,这套资源到底有什么魅力?

程序员 后端

脑筋急转弯:如何用两个栈实现一个队列?用两个队列实现一个栈

Java 程序员 后端

老夫面试两个月真实经历:面试了20家大厂之后,发现这样介绍项目经验

Java 程序员 后端

腾讯启动有史以来最大校招:苦逼程序猿,拿头发换了高质量生活

Java 程序员 后端

膜拜!京东T9大牛沉淀三年终于整理出了这份架构核心修炼之道

Java 程序员 后端

若依集成 WebSocket,linux学习步骤

Java 程序员 后端

老生常谈:MySQL高可用,java泛型原理

Java 程序员 后端

聚焦WAVE SUMMIT 2021,大咖齐聚共研深度学习(1),java在大数据技术中的运用

Java 程序员 后端

聚焦WAVE SUMMIT 2021,大咖齐聚共研深度学习,关于线程池的五种实现方式

Java 程序员 后端

获12w+星标的神仙文档再度上榜,简直是一套活生生自学Java的福星

Java 程序员 后端

架构实战营- 模块二作业

危险游戏

架构实战营

自己搭建电商平台初期,原来“超卖,java书籍百度网盘

Java 程序员 后端

老面试官问我:LRU 和 Innodb Buffer Pool 有什么关系?

Java 程序员 后端

聊聊多线程(四)线程安全之AtomicInteger类,最全面试考点与面试技巧

Java 程序员 后端

脑筋急转弯:如何用两个栈实现一个队列?用两个队列实现一个栈(1)

Java 程序员 后端

腾讯技术大牛带你玩转Spring全家桶,赠三本Spring实战篇电子文档

Java 程序员 后端

肝完这份Linux网络编程笔记,感觉2年开发白干了,nginx反向代理原理转发过程

Java 程序员 后端

腾讯T4架构师:刷3遍以下面试题,你也能从小公司成功跳到大厂

Java 程序员 后端

腾讯五面、快手三面已拿offer(Java岗位,linux基础教程第二版pdf

Java 程序员 后端

蓦然回首,十余年的程序员生涯最后就只剩下了这些!希望我犯过的错误你不要再犯

Java 程序员 后端

蘑菇街Java大牛纯手打肛出的一份多线程文档,请别丢进收藏夹吃灰

Java 程序员 后端

聊聊MyBatis的历史,mysql原理详解

Java 程序员 后端

聊聊MySQL主从复制的几种复制方式,上岸蚂蚁金服

Java 程序员 后端

腾讯T8纯手写66个微服务架构设计模式,全部学会真的“变强

Java 程序员 后端

膜拜!华为内部都在强推的783页大数据处理系统:Hadoop源代码pdf

Java 程序员 后端

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