Git Merge 实例教学:同步代码库与处理分支冲突的最佳实践

news2024/11/13 8:52:10

文章目录

  • 前言
  • 一、git merge是什么?
  • 二、git merge基本用法
    • 1. 合并两个分支
    • 2. 合并时创建合并提交
    • 3. 快进合并(Fast-forward Merge)
    • 4. --abort参数
    • 5. --continue参数
    • 6. -X theirs参数
  • 三、实际例子
    • 1. 更新仓库
    • 2. 将origin/main分支合并到当前分支
    • 3. 解决冲突
    • 4. 推送到仓库
  • 总结


前言

在团队协作的开发过程中,Git 是不可或缺的版本控制工具。对于开发者来说,理解并熟练使用 git merge 命令尤为重要,尤其是在处理多个分支合并、解决冲突、保持代码一致性时。无论是合并新的功能分支,还是同步最新的代码库,git merge 都能帮助我们在开发过程中更高效地管理代码。这篇文章将详细介绍 git merge 的基本用法、常见参数及实际操作示例,希望能够为你在日常开发中的分支管理提供帮助。
在这里插入图片描述


一、git merge是什么?

git merge 是 Git 中用于将一个分支的修改合并到当前分支的命令。在 Git 中合并两个分支时会产生一个特殊的提交记录,它有两个 parent 节点。翻译成自然语言相当于:“我要把这两个 parent 节点本身及它们所有的祖先都包含进来。”

二、git merge基本用法

1. 合并两个分支

在这里插入图片描述
这个命令会将 bugFix 分支的修改合并到当前分支。如果有冲突,你需要手动解决冲突。

git merge bugFix

2. 合并时创建合并提交

默认情况下,git merge 会创建一个新的合并提交(merge commit)来记录合并操作。这种方式称为“合并提交”。
在这里插入图片描述

3. 快进合并(Fast-forward Merge)

如果当前分支是目标分支的直接祖先,Git 会执行快进合并,不会创建新的合并提交。目标分支指的是merge后面跟着的分支名,现在当前分支是bugFix,目标分支是main,下面的命令的意思是将main分支合并到当前分支

git merge --ff-only main

在这里插入图片描述

这样就不会出现合并提交,也就是不会有提交记录
在这里插入图片描述

使用 --ff-only 参数可以确保只有在快进合并的情况下才会合并,否则会失败。

4. --abort参数

如果在合并过程中遇到问题,或者决定不再进行合并,可以使用 git merge --abort 来取消合并操作。此命令会取消合并并恢复到合并之前的状态。

git merge --abort

注意: git merge --abort 只在合并冲突时有效。如果没有冲突或合并已完成,git merge --abort 不会有任何效果。

5. --continue参数

在解决完合并冲突后,你需要使用 git merge --continue 来继续合并操作,这是 Git 2.12 及更高版本引入的命令,专门用于继续进行被中断的合并操作。这个命令会继续未完成的合并过程,提交合并的结果。

git merge --continue

注意: git merge --continue 只在解决冲突后有效,且在有冲突的情况下才能使用。如果合并过程中没有冲突,这个命令不会有任何效果,也就是不需要运行--continue这个命令

6. -X theirs参数

当你对 目标分支 的改动更有信心,或者当你希望在冲突发生时优先保留 目标分支 的更改时,使用 -X theirs 可以简化合并过程。git merge-X theirs 参数是一种策略选项,用于自动解决合并冲突时更倾向于保留“目标分支”(即合并进来的分支)的更改。这是通过忽略“当前分支”的更改来实现的。
假设你在 main 分支上,你要将 feature 分支合并到 main 分支,如果 mainfeature 分支之间存在冲突,Git 会自动选择 feature 分支中的更改,并忽略 main 分支中的更改。

git merge -X theirs feature

注意:-X theirs 并不会全盘替换当前分支的所有内容,而是只在发生冲突时自动选择目标分支的更改。如果没有冲突,合并过程与正常的合并一样,不受 -X theirs 影响。该选项在合并过程中自动解决冲突,但使用时需要谨慎,因为它会导致你放弃当前分支中的冲突部分的更改。

-X ours: 相反的选项,它会在冲突时自动保留 当前分支 的更改,而忽略 目标分支 的更改。

三、实际例子

现在假设有两个分支,一个是现有的branch分支,一个是main主分支,当已经在branch分支上开发完新功能并且提交过了,但是你还想拉取 Git 仓库中main主分支中最新的代码也合并到你所在分支再进行提交并推送到 Git 仓库中,这种情况也是非常常见的,我们可以采取以下措施

1. 更新仓库

当远程仓库存在本地仓库没有的提交时,使用以下命令可以从远程仓库下载本地仓库中缺失的提交记录和更新远程分支指针(如 origin/main),更新本地最新的origin/main远程记录

git fetch

