git rebase和merge区别

2023-11-09

一、概述

merge和rebase
标题上的两个命令:merge和rebase都是用来合并分支的。

这里不解释rebase命令,以及两个命令的原理,详细解释参考这里。

下面的内容主要说的是两者在实际操作中的区别。

1.1 什么是分支

分支就是便于多人在同一项目中的协作开发。比方说:每个人开发不同的功能,在各自的分支开发过程中互不影响,完成后都提交到develop分支。极大的提高了开发的效率。

1.2 合并分支

每个人创建一个分支进行开发,当开发完成,需要合并到develop分支的时候,就需要用到合并的命令。

1.3 什么是冲突

合并的时候,有可能会产生冲突。

冲突的产生是因为在合并的时候,不同分支修改了相同的位置。所以在合并的时候git不知道哪个到底是你想保留的,所以就提出疑问(冲突提醒)让你自己手动选择想要保留的内容,从而解决冲突。

标题二、merge和rebase的区别

2.1 区别

采用merge和rebase后,git log的区别,merge命令不会保留merge的分支的commit,rebase会保留所有的commit:
在这里插入图片描述
在这里插入图片描述

rebase会把你当前分支的 commit 放到公共分支的最后面,所以叫变基。就好像你从公共分支又重新拉出来这个分支一样。
举例:如果你从 master 拉了个feature分支出来,然后你提交了几个 commit,这个时候刚好有人把他开发的东西合并到 master 了,这个时候 master 就比你拉分支的时候多了几个 commit,如果这个时候你 rebase master 的话,就会把你当前的几个 commit,放到那个人 commit 的后面。
在这里插入图片描述
merge 会把公共分支和你当前的commit 合并在一起,形成一个新的 commit 提交

在这里插入图片描述
处理冲突的方式:

(一股脑)使用merge命令合并分支,解决完冲突,执行git add .和git commit -m’fix conflict’。这个时候会产生一个commit。
(交互式)使用rebase命令合并分支,解决完冲突,执行git add .和git rebase --continue,不会产生额外的commit。这样的好处是,‘干净’,分支上不会有无意义的解决分支的commit;坏处,如果合并的分支中存在多个commit,需要重复处理多次冲突。
git pull和git pull --rebase区别:git pull做了两个操作分别是‘获取’和合并。所以加了rebase就是以rebase的方式进行合并分支得到一条干净的分支流

 git pull = git fetch + git merge FETCH_HEAD 
 git pull --rebase =  git fetch + git rebase FETCH_HEAD  
git rebase --continue; 让 rebase 过程继续执行。
git rebase --abort; 发生代码冲突后,放弃合并,回到操作前的样子。

2.2 git merge 和 git merge --no-ff的区别

1、我自己尝试merge命令后,发现:merge 时并没有产生一个commit。不是说merge时会产生一个merge commit吗?

注意:只有在冲突的时候,解决完冲突才会自动产生一个commit。

如果想在没有冲突的情况下也自动生成一个commit,记录此次合并就可以用:git merge --no-ff命令,下面用一张图来表示两者的区别:

在这里插入图片描述
2、如果不加 --no-ff 则被合并的分支之前的commit都会被抹去,只会保留一个解决冲突后的 merge commit。

标题三、如何选择合并分支的方式

我的理解:主要是看哪个命令用的熟练,能够有效的管理自己的代码;还有就是团队用的是哪种方式。

我对于rebase比较熟悉,所以我一般都用rebase,但是现在的公司用的是merge --no-ff命令合并分支。所以,我在工作上就用merge,个人项目就用rebase。

也可以两者结合:

获取远程项目中最新代码时:git pull --rebase,这个时隐性的合并远程分支的代码不会产生而外的commit(但是如果存在冲突的commit太多就像上面说的,需要处理很多遍冲突)。

合并到分支的时候:git merge --no-ff,自动一个merge commit,便于管理(这看管理人员怎么认为了)

注意:
不要在公共分支使用rebase
本地和远端对应同一条分支,优先使用rebase,而不是merge
抛出问题:

为什么不要再公共分支使用rebase?
因为往后放的这些 commit 都是新的,这样其他从这个公共分支拉出去的人,都需要再 rebase,相当于你 rebase 东西进来,就都是新的 commit 了

