在开发过程中使用 git rebase 还是 git merge

在开发过程中使用 git rebase 还是 git merge

  • Merge(合并)的优点和缺点
  • Rebase(变基)的优点和缺点
  • 总结:

Git merge 和rebase的目的是一样的,它们都是将多个分支合并成一个。
虽然他们最终的目标是一样的,但这两种方法实现的方式是不同的。那么我们应该用哪个呢?

这里我们有一个示例仓库,它有两个不同的分支:主分支和特性分支。我们想把它们融合在一起。让我们来看看如何使用这些方法来解决这个问题。
在这里插入图片描述

(1)使用 Merge
当你运行 git merge 时,你的 HEAD 分支会生成一个新的提交,并保留每个提交历史的祖先。
在这里插入图片描述
Fast forward merge是一种不创建提交的合并类型,会更新分支指针到上一次提交。

(2)使用 Rebase
Rebase是将一个分支的修改重写到另一个分支上,而不需要创建新的提交。

你在特性分支上的每一个提交,都会在主分支上创建一个新的提交。这看起来就像这些提交一直是写在主分支之上的一样。
在这里插入图片描述

Merge(合并)的优点和缺点

  • 优点
    使用简单,易于理解。
    保持源分支的原始上下文。
    源分支上的提交与其他分支的提交是分开的。
    可以保留提交历史。
  • 缺点

Rebase(变基)的优点和缺点

  • 优点
    代码历史是简化的、线性的、可读的。
    与许多独立的特性分支的提交历史相比,操作单个提交历史更容易。
    干净、清晰的提交信息可以更好地跟踪一个bug或何时引入的某个功能。可以避免众多的单行提交污染历史。
  • 缺点
    会更改历史提交时间,可能会丢失上下文。
    比起Merge,你需要更加小心的使用Rebase。

应该用Merge还是Rebase?
当你的团队对于rebase不熟悉时,那么git merge就是你的正确选择。

Merge允许保存任何给定功能的提交历史,而不必担心覆盖提交和改变历史。
它可以避免不必要的 git revert或reset。
另一方面,如果你更看重干净、线性的代码历史,那么git rebase是最合适的。这种方式可以避免不必要的提交,并保持更集中和线性的变化!

这里要注意的是,如果你不正确地重写了历史,可能会导致严重的问题,所以在使用Rebase时请确保知道你在做什么。

总结:

(1)本地开发分支拉取远程开发分支用rebase,
开发分支合并主干分支的时候用rebase(就是题主说的这些),
最后主干分支合并开发分支用merge,最后推送各分支。

(2)下游合并上游rebase,上游合并下游用merge

(3)简单来说,同分支开发用rebase,特别在git pull时应该–rebase。
不同分支其实merge就好,反正merge操作一般都在gitlab或者研发管理系统内进行。

【参考文章】
【1】你在开发过程中使用Git Rebase还是Git Merge?
https://zhuanlan.zhihu.com/p/260331030

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

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

相关文章

富足--改变固有的行为模式分清幻想与现实

科学不等于我们所说的科技。 科学研究就是把钱变成知识,⽽技术开发就是把知识变成钱,这样⼀说,⼤家就知道它们不是⼀回事了。 技术开发的⽬的或者说创新的⽬的 是赚钱,不是创造知识。 创新要基于现有的⼈类知识,或者…

leetcode73 矩阵置零