注意:git fetch 并不会改变你本地仓库的状态。它不会更新你的 main 分支,也不会修改你磁盘上的文件。也就是说不要以为执行了 git fetch 以后,本地仓库就与远程仓库同步了。它只是已经将进行这一操作所需的所有数据都下载了下来,但是并没有修改你本地的文件。

2. 将origin/main分支合并到当前分支

将本地的远程分支origin/dev给合并进到当前分支里面

git merge origin/dev

如果合并没有出现冲突(理想情况)那么就会出现一个编辑器的界面,提示合并完成,这时按下Ctrl+X就可以提出了,但是实际情况很有可能出现冲突,此时就要你手动处理冲突再继续进行合并了

3. 解决冲突

  1. 手动解决冲突

打开冲突的文件,手动编辑并解决冲突。冲突的标记如下:

<<<<<<< HEAD
// 当前分支的内容
=======
// 被合并分支的内容
>>>>>>> <branch>

如果git仓库连接了vscode的话,可以在左侧的源代码管理中的图形化界面解决冲突更方便,例如下面的

在这里插入图片描述

  1. 完成合并
    继续进行因为冲突而未完成的合并
git merge --continue

4. 推送到仓库

到这一步你的当前分支应该已经有了远程主分支最新的更改了,此时可以直接推送你开发完成的新功能到仓库里

git push

总结

通过这篇文章,我们深入了解了 git merge 的工作原理以及如何使用该命令来合并分支和处理冲突。掌握这些知识后,你可以更加自信地进行分支操作,确保团队协作中的代码合并顺利无误。无论是通过自动解决冲突的 -X theirs 选项,还是在遇到问题时使用 git merge --abort 来回滚操作,这些工具都可以帮助你在复杂的开发环境中游刃有余。希望本文能为你的 Git 使用经验锦上添花,让你在实际项目中更加高效地进行版本控制🌹

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

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

相关文章

podman安装过程记录

最近注意到podman兼容docker镜像包&#xff0c;于是好奇心的驱动下&#xff0c;研究了一下 本来以为podman的desktop跟docker一样&#xff0c;最后发现podman桌面版是轻量级的&#xff0c;还需要安装podman的服务&#xff08;当然&#xff0c;是支持直接通过它的桌面版来安装其…

Linux系统中用户、用户组及文件权限的常用知识汇总

Linux为多用户多任务的操作系统&#xff0c;文件权限管理十分重要&#xff0c;每一个文件都有很多属性&#xff0c;合理的权限设置&#xff0c;可以确保数据不被未授权的人员访问&#xff0c;同时也能提高系统安全性。 本文将介绍Linux系统中用户、用户组及文件权限的常用知识…

【C++二分查找 前缀和 】1292. 元素和小于等于阈值的正方形的最大边长

本文涉及的基础知识点 C二分查找 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 LeetCode1292. 元素和小于等于阈值的正方形的最大边长 给你一个大小为 m x n 的矩阵 mat 和一个整数阈值 threshold。 请你返回元素总和小于或等于阈值的正…

C++ 设计模式——策略模式

策略模式 策略模式主要组成部分例一&#xff1a;逐步重构并引入策略模式第一步&#xff1a;初始实现第二步&#xff1a;提取共性并实现策略接口第三步&#xff1a;实现具体策略类第四步&#xff1a;实现上下文类策略模式 UML 图策略模式的 UML 图解析 例二&#xff1a;逐步重构…

主成分分析SPSS步骤+Matlab程序

SPSS 导入数据 主成分分析 参数设置 选择要压缩的变量 输出结果 越陡说明信息差越大&#xff0c;反之信息差越小 导出数据 双击可以复制 粘贴到matlab 计算 Matlab clc,clear data readmatrix(例2.xlsx); %将数据保存在txt文件中 data zscore(data); %数据的标准化 …

使用java加载、调用onnx模型(二)

目录 1、摘要 2、实现过程 2.1、依赖 2.2、imread 2.3、contiguous函数 2.3.1、转化示例 2.3.3、核心代码 2.4、Flatten拉直 2.5、最终结果 3、完整代码 1、摘要 在上一篇文章中 使用java加载、调用onnx模型_onnx java-CSDN博客 发现使用Java加载调用模型的分类结…

计算组合数:从n个不同元素中,选k个元素的方式数量math.comb()

【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 计算组合数&#xff1a; 从n个不同元素中&#xff0c; 选k个元素的方式数量 math.comb() 请问关于以下代码表述正确的选项是&#xff1f; import math print("【执行】math.comb(3, 2)…

线性代数证明:把行列式的某一行(列)的k倍加到另一行(列),行列式的值不变