1-2-3 是现在的分支状态
这个时候从原来的master ,checkout出来一个prod分支
然后master提交了4.5,prod提交了6.7
这个时候master分支状态就是1-2-3-4-5,prod状态变成1-2-3-6-7
如果在prod上用rebase master ,prod分支状态就成了1-2-3-4-5-6-7
如果是merge
1-2-3-6-7-8
… |4-5|
会出来一个8,这个8的提交就是把4-5合进来的提交
merge和rebase实际上只是用的场景不一样
更通俗的解释一波.
比如rebase,你自己开发分支一直在做,然后某一天,你想把主线的修改合到你的分支上,做一次集成,这种情况就用rebase比较好.把你的提交都放在主线修改的头上
如果用merge,脑袋上顶着一笔merge的8,你如果想回退你分支上的某个提交就很麻烦,还有一个重要的问题,rebase的话,本来我的分支是从3拉出来的,rebase完了之后,就不知道我当时是从哪儿拉出来的我的开发分支
同样的,如果你在主分支上用rebase, rebase其他分支的修改,是不是要是别人想看主分支上有什么历史,他看到的就不是完整的历史课,这个历史已经被你篡改了

常用指令

git rebase -i dev 可以将dev分支合并到当前分支

这里的”-i“是指交互模式。就是说你可以干预rebase这个事务的过程,包括设置commit message,暂停commit等等。

git rebase --abort 放弃一次合并

合并多次commit操作:

1 git rebase -i dev
2 修改最后几次commit记录中的pick 为squash
3 保存退出,弹出修改文件,修改commit记录再次保存退出(删除多余的change-id 只保留一个)
4 git add .
5 git rebase --continue
6 git push origin 开发分支
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

git rebase和merge区别 的相关文章

  • 如何让 git 和 copSSH 在正确的目录中查找密钥?

    我刚刚安装了 Windows 版 copSSH 当我启动它时 我得到一个目录C copSSH home Nick ssh其中有我的酒吧和私钥 当我通过 Cygwin bash 窗口访问此目录时 使用 ssh 用户 主机 我很高兴地登录了 但
  • web2py git 集成 - localhost 和 pythonanywhere

    我完全不知道如何将 Github 集成到 web2py 中 我在 USB 上安装了 web2py任何地方的Python http www pythonanywhere com web2py概述文档chapter3http web2py co
  • 主存储库和本地存储库在同一台机器上

    我是 Git 新手 我已经在 Linux 服务器中创建了一个主存储库 同一个服务器将由 5 组 每组 3 个用户 使用 我想为每个组创建一个本地存储库 小组成员又应该为每个人创建一个本地存储库 使用内容并将修改提交到小组的本地存储库 我该怎
  • Git refs/remotes/origin/master 没有指向有效的对象

    在上次合并到 Git 存储库的 master 分支后 我失去了克隆存储库的能力 Cloning into test repository remote Counting objects 126084 done remote Compress
  • 本地git,推送到tfs远程repo

    我厌倦了向我的队友解释使用 DVCS 相对于 CVCS 的好处 他们中的一些人害怕学习曲线 另一些人则看不出任何原因 因为对他们来说 这都是一样的 就我个人而言 我对 TFS 及其问题感到非常厌倦 每当我需要进行一些小的 修复 时 我都必须
  • 无法将 git add origin git@anything 与新的 git 目录一起使用

    我有一个项目 我正在生成许多提交 因此它占用的空间正在快速增长 由于我有一个 gitlab 页面来推送提交 因此我决定最好删除本地 git 目录中的这些旧提交 因为我始终可以从 gitlab 获取它们 为此 我只需删除本地 git 目录 然
  • EGit(Eclipse git 插件)可以使用 SSH 密钥代替用户名和密码吗?

    我需要提交的 git 中央存储库是使用 SSH 密钥配置的 我的用户名是jmglov 但是当我执行 git 操作时 例如git clone 我使用这个配置 jmglov kitiara cat git config remote origi
  • neo4j cypher更新现有节点或创建新节点

    我有一个包含大约 900 万个节点和 1200 万个关系的图 对于图中的每个节点 每个节点都有一个属性子集 这些属性通过标签形成节点的唯一标识 该图正在通过各种数据源进行更新 这些数据源会增加图中的现有节点 或者在节点不存在时创建新节点 我
  • ssh 连接超时

    我无法在 git 中 ssh 到 github bitbucket 或 gitlab 我通常会收到以下错误消息 如何避免它 输出 ssh T email protected cdn cgi l email protection i ssh
  • git checkout 到分支需要很长时间

    我使用的是 Ubuntu 17 10 并且使用 git 版本 2 14 1 每当我从 master 创建一个分支并尝试签出它 或从它签出到 master 时 都会花费大量时间 大约几分钟 有时接近 10 分钟 确实 我有几 GB 的数据 但
  • 无法从我的电脑上使用 traefik 后面的 gitlab 进行 git 克隆

    这是我的 gitlab 和 traefik 配置 version 3 7 services gitlab web image gitlab gitlab ce latest restart always hostname gitlab ro
  • git stash 删除最旧的存储(比如最旧的 5 个存储)

    如何在一个语句中删除最旧的存储 例如最旧的 5 个存储 而不是执行以下操作 git stash drop stash 3 git stash drop stash 4 git stash drop stash 5 git stash dro
  • 致命:无法将 HEAD 解析为有效引用

    我正进入 状态fatal Failed to resolve HEAD as a valid ref 每当我尝试承诺时 我努力了 echo ref refs heads master gt git HEAD 但它不起作用 也尝试过 git
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • 我在哪里? *(无分支)

    我已经熟悉了创建 合并和删除分支 我想知道我在哪里 这样我就不会将工作提交到错误的分支 我用git branch a看看我有哪些分支 我认为星号 显示我当前所在的分支 当我得到以下信息时 这意味着什么 no branch master or
  • 如何签出仅在“git ls-remote”中列出的分支?

    我遇到了无法切换到仅列出的分支的情况git ls remote 这是详细信息 我分叉了一个 github repoA 作为 repoB 创建了自己的分支并将其推送到 ComputerA 中的 repoB 在 ComputerB 中 我将分叉
  • 自动同步两个 git 存储库

    是否可以保持同步两个 Github 存储库 远程 的特定文件夹 有两个 github 存储库 repoA 和 repoB 这两个存储库都有名为 ABC 的文件夹以及其他独特的文件夹 如果repoA的文件夹ABC中的任何文件有更新 我想自动更
  • 为什么“git描述-dirty”在描述干净结帐时添加“-dirty”后缀?

    我刚刚发现 dirty选项git describe看起来它应该做一些非常有用的事情 即在输出中附加一个后缀git describe当工作树脏时 但是在我的一些存储库上似乎并非如此 git status On branch 8 30 noth
  • Pandas:merge_asof() 对多行求和/不重复

    我正在处理两个数据集 每个数据集具有不同的关联日期 我想合并它们 但因为日期不完全匹配 我相信merge asof 是最好的方法 然而 有两件事发生merge asof 不理想的 数字重复 数字丢失 以下代码是一个示例 df a pd Da
  • 为什么 git-svn 应该积极搜索旧历史?

    当我运行 git svn clone s 时发生了一些奇怪的事情 尽管以下信息告诉我们不要惊慌 但我想知道为什么会出现这种 svn 错误 为什么这个路径不存在 是被别人删除了吗 如果是 为什么 git svn 应该积极搜索旧历史记录 Ini

