git提交代码是用git-merge还是git-rebase呢?

news2025/1/19 17:07:02

什么是git merge?

git merge是我们在git操作中频繁会用到的一个命令,它主要实现的功能便是为我们进行分支代码的合并,也就是将两个或两个以上的开发历史合并在一起的操作。

它有以下两种用途:

更新代码时,整合另一个代码仓库中的变化,也就是git pull命令中,我们使用git pull命令时,实际上相当于git fetch+git merge,进行了远程仓库代码的拉取,以及整合另一代码仓库中的变化用于从一个分支到另一个分支的合并,我们一般会通过该命令进行从指定的commit(s)合并到当前分支的操作,要注意的是这里的指定commit(s)是指从这些历史commit节点开始,一直到当前分开的时候。git merge有个重要的特点,便是在合并过程中,它会创建一个新的commit节点,来作为我们的合并结果节点,如下图

a. 假设master目前的历史提交情况如下,head处于commit-D的位置。

b. 我们从D的位置,checkout出一个新分支feature,并增加了两次提交E和F。

c. 然后我们想将feature分支合并到master上,此时我们只需要在master分支上执行git merge feature此时将在master上将合并结果生成一个新的commit节点G,最终推送远程分支。

可见merge命令的强大和便利,通过分支来完成需求代码的编写,再通过合并的方式,保证了主分支的整洁性。

什么是git rebase?

说完了git merge,我们来说一说git rebase。

我们可以把git rebase理解成是“重新设置基线”,将你的当前分支重新设置开始点。我们便能知道你当前分支与你需要比较的分支之间的差异。

也就是基于一个分支来设置你当前的分支的基线,这基线就是当前分支的开始时间轴向后移动到最新的跟踪分支的最后面,这样你的当前分支就是最新的跟踪分支。

它有以下几点用途:

合并提交记录,比如说对于我们拉取出来的开发分支,可能会在开发过程中多次提交测试,会产生很多不规范的、不必要的提交,这类提交将会造成我们的分支污染,当出现问题需要回退时,将增加难度。合并分支,乍一看好像与merge命令拥有同样的功能,是的,它们都能合并,不过彼此的合并原理却大大不同,git merge是将合并结果产生新节点,不影响历史的提交,而git rebase是基于变基的操作,它会将分支的开始点基于rebase的分支重新设置,并将rebase的分支重新提交,直接贴到该分支开始点之后,再之后才是该分支自己的提交。多说无益,我们根据这两点来描述下场景,加深大家的理解:

合并提交记录

假设此时分支上有三次提交,分别是first commit,second commit,third commit,我希望将前两次进行合并,最终得到两次提交的结果。

a. 我们使用“git rebase -i HEAD~3”命令查看最近三次提交,并打开一个编辑器,其中第一列为“操作指令”,第二列和第三列为我们的提交信息:

 

git rebase -i HEAD~3

b. 操作指令包括:pick:保留该commit;reword:保留该commit但是修改commit信息;edit:保留该commit但是要修改commit内容;squash:将该commit和前一个commit合并;fixup:将该commit和前一个commit合并,并不保留该commit的commit信息;exec:执行shell命令;drop:删除该commit。在本次操作中,我们将使用squash命令,将第二个合并到第一个里面去,修改后保存退出,如下:

 

在编辑器中修改,将第二个的操作指令修改为squash

c. 保存退出,进入编辑器,对合并后的commit信息进行编辑,我们将“1&2 commit.”编辑到this is a combination of 2 commits的下面。并保存退出。

 

d. 最后我们来看下结果,通过git log看日志 或者 git rebase -i,可见第二次提交已经不见了,第一次提交的提交信息变成了我们刚刚修改的“1&2 commit.”。便完成了提交记录的合并。

 

合并分支

假设我们现在有个需求开发,所以我们就从主分支master上拉出了一个开发分支dev,在该分支上迭代代码,但此时其他同事也在同时进行开发,也就是如下情况:

两个开发分支都从commit-C处拉取处新分支

若dev2分支提前完成,将代码合并到了master分支上了,此时master分支就变成如下:

master的提交记录便发生了变化,增加了新节点H

那么为了提交不冲突,此时我们会使用merge命令,将修改后的master合并到dev分支上,结果便会导致dev分支会出现一些merge的信息,污染了dev分支的commits,那么此时我们就可以使用rebase命令,来将master的变化合并到dev上,该操作会将dev分支的开始节点进行变基,变成master当前的状态,再增加我们的新修改

通过git rebase master,进行变基合并

也就是说,当我们在dev分支上使用git rebase master后,git会把dev分支里面的每个commit取消掉,然后把上面的操作临时保存成 patch 文件,存在 .git/rebase 目录下;然后,把 dev 分支更新到最新的 master 分支;最后,把上面保存的 patch 文件应用到 dev 分支上;