线性代数证明 把行列式的某一行&#xff08;列&#xff09;的k倍加到另一行&#xff08;列&#xff09;&#xff0c;行列式的值不变&#xff1a; 注意五角星的位置要用到另一条性质&#xff1a;若行列式的某一行&#xff08;列&#xff09;的元素都是两数之和&#xff0c;则可以…

Ajax笔记总结(Xmind格式):第一天

Xmind鸟瞰图&#xff1a; 简单文字总结&#xff1a; ajax知识总结&#xff1a; 网络的参考模型&#xff1a; 1.物理层&#xff1a;源设备到目的设备 底层传输就是比特流 2.数据链路层 进行电信号的处理 进行数据的分组 3.网路层 进行数据包的传递 进行不同网络的…

菱形继承和虚继承

菱形继承&#xff08;Diamond Inheritance&#xff09;是指在多重继承的情况下&#xff0c;某个类继承自两个类&#xff0c;而这两个类又都继承自同一个基类的情况。 在这个结构中&#xff0c;D 直接从 A 继承了 A 的所有特性&#xff0c;但通过 B 和 C 继承&#xff0c;这会导…

Avue实现动态查询与数据展示(附Demo)

目录 前言1. 基本知识2. Demo 前言 此框架为Avue-crud&#xff0c;推荐阅读&#xff1a; 【vue】avue-crud表单属性配置&#xff08;表格以及列&#xff09;Avue实现批量删除等功能&#xff08;附Demo&#xff09;Avue实现选择下拉框的多种方式Avue框架实现图表的基本知识 | …

凌晨突发!核心系统瘫痪,通过Signleton单例模式轻松搞定,但还是被裁员了...

&#x1f345; 作者简介&#xff1a;哪吒&#xff0c;CSDN2021博客之星亚军&#x1f3c6;、新星计划导师✌、博客专家&#x1f4aa; &#x1f345; 哪吒多年工作总结&#xff1a;Java学习路线总结&#xff0c;搬砖工逆袭Java架构师 &#x1f345; 技术交流&#xff1a;定期更新…

selenium底层原理详解

目录 1、selenium版本的演变 1.1、Selenium 1.x&#xff08;Selenium RC时代&#xff09; 1.2、Selenium 2.x&#xff08;WebDriver整合时代&#xff09; 1.3、Selenium 3.x 2、selenium原理说明 3、源码说明 3.1、启动webdriver服务建立连接 3.2、发送操作 1、seleni…

flink车联网项目:维表离线同步(第69天)

系列文章目录 3.3 维表离线同步 3.3.1 思路 3.3.2 示例 3.3.3 其他表开发 3.3.4 部署 3.3.1.1 将表提交到生成环境 3.3.1.2 添加虚拟节点 3.3.1.3 配置计算节点 3.3.1.4 添加虚拟结束节点 3.3.1.5 提交到生产环境 3.3.1.6 发布 3.3.1.7 运维中心 3.3.1.8 补数据 3.3.1.9 补数据…

c++进阶------多态

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

机器学习/数据分析--通俗语言带你入门线性回归(结合案例)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 前言 机器学习是深度学习和数据分析的基础&#xff0c;接下来将更新常见的机器学习算法注意&#xff1a;在打数学建模比赛中&#xff0c;机器学习用的也很多&a…

探索GitLab:从搭建到高效使用的实用指南

企业里为什么喜欢使用GitLab 一、GitLab简介二、搭建GitLab三、GitLab的权限管理3.1、用户注册3.2、创建用户组3.3、为用户组添加用户3.4、为工程添加访问权限 四、GitLab的code review五、团队知识管理六、总结 一、GitLab简介 GitLab是利用 Ruby on Rails 一个开源的版本管理…

Adobe Media Encoder ME 2023-23.6.6.2 解锁版下载安装教程 (专业的视频和音频编码渲染工具)

前言 Adobe Media Encoder&#xff08;简称Me&#xff09;是一款专业的音视频格式转码软件&#xff0c;文件格式转换软件。主要用来对音频和视频文件进行编码转换&#xff0c;支持格式非常多&#xff0c;使用系统预设设置&#xff0c;能更好的导出与相关设备兼容的文件。 一、…

网站怎么做敏感词过滤,敏感词过滤的思路和实践

敏感词过滤是一种在网站、应用程序或平台中实现内容审查的技术&#xff0c;用于阻止用户发布包含不适当、非法或不符合政策的内容。我们在实际的网站运营过程中&#xff0c;往往需要担心某些用户发布的内容中包含敏感词汇&#xff0c;这些词汇往往会导致我们的网站被用户举报&a…

JVM的组成

JVM 运行在操作系统之上 java二进制字节码文件的运行环境 JVM的组成部分 java代码在编写完成后编译成字节码文件通过类加载器 来到运行数据区,主要作用是加载字节码到内存 包含 方法区/元空间 堆 程序计数器,虚拟机栈,本地方法栈等等 随后来到执行引擎,主要作用是翻译字…