随机推荐

  • 【Unity学习笔记】[Unity中文课堂教程] C#中级编程代码

    Unity学习笔记 Unity中文课堂教程 C 中级编程代码 最近想补一补C 基础 Unity官方的C 中级编程教程质量很高 于是开个帖子把跟着敲 记录了部分价讲解和我自己的理解的代码存在这 原课程链接 添加链接描述 https www b
  • s3c2440上的nor flash启动与nand flash启动的区别

    nor flash启动与nand flash启动的区别 1 接口区别 NOR FLASH地址线和数据线分开 来了地址和控制信号 数据就出来 NAND Flash地址线和数据线在一起 需要用程序来控制 才能出数据 通俗的说 就是光给地址不行
  • vue基础之组件化及父子间通信

    基本组件拆分和嵌套 为了不是项目看起来复杂难懂 所以我们采用组件化开发 所有的组件单独放 在需要使用的地方嵌套即可 app vue
  • Vue组件嵌套和组件通信

    一 组件嵌套 组件嵌套 在一个组件中使用另一个组件 div div
  • Lodash中的_.cloneDeep(value) 深拷贝和_.clone(value) 浅拷贝

    Lodash 是一个一致性 模块化 高性能的 JavaScript 实用工具库 cloneDeep value 这个方法类似 clone 除了它会递归拷贝 value 注 也叫深拷贝 参数 value 要深拷贝的值 返回 返回拷贝后的值 例
  • 距离计算方法-聚类

    k 均值聚类算法的性能会受到所选距离计算方法的影响 所以 今天总结了一下有关距离计算的一些总结 如有错误 望大家指正 1 欧式距离是大家最熟悉的了 比如两点之间的距离的计算 可以写成向量的运算形式 工程中用的最多 2 曼哈顿距离 Manha
  • TypeScript学习(Never、辨析联合类型、索引签名)

    Never 程序语言的设计确实应该存在一个底部类型的概念 当你在分析代码流的时候 这会是一个理所当然存在的类型 TypeScript 就是这样一种分析代码流的语言 因此它需要一个可靠的 代表永远不会发生的类型 never 类型是 TypeS
  • 黑客常用的攻击手段

    黑客攻击手段分为非破坏性攻击和破坏性攻击两大类 非破坏性攻击一般只是为了扰乱系统的运行 并不盗窃系统资料 通常采用拒绝服务攻击或信息炸弹 破坏性攻击是以入侵他人电脑系统 盗窃系统保密信息 破坏目标系统的数据为目的的 下面介绍黑客常用的几种攻
  • YARN原理总结

    问题导读 1 hadoop1 x中mapreduce框架与yarn有什么共同点 2 它们有什么不同点 3 yarn中有哪些改变 4 yarn中有哪些术语 yarn是比较难懂的一个地方 也是很重要的一个组件 不止hadoop使用yarn sp
  • 局域网计算机无法配置网关,在内网中,为什么不设置“默认网关”计算机也能互相通讯?...

    在内网中不设置 默认网关 的计算机也能互相通讯 是因为在同一内网 同一VLAN同一子网 中两台计算机机之间是不需要通过默认网关来通信的 是通过交换机 或路由器 上的列表来匹配进行数据传输的 下面讲一下这样子的通信原理 一 PC A向PC C
  • 关键路径例题图表_计算题专题:关键路径法(CPM)

    关键路径法 Critical Path Method CPM 通过分析项目过程中哪个活动序列进度安排的总时差最少来预测项目工期的网络分析 产生目的 为了解决 在庞大而复杂的项目中 如何合理而有效地组织人力 物力和财力 使之在有限资源下以最短
  • 只出现一次的数字 LeetCode C++

    目录 题目描述 方法一 vector 方法二 set 方法三 异或 题目描述 给定一个非空整数数组 除了某个元素只出现一次以外 其余每个元素均出现两次 找出那个只出现了一次的元素 说明 你的算法应该具有线性时间复杂度 你可以不使用额外空间来
  • 爆库原理剖析

    一 方式 暴库的方式有多种多样 我知道的就有3种以上 常见的暴的方法有 5c类暴 conn asp暴 ddos暴等等 二 原理 5c 暴库法 它不是网页本身的漏洞 而是利用了 解码方式中的一个特性 如果 安全设置不周全 而网页设计者未考虑
  • 解决seaborn无法加载数据集错误

    欢迎关注笔者的微信公众号 问题描述 因研究需要 今天在了解seaborn 这个可视化框架 但是在第一行代码就报错了 好嘛 看看啥错 看到这我就知道大概啥问题了 国内网络对国外的网站很不友好 解决方案 解决方法也很简单 主要有以下三种 ke
  • 关于win7下styleSheet设置不成功

    为 QTreeWidget 设置 style sheet 当使用下面的语句时 在 Windows Vista 和 Windows 7 下是失败的 QTreeWidget selection background color rgb 51 1
  • Java怎样求解n的阶乘 n!(详解)

    n 是表示为自然数n的阶乘 即 n 1 2 3 n 2 n 1 n 如 9 9 8 7 6 5 4 3 2 1 阶乘也可以递归方式定义 0 1 n n 1 n 希望对您有所帮助 具体代码实现 import java util Scanner
  • 软件测试分类

    一 软件测试的分类 1 按开发阶段 单元测试 集成测试 系统测试 验收测试 2 按测试实施组织 第三方 3 按测试执行方式 静态测试 动态测试 4 按是否查看代码 黑盒测试 白盒测试 灰盒测试 5 按是否手工执行划分 手工测试 自动化测试
  • subList方法踩坑记录

    前言 现有一个简化的需求 假设有一个点位列表 1 2 4 5 现在需要将该列表从中间分成两份 序列1 1 2 序列2 4 5 分开后在序列1的末尾添加一个元素 3 变成 1 2 3 问题复现 在编写下面的测试代码运行后 结果并不是想要的 p
  • 这可能是,Flutter 中最“强悍”的内存泄漏检测方案......

    近两年来 无论是创新型应用还是老牌旗舰型应用 都在或多或少地使用 Flutter 技术 然而 目前 Flutter 业务团队反馈最普遍的问题是 Flutter 内存占用过高 Flutter 内存占用过高原因比较复杂 需另开一个主题才能说清楚
  • git rebase和merge区别

    一 概述 merge和rebase 标题上的两个命令 merge和rebase都是用来合并分支的 这里不解释rebase命令 以及两个命令的原理 详细解释参考这里 下面的内容主要说的是两者在实际操作中的区别 1 1 什么是分支 分支就是便于