题目描述 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用原地算法。 输入:matrix [[1,1,1],[1,0,1],[1,1,1]] 输出:[[1,0,1],[0,0,0],[1,0,1]] 输入:matrix [[0,1,2,0],[3,4…

【Go】go mod初始化

遇到问题 创建go项目时使用 go mod init 命令提示如下错误: go: cannot determine module path for source directory /Users/easton/go/basic-go (outside GOPATH, module path must be specified) 解决方案一 这是因为go mod init 初始化项目时,需要…

【数据结构】单链表(一)

上一篇【数据结构】顺序表-CSDN博客 我们了解了顺序表,但是呢顺序表涉及到了一些问题,比如,中间/头部的插入/删除,时间复杂度为O(N);增容申请空间、拷贝、释放旧空间会有不小的消耗;增容所浪费的空间... 我们如何去解…

蓝桥杯刷题 二分-[99]分巧克力(C++)

题目描述 儿童节那天有 K 位小朋友到小明家做客。 小明拿出了珍藏的巧克力招待小朋友们。 小明一共有 N 块巧克力,其中第 i 块是 HiWi 的方格组成的长方形。 为了公平起见,小明需要从这 N 块巧克力中切出 K 块巧克力分给小朋友们。 切出的巧克力需要…

java数据结构与算法刷题-----LeetCode210. 课程表 II

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846 文章目录 深度优先遍历但不进行逆拓扑排序(不用栈)…

leetcode 343. 整数拆分

题目 给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k > 2 ),并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 示例 1: 输入: n 2 输出: 1 解释: 2 1 1, 1 1 1。 示例 2: 输入: n 10 输出: 36 解释: 1…

数据结构与算法 — 贪心算法

数据结构与算法 数据结构与算法是计算机科学中的两个核心概念,它们在软件开发和问题解决中起着至关重要的作用。 数据结构 数据结构是计算机中存储、组织和管理数据的方式,它能够帮助我们高效地访问和修改数据。不同的数据结构适用于不同类型的应用场…

记一次IP访问MySQL失败多次被自动锁定导致无法连接问题,解决方法只需一条SQL。

👩🏽‍💻个人主页:阿木木AEcru 🔥 系列专栏:《Docker容器化部署系列》 《Java每日面筋》 💹每一次技术突破,都是对自我能力的挑战和超越。 前言 今天下午还在带着耳机摸鱼&#xff…

获取当前的年、月、日、时、分、秒,并将这些信息用作保存 Excel 文件的前缀

要获取当前的年、月、日、时、分、秒,并将这些信息用作保存 Excel 文件的前缀,你可以使用 Python 的 datetime 模块来获取当前时间,并格式化时间字符串,然后使用 pandas 库将数据保存为 Excel 文件。示例代码: from d…

Netty的基本架构与组件

Netty实战精髓 前言 Netty的组成部分 1、Channel 2、Callback 3、Future ChannelFuture 提供多个附件方法来允许一个或者多个 ChannelFutureListener 实例,这个回调方法 operationComplete() 会在操作完成时调用。 4、Event和Handler 5、EventLOOP Netty 通过触发…

Objective-C学习笔记(block,协议)4.10

1.block:是一个数据类型,存储一段代码,代码可以有参数有返回值。 2.声明block: 返回值类型 (^block变量名称)(参数列表); int (^myblock) (int num1,int num2); 代码段格式:^返回值类型(参数列表){ 代码段 }; int (^m…

如何在极狐GitLab 启用依赖代理功能

本文作者:徐晓伟 GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。 本文主要讲述了如何在[极狐GitLab…

UG NX二次开发(C#)-使用UG NX的开发模板创建项目失败的原因和解决方案

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1、前言2、可能的原因与解决方案2.1 Visual studio安装不完整2.2 解决方案2.2.1 对于 .net 桌面开发2.2.2 使用C++的桌面开发2.2.3 通用Windows平台开发2.2.4 visual studio扩展开发2.2.5 单个组件…

C语言 获取系统时间

获取系统时间的函数 #define _TIMEBUFLEN (40) // 获取日志缓冲需要的大小 void GetSysTime(char* pTimeBuf, u32 dwSize) {if (pTimeBuf NULL){return;} #if defined(_MSC_VER)SYSTEMTIME sys { 0 };GetLocalTime(&sys);sprintf_s(pTimeBuf, dwSize, "%4d-%02d-%0…

SSH穿透ECS访问内网RDS数据库

处于安全考虑,RDS一般只会允许指定的IP进行访问,而我们开发环境的IP往往是动态的,每次IP变动都需要去修改RDS的白名单,为我们的工作带来很大的不便。 那么如何去解决这个问题? 假如我们有一台ESC服务器,E…

STC89C52学习笔记(八)

STC89C52学习笔记(八) 综述:本文讲述了LED点阵屏以及如何进行数据串行输入,并行输出。 一、LED点阵屏 1.介绍 LED点阵屏由多个LED组成,以矩阵形式排列(类似于矩阵键盘),像素一般…

Objective-C学习笔记(@property,id,instancetype)4.9

1.增强property:自动生成getter和setter方法的声明和实现。 原理:①自动声明私有属性②自动生成getter和setter方法的声明和实现。 property 数据类型 变量名 注意变量名要去掉下划线,如果同时重写getter和setter那么不回自动声明私有属性。…

【iOS ARKit】App 中嵌入 AR Quick Look

AR Quick Look 功能强大,但在应用中嵌入并使用它实现 AR体验却非常简单,如其他所有QuickLook使用一样,简单到只需要提供一个文件名就可以达到目标。 AR Quick Look 支持.usdz 和.reality 两种格式文件,如果在 Xcode 工程中引入了 …

CSS滚动条样式修改

前言 目前我们可以通过 CSS伪类 来实现滚动条的样式修改,以下为修改滚动条样式用到的CSS伪类: ::-webkit-scrollbar — 整个滚动条 ::-webkit-scrollbar-button — 滚动条上的按钮 (上下箭头) ::-webkit-scrollbar-thumb — 滚动条上的滚动滑块 ::-web…