结果便是,原先dev分支是从C开始的,通过变基后,变成了从H开始,就相当于此时刚从master拉取的一个新分支,这么一看,是不是dev的commit-log就变成很整洁,没有受到污染呢。

两者的区别

通过上述两者的描述,我们就能总结出这两个命令的区别啦:

rebase:会把你当前分支的 commit 放到公共分支的最后面,所以叫变基。就好像你从公共分支又重新拉出来这个分支一样。

就像刚刚上面的例子: 如果你从 master 拉了个dev分支出来,然后你提交了几个 commit,这个时候刚好有人把他开发的东西合并到 master 了,这个时候 master 就比你拉分支的时候多了几个 commit,如果这个时候你 rebase master 的话,就会把你当前的几个 commit,放到那个人 commit 的后面。

merge:会把公共分支和你当前的commit 合并在一起,形成一个新的 commit 提交。

两者的使用场景

merge命令一般用于将开发分支、热修复分支等合并到主分支上,因为该命令不会修改分支的历史信息,只会增加新节点,非常适合主分支这种稳定性且需要用于版本控制的分支上。

rebase命令一般用于将基分支的新提交记录,合并到正在进行开发任务或修复任务的分支上,因为该命令能保证开发分支的历史与基分支的历史保持一致,从而减少污染性。

但要注意,rebase命令最好不要用于一个公共的分支,假设你们公司的开发分支是一个公用的分支,此时多人在这个分支上开发,由于rebase的修改历史的特点,可能会出现丢失修改的问题,对于这种运用,建议团队之间进行沟通后决定使用merge或rebase来保证该公用开发分支的可用和完整。

我在工作中的运用

在工作中,我们会拥有自己的开发分支,在完成需求需要进行版本迭代的时候,会将开发分支的提交合并到master上,一般我的操作如下:

a. 通过git stash,将我自己开发分支的代码保存到暂存区中,恢复本地仓库到修改前的状态;

b. checkout master进入主分支,git pull拉取master的最新commits;

c. checkout mydev进入开发分支,通过git rebase master将master最新的提交,合并到自己的开发分支上, 保证该分支的历史提交与master相同;

d. git stash pop将自己的修改取出;git commit、git push提交到远程开发分支上;

e. 发起merge请求,合并到master分支;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/895923.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

行业资讯丨“燃气智慧化”到底是什么?

文章来源:网络 关键词:智慧燃气、智慧燃气场站、设备设施数字化、数字孪生、工业互联网 带你了解燃气信息化 随着科技的不断进步和信息化的快速发展,各行各业都在积极探索如何将技术应用于业务中,以提高效率和服务质量。 燃气…

Java实现钉钉企业内部应用机器和自定义机器人发送消息

前言 公司让写一个服务监控的功能,当监测到服务停止时,向钉钉群里推送报警信息。之前大概看到钉钉的开放平台的API文档,好像能群发消息的只有机器人。 钉钉开放平台目前提供三种机器人: 企业内部应用机器人 群模板机器人 自定义机器人 本来向用自己比较熟悉的自定义机器人…

初试时间官宣!研招网发布下半年重要时间节点!今日速报来了

距24考研初试还有127天,今天给大家带来初试和报名时间官宣消息、考研报名注意事项、研招网发布的2024考研“保姆级”下半年重要时间节点。有用记得收藏 24考研报名和初试时间官宣 已有学校在招生简章中明确24考研初试时间 初试时间预计为:2023年12月23…

当我们都是那个“和尚”:团队合作中的责任与动力

引言:三个和尚的故事 中国的古老民间故事中,有一个被广为传颂的故事 - 三个和尚的故事。该故事描述了三位和尚居住在远离水源的山上寺庙中。当只有一个和尚时,他每天下山提水,日复一日,从未间断。但当寺庙里有了三个和…

【Java】常见面试题:HTTP/HTTPS、Servlet、Cookie、Linux和JVM

文章目录 1. 抓包工具(了解)2. 【经典面试题】GET和POST的区别:3. URL中不是也有这个服务器主机的IP和端口吗,为啥还要搞个Host?4. 补充5. HTTP响应状态码6. 总结HTTPS工作过程(经典面试题)7. H…

后台程序 报错内容:java.sql.SQLException: Java heap space

原因有以下可能: 1、查询没有通过参数,而是直接查询出所有的记录; 2、是由于mysql单个字段存储的内容过大导致堆内存溢出; 3、JVM启动时,JVM堆会自动设置heap size值,值太小导致;

【高级程序设计语言C++】布隆过滤器

