老大手把手教我玩 Git 变基!

系统 Linux
最近不咋在状态,一直没有写技术文。今天爬上来主要和大伙儿唠唠 GIT 的变基模式(rebase)。

 [[346349]]

本文转载自微信公众号「小鹿动画学编程」,作者小鹿。转载本文请联系小鹿动画学编程公众号。   

最近不咋在状态,一直没有写技术文。今天爬上来主要和大伙儿唠唠 GIT 的变基模式(rebase)。

第一次在团队合作项目中用到和学习到变基模式,是老大教科书般手把手教我的,通过项目中的不断运用,总结出一些自己的使用和看法。

GIT 本身对于一些初学者理解的不是这么好,对我个人来说,一开始一些基本概念在刚接触的时候,并不能通透的理解,只有当将这些概念放到实践形成自己的理解,才能知道这个概念原来是这个意思,以及这个命令是这个样子的。

所以,小鹿尽可能的多画图,少废话,便于对 GIT 理解不够透彻的朋友能够提供一些帮助。

1、什么是变基(rebase)

变基,我们可以理解为基低的意思。就像盖楼一样,一层层的向上盖,最下面是地基,我们把盖的每一层称为基。

(为了更好的理解,就拿上述盖楼为例)

假如,我们的楼层盖好了,共18层,需要多个装修工去每一层进行装修。我的装修团队一共有三个人,分别为A、B、C。

A 负责第一层,B 负责第二层,C 负责第三层。按照正常的逻辑,三个人谁提前装修完自己的那一层,谁就要到第四层进行装修。

但是有个问题就是,假如 B 第二层也装修完毕,但是 B 不知道其他两个人的最新进度,所以需要通过某种方式,把自己当前的进度更新到最新(B 应该知道下一步该装修第几层),才能继续在其他两人的进度基础上继续装修。

以上盖楼的例子虽然不是太符合项目中团队合作使用 GIT 变基,为了让大伙儿先有个大体的印象。

2、为什么使用变基?

一般我们团队合作使用 GIT 版本控制,每个人在自己分支上开发,最后负责人把每个人开发的分支 merge(合并) 到总分支上就可以了,又出了个变基模式,是干嘛的?

其一,项目变大了,团队的人员变多了,提交的分支越来越多,而且每个人 commit 之后都要合并到主分支,整个 git 分支图看起来烂七八糟,不利于维护和管理。(如上图所示)

其二,项目中充斥着各种各样的 commit ,如果有一天,出现了紧急的事件,需要回滚代码,发现这大量的 commit 需要一条条的看,让你看到怀疑人生。

以上两个理由完全可以让我放弃传统的提交合并,使用变基模式提交的代码就显的格外的清晰。(如下图)

3、如何变基?

对于如何变基,这部分最重要的是需要去实践、实践、实践。没有实践,看了也白看,记住我说的。

变基模式,用到了以下几个常用命令,还是以上述的盖楼为例。

当 B 第二层盖完的时候,它想要得知以下大家的开发进度,然后在大家进度的基础上进行接下来的开发。

就犹如在项目中,我要提交我开发完的功能,但是我开发当前功能的时候,远程仓库中可能有别人已经提交过代码了,导致了我本地仓库和远程仓库代码不一致。

想要在 push 代码前达到与远程仓库代码一致,我们需要 rebase(变基) 一下,命令如下:

  1. 1git pull base dev --rebase 

这个命令的相当于,B 直接到达了楼层的第五层进行装修。而且我们的装修记录,也就是我们的开发主分支变的非常的清晰和明确,就是一条挂满 commit 的分支线。

4、我玩坏了的变基

但是问题来了,GIT 变基模式前期刚使用的时候,被我多次玩坏,总结出了一些经验。

当我每次提交最新代码的时候,每次忘记 rebase,也就是每次没有顾及到远程的最新代码,而是开发完功能,直接进行提交,导致线上的代码出现分叉(其实又回到了原来的提交方式)。

很着急,该咋办?老大出马,一个顶俩,没毛病。

使用回滚和 pick 的方式,让主分支不再出现分叉。所谓的 pick 是使用 cherry-pick 命令将 commit 的提交重新挂在到你想要挂载的分支上。

 

  1. 1git cherry-pick <commit id> 

当你 pick 完之后,再重新进行 push 和 pr,分叉的分支就回到了原来的一条线上。是不是很 nice?

小结

Git 变基完全理解了之后,感觉不是特别难,但是前期刚接触,确实很多不太明白的地方,导致玩坏了很多次。话说回来,不经历风雨,怎么见彩虹呢?

 

责任编辑:武晓燕 来源: 小鹿动画学编程
相关推荐

2021-12-02 11:39:28

Git服务器Linux

2022-05-10 10:43:35

数据源动态切换Spring

2011-01-10 14:41:26

2011-05-03 15:59:00

黑盒打印机

2021-07-14 09:00:00

JavaFX开发应用

2021-12-30 11:39:27

MySQL 删库不跑路

2011-02-22 13:46:27

微软SQL.NET

2021-02-26 11:54:38

MyBatis 插件接口

2021-12-28 08:38:26

Linux 中断唤醒系统Linux 系统

2022-01-08 20:04:20

拦截系统调用

2023-04-26 12:46:43

DockerSpringKubernetes

2022-12-07 08:42:35

2022-07-27 08:16:22

搜索引擎Lucene

2022-03-14 14:47:21

HarmonyOS操作系统鸿蒙

2022-12-07 13:58:26

Git命令

2020-07-09 08:59:52

if else模板Service

2009-12-11 09:04:10

Windows搭建Li

2024-10-16 11:40:47

2020-04-14 10:20:12

MySQL数据库死锁

2011-03-25 12:45:49

Oracle SOA
点赞
收藏

51CTO技术栈公众号