1. 布隆过滤器的概念2. 布隆过滤器的简单实现2.1. 布隆过滤器的长度和哈希函数的个数2.2. 布隆过滤器的结构2.2.1. 插入2.2.2. 查询2.2.3. 误判率的测试 2.3. 布隆过滤器的删除 1. 布隆过滤器的概念 布隆过滤器(Bloom Filter)是一种用于快速判断一个元素…

前端实习day30

今天又是一个繁忙的一天,加功能,改样式,改得头皮发麻,预定的任务还是没能完成,改起来真得太头疼,代码太乱了!!昨天那个bug,今天问了一下同事,不到五分钟就解决…

【面试八股文】每日一题:谈谈你对线程的理解

每日一题-Java核心-谈谈你对线程的理解【面试八股文】 Java线程是Java程序中的执行单元。一个Java程序可以同时运行多个线程,每个线程可以独立执行不同的任务。线程的执行是并发的,即多个线程可以同时执行。 1. 线程的特点 Java中的线程有如下的特点 轻…

背包问题 - 动态规划

1. 背包问题总结 暴力的解法是指数级别的时间复杂度。进而才需要动态规划的解法来进行优化! 背包问题是动态规划(Dynamic Planning) 里的非常重要的一部分,关于几种常见的背包,其关系如下: 2. 01背包 01背包问题是…

离谱,居然还有网络工程师不懂什么是Overlay网络?

下午好,我是老杨。 伴随着网络技术的发展,数据中心的二层组网结构早已出现了阶段性的架构变化。 数据中心网络分为了Underlay和Overlay两个部分,网络进入了Overlay虚拟化阶段。 很多小友希望能多输出一些新技术,这不&#xff0c…

去年校招面试中Hadoop高频都问些什么?秋招在即,快收藏!

1 总述 校招是远不同于社招的,企业对学生的要求更多的是一些概念性的东西,即所谓的八股文。但有些场景类的题目也是会涉及到,尤其是在一些中大厂的面试题中。场景题固然是能不能中大厂中必不可少的部分,但是基础牢不牢才是能不能…

Docker安装基础使用练习

目录 1、安装Docker-CE 1)简单使用yum方式安装 ! 2)配置镜像加速: 2、下载系统镜像(Ubuntu、 centos) 1)先查看我们所需的镜像有哪些版本。使用search命令! 2)下载镜像使用的是pul…

Elasticsearch 查询之Function Score Query

前言 ES 的主查询评分模式分为两种,是信息检索领域的重要算法: TF-IDF 算法 和 BM25 算法。 Elasticsearch 从版本 5.0 开始引入了 BM25 算法作为默认的文档评分(relevance scoring)算法。在此之前,Elasticsearch 使…

第 4 章 链表(1)

4.1链表(Linked List)介绍 链表是有序的列表,但是它在内存中是存储如下 小结: 链表是以节点的方式来存储,是链式存储每个节点包含 data 域, next 域:指向下一个节点.如图:发现链表的各个节点不一定是连续存储.链表分带头节点的链…

forEach时候,Exception in thread “AWT-EventQueue-0“ java.util.ConcurrentModificat

问题分析: 在很多容器中,都有一个变量记录你从结构上修改此容器的次数,叫做modCount,查看ArrayList的add()和remove()方法就可以发现,每次你调用add方法()向容器里面增加了一个元素,或者你调用Remove()方法…

每日一博 - MPP(Massively Parallel Processing,大规模并行处理)架构

文章目录 概述优点缺点小结 概述 MPP(Massively Parallel Processing,大规模并行处理)架构是一种常见的数据库系统架构,主要用于提高数据处理性能。它通过将多个单机数据库节点组成一个集群,实现数据的并行处理。 在 …

PAT 1018 Public Bike Management

个人学习记录,代码难免不尽人意。 There is a public bike service in Hangzhou City which provides great convenience to the tourists from all over the world. One may rent a bike at any station and return it to any other stations in the city. The Pu…

微服务基础概念【内含图解】

目录 拓展补充: 单体架构 分布式架构 面向服务的体系结构 云原生 微服务架构 什么是微服务? 微服务定义 拓展补充: 单体架构 单体架构:将业务的所有功能集中在一个项目中开发,最终打成一个包部署 优点&#x…

Hlang--用Python写个解释器

文章目录 前言流程数学解释器结果封装数的操作运行时异常运行解释实现总结前言 没错今天提前来做这个东西,昨天晚上干这个玩意差不多干了两个多小时才搞定,导致凌晨2点才睡觉,最要命的是,写着写着突然想到有一道线代理解错了,一个晚上,做梦全是这两个东西。尤其是晚上效…