[Pro Git#2] 分支管理 | branch fix_bug , feature | 处理合并冲突

news2025/1/2 16:44:40

目录

一、Issue模板文件

二、Pull Requests模板文件

分支管理

1. 理解分支

2. 创建与管理分支

1. 切换分支与提交历史

2. 合并分支

3. 删除分支

4. 解决合并冲突

6. 查看分支合并情况

快速创建并切换分支

分支管理策略

分支合并模式

分支管理原则

日常开发环境

线上环境

测试流程

Bug 分支管理

1. 遇到Bug时的处理方法

2. 使用 git stash 暂存工作区内容

3. 创建并切换到Bug修复分支

4. 恢复之前的工作

5. 注意事项

6. 合并策略与冲突预防

临时分支的删除

分支的重要性

删除未完成的feature分支

分支的实际应用价值


关于 gitee :

一、Issue模板文件
  • 当用户点击“新建Issue”时,会看到对应的模板消息。这个功能是为了让遇到问题的用户或开发者能够与当前仓库的维护人员进行有效的交流。

二、Pull Requests模板文件
  • 开发分支的选择
    • 对于我们开发者来说,通常不会直接在master分支上进行开发,而是在自己创建的分支(如dev)下进行开发工作。这样做可以避免直接对主代码库造成影响,确保master分支的稳定性。
  • 合并操作的风险
    • 开发完成后,当想要将dev分支的更改合并到master时,这个merge操作实际上是存在一定风险的。因为无法保证新开发的代码中没有bug,或者不会对现有的master代码产生不良影响。
  • 提交Pull Requests
    • 因此,实际操作中,我们不会让开发者直接进行dev分支的合并。相反,开发者需要提交一个Pull Requests(合并申请单)。在这个申请单里,开发者需要详细说明为什么要进行合并、做了哪些改动以及这些改动带来的好处等信息。
  • 审核过程
    • Pull Requests是给仓库管理员看的。管理员会对申请单中的内容进行审查,一旦同意了该请求,管理员就会在平台上(例如Gitee)执行合并操作,而不是由开发者自己来完成这一操作。这一步骤确保了所有合并到master分支的代码都经过了适当的审核,减少了引入错误的可能性。

sum

  • Issue用于问题报告和讨论
  • Pull Requests则作为代码合并前的重要审核步骤,保障了master分支的稳定性和安全性。

分支管理

1. 理解分支

Git 的杀手级功能之一是分支。通过分支,Git 允许用户在不影响主代码库的情况下探索新的想法或修复错误。这就好比在一个武侠故事中,你能够使用分身术来同时学习不同的武艺,最后将所有技能合为一体以获得竞争优势。

  • 主线(master主分支):当你初始化一个Git仓库时,默认会创建一个名为 master 的主分支。这个分支可以被视为项目的主要发展线,所有最新的稳定版本都存于此。
  • HEAD指针:它是一个指向当前分支的指针,默认情况下指向 master 分支。HEAD的作用在于标识当前工作的分支,并且可以灵活地指向任何分支。

2. 创建与管理分支

为了更有效地开发和测试新功能,我们可以从主分支创建新的分支,进行独立的工作,然后在适当的时候合并回主分支。

  • 查看本地分支
    • 使用命令 git branch 可以列出所有的本地分支。带有星号(*)标记的分支表示当前正在工作的分支。
  • 创建新分支
    • 使用命令 git branch [分支名] 来创建一个新的分支。需要注意的是,创建新分支并不会自动切换到该分支下工作,新分支的起始点为当前分支的最新提交。
  • 切换分支
    • 若要开始在新创建的分支上工作,需要将HEAD指针移动到目标分支,可以通过命令 git checkout [分支名] 实现。此操作后,你在该分支上的所有改动都将被追踪并记录在此分支的历史中。

1. 切换分支与提交历史
  • 切换回dev分支:当我们切回到 dev 分支时,发现之前在该分支上添加的一行代码仍然存在。这是因为我们在 dev 分支进行了新的提交,而这些改动尚未合并到 master 分支。

  • 查看提交历史:通过检查 dev 分支的最新提交ID,并打印其前一个提交ID,我们发现它正好是创建 dev 分支时 master 分支的最新提交ID。这表明我们在 dev 分支上进行了额外的提交,因此 dev 指向了更新的提交记录,而 master 保持不变。

2. 合并分支
  • 合并准备:如果想要在 master 分支看到 dev 分支上的新增代码,我们需要将两个分支进行合并。为此,必须先切换到 master 分支,然后执行合并命令。
  • 合并命令
    • git merge [分支名]:用于合并指定分支到当前分支。
  • Fast-forward模式:当执行合并时,Git可能采用快进(Fast-forward)模式直接将 master 分支指针移动到 dev 分支的最新提交位置,因为从 masterdev 的路径上没有分叉。这使得合并过程非常快速且简单。
  • 结果验证:合并完成后,可以在 master 分支上查看 test 文件,确认新增的一行代码已经成功加入。

合并后master分支和dev分支一样指向最新提交的commit id

3. 删除分支
  • 删除条件:一旦完成任务并且合并了分支,原分支(如 dev)就不再需要,可以安全地删除。
  • 删除命令
    • git branch -d [分支名]:用于删除本地分支。需要注意的是,你不能删除当前所在的分支,也不能删除未完全合并的分支,除非使用 -D 强制删除。
  • 最佳实践:由于创建、合并和删除分支的操作非常快捷,Git鼓励为每个任务创建独立的分支,完成后立即合并 并删除,以保持工作流的安全性和整洁性。
4. 解决合并冲突
  • 冲突情景:在实际开发中,不同分支可能对同一文件进行了不同的修改,导致合并时出现冲突。例如,dev1master 分支都修改了 test 文件中的同一行。

实验:
先在 dev 下,尝试操作

切换到master分支,也去修改,然后提交

下面是此时的仓库状态

然后我们让master merge dev分支,两个分支 两次 commit 的内容就会发生冲突。

合并 test 文件冲突,我们需要手动解决冲突然后将结果在进行提交。

  • 解决冲突:Git会标记出冲突区域,用特殊符号(如 <<<<<<<, =======, >>>>>>>)来区分不同分支的修改内容。开发人员需要手动决定保留哪一部分或如何整合这两部分代码。

  • 合并后提交:解决冲突后,需要再次提交更改,以完成合并过程。这是非常重要的一步,确保所有更改都被正确记录下来。

操作 思路:

6. 查看分支合并情况
  • 带参数的git log命令
    • git log --graph --pretty=oneline --abbrev-commit:这个命令可以图形化地显示提交历史,包括分支的合并情况,帮助更好地理解项目的历史发展。

快速创建并切换分支
  • 组合命令
    • git checkout -b [分支]:这条命令能够一次性完成创建新分支和切换到该分支的操作,简化了流程。

分支管理策略

分支合并模式
  • Fast forward 模式
    • 在通常情况下,当Git进行分支合并时,如果不存在冲突并且线性历史允许,它会采用 Fast forward(快进)模式。这种模式下,Git不会创建新的合并提交,而是简单地将当前分支的指针移动到被合并分支的最新提交位置。
    • 使用Fast forward模式的优点是简洁的历史记录,但它有一个缺点:一旦删除了分支,从历史中就无法看出分支的存在和合并的过程。
  • 普通合并模式
    • 当存在冲突或使用 --no-ff 参数强制禁用 Fast forward 模式时,Git会在合并时生成一个新的提交,明确记录此次合并操作。
    • 这种模式的好处是在分支历史上可以清晰地看出分支信息以及合并点,即使在分支被删除之后也能追溯到曾经的合并活动。
    • 命令示例:
git merge --no-ff -m "描述信息" [分支名]
  • 推荐做法:为了保持项目历史的清晰和可追踪性,合并我们建议不要使用Fast-forward,而使用no-ff。这样做可以确保每次合并都被明确记录下来,有助于团队协作和后续的问题排查。

ff:

图示:


分支管理原则
  1. master分支稳定性
    • master 分支应当保持非常稳定,主要用于发布新版本。日常开发工作不应该直接在这个分支上进行,以确保其始终处于可部署状态。
  1. dev分支作为开发主线
    • 日常开发工作应在 dev 分支上进行。这个分支可以包含不稳定的变化和实验性的功能。
    • 当准备发布一个新版本时,dev 分支合并到 master 分支,并在 master 上打标签标识版本号。
  1. 个人分支与团队合作
    • 团队成员应基于 dev 分支创建自己的特性分支来完成特定任务或实现新功能。每个成员都可以自由地在各自的分支上工作,然后定期将更改合并回 dev 分支。
    • 这样一来,团队合作的分支结构就会形成一个主干(dev),周围环绕着多个临时分支,代表不同的开发活动或特性实现。

sum:

日常开发环境
  • 开发人员提交的代码,还未经过测试验证
  • 不稳定,存在bug
  • dev分支
线上环境
  • APP、网站
  • 稳定
  • master主分支
测试流程
  • 经过一系列测试,最终将稳定的代码合并到master上

Bug 分支管理

1. 遇到Bug时的处理方法

  • 场景描述:假设你正在 dev2 分支上进行开发,但突然发现 master 分支存在一个需要立即修复的bug。根据最佳实践,不应该直接在 master 分支上修复问题,而是应该创建一个专门用于修复bug的临时分支。
2. 使用 git stash 暂存工作区内容
  • 暂存当前工作:当你在 dev2 分支的工作尚未完成且无法提交时,可以使用 git stash 命令将当前工作区的信息储藏起来。这允许你在不提交的情况下切换分支,并确保稍后可以恢复这些更改。
    • git stash:执行此命令后,Git会保存所有已经被追踪文件的修改,例如对 README 文件所做的编辑。

  • 检查stash内容
    • git stash list:查看当前存储的所有stash记录,确认哪些改动被保存。
3. 创建并切换到Bug修复分支
  • 创建bug分支:从 master 分支创建一个新的分支来专门解决发现的问题。比如修复 README 文件中缺失的“222”导致的bug。
    • 完成修复后,记得提交更改并合并回 master 分支。

4. 恢复之前的工作
  • 恢复工作区状态:修复完bug之后,你需要回到 dev2 分支继续未完成的工作。由于之前使用了 git stash,你现在可以通过 git stash pop 来恢复之前的工作区状态。这不仅恢复了你的改动,同时也清除了stash记录。
    • git stash pop:恢复最新的stash记录并将其从stash列表中删除。

5. 注意事项
  • 分支间的差异:需要注意的是,即使你在 dev2 分支上恢复了之前的工作,它仍然基于修复bug之前的 master 状态,因此 dev2 分支不会包含修复后的代码。但这不影响你在 master 上所做的修复。
6. 合并策略与冲突预防
  • 我们的最终目的是要让 master 合并 dev2 分支的,那么正常情况下我们切回 master 分支直接合并即可,但这样其实是有一定风险的。
  • 是因为在合并分支时可能会有冲突,而代码冲突需要我们手动解决(在 master 上解决)。我们无法保证对于冲突问题可以正确地一次性解决掉,因为在实际的项目中,代码冲突不只一两行那么简单,有可能几十上百行,甚至更多,解决的过程中难免手误出错,导致错误的代码被合并到 master 上。此时的状态为:

  • 解决这个问题的一个好的建议就是:最好在自己的分支上合并下 master ,再让 master 去合并dev ,这样做的目的是 有冲突可以在本地分支解决并进行测试,而不影响 master 。此时的状态为:

  • 这样做可以在本地安全地解决任何可能出现的冲突,并确保最终合并到 master 的代码是稳定可靠的。

临时分支的删除

分支的重要性
  • 在软件开发过程中,新功能的添加是一个持续不断的需求。为了确保主分支(通常是 mainmaster)的稳定性,不会因为实验性质的代码而受到影响,每开发一个新的功能时
  • 建议创建一个独立的分支,通常称之为 feature 分支
  • 这个分支用于隔离新功能的开发工作,直到该功能完成并经过测试后,再将其合并回主分支。之后,可以安全地删除 feature 分支,以保持仓库的整洁。

删除未完成的feature分支

  • 然而,有时候项目需求会发生变化。例如,如果你正在某个 feature 分支上开发新功能,但中途被要求停止开发——这可能是由于优先级的变化或其他原因——那么即使这部分工作尚未完成或合并,也需要删除这个 feature 分支。
  • 在这种情况下,使用常规的 git branch -d 命令是不够的,因为它只允许删除已经被合并过的分支。对于未合并的分支,你需要使用强制删除命令:
git branch -D [分支名]

此命令会立即删除指定的分支,无论它是否已经合并。

分支的实际应用价值
  • 分支机制为开发者提供了极大的灵活性和安全性。假设你着手开发一个预计需要两周才能完成的新功能,在开发的第一周内你可能只完成了50%的工作。
  • 此时,如果你直接在主分支上提交不完整的代码,可能会干扰团队中其他成员的工作;相反,如果你等到全部完成后再一次性提交,又面临着丢失每日进度的风险。
  • 通过创建个人专属的分支,你可以自由地进行开发,不受他人工作的干扰,同时也不会影响到别人。你可以随时提交更改,保护每天的工作进度。一旦开发完成并通过了必要的审查和测试,就可以将你的分支合并回主分支。

这种方式不仅保证了代码库的安全性,也提高了团队协作效率。

此外,Git 的分支操作非常高效,无论是创建、切换还是删除分支,都能在一秒钟内完成,不论版本库包含多少文件。

利用 Git 的分支功能来管理不同阶段和类型的开发工作流,是一种既便捷又高效的方法~

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

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

相关文章

Acwing 基础算法课 数学知识 筛法求欧拉函数

【G09 筛法求欧拉函数】https://www.bilibili.com/video/BV1VP411p7Bs?vd_source57dbd16b8c7c2ad258cccce5966c5be8 闫总真是把听者当数学系转cs的来讲&#xff0c;菜逼完全听不懂&#xff0c;只能其他地再搜 欧拉函数 φ ( n ) \varphi(n) φ(n)&#xff1a;1~n中与n互质的数…

SpringCloudAlibaba技术栈-Higress

1、什么是Higress? 云原生网关&#xff0c;干啥的&#xff1f;用通俗易懂的话来说&#xff0c;微服务架构下Higress 就像是一个智能的“交通警察”&#xff0c;它站在你的网络世界里&#xff0c;负责指挥和调度所有进出的“车辆”&#xff08;也就是数据流量&#xff09;。它的…

# 光速上手 - JPA 原生 sql DTO 投影

前言 使用 JPA 时&#xff0c;我们一般通过 Entity 进行实体类映射&#xff0c;从数据库中查询出对象。然而&#xff0c;在实际开发中&#xff0c;有时需要自定义查询结果并将其直接映射到 DTO&#xff0c;而不是实体类。这种需求可以通过 JPA 原生 SQL 查询和 DTO 投影 来实现…

智能故障诊断和寿命预测期刊推荐

往期精彩内容&#xff1a; Python-凯斯西储大学&#xff08;CWRU&#xff09;轴承数据解读与分类处理 基于FFT CNN - BiGRU-Attention 时域、频域特征注意力融合的轴承故障识别模型-CSDN博客 基于FFT CNN - Transformer 时域、频域特征融合的轴承故障识别模型-CSDN博客 P…

MTK抓log方法log机制以及如何抓取log

目录 离线log抓取&#xff1a; adb命令打开mtklog的方法 &#xff1a; 实时log抓取&#xff1a; 设置log等级和打开平台log: 实时抓取&#xff0c;两种方式&#xff1a; Kernel Log: LOG 优先级 logcat 离线log抓取&#xff1a; 1.手机先进入开发者模式 2.进入拨号页面…

人工智能与云计算的结合:如何释放数据的无限潜力?

引言&#xff1a;数据时代的契机 在当今数字化社会&#xff0c;数据已成为推动经济与技术发展的核心资源&#xff0c;被誉为“21世纪的石油”。从个人消费行为到企业运营决策&#xff0c;再到城市管理与国家治理&#xff0c;每个环节都在生成和积累海量数据。然而&#xff0c;数…

如何在 Ubuntu 22.04 上安装 Varnish HTTP 教程

简介 在本教程中&#xff0c;我们将学习如何在 Ubuntu 22.04 服务器上安装和配置 Varnish HTTP。 Varnish 是一款高性能的 HTTP 加速器&#xff0c;旨在提高内容密集型动态网站的速度。它通过将网页缓存在内存中来工作&#xff0c;从而减少 Web 服务器的负载&#xff0c;并显…

AI辅助编码提高病案首页主要诊断编码正确率数据优化方法(2025增量优化版附python源代码)

一、引言 1.1 研究背景与意义 在医疗信息化进程中,病案首页作为病历信息的核心浓缩,承载着疾病分类、医疗统计、医保结算等关键任务,其主要诊断编码的准确性至关重要。准确的编码不仅是医疗质量评估、科研数据分析的基石,更是合理分配医疗资源、保障医保精准支付的关键依…

CSES-1135 Distance Queries

题目传送门https://vjudge.net/problem/CSES-1135#authorGPT_zh 解题思路 题目让我们求树上两个点的距离。 那么就可以转化为两点到其 LCA 的距离之和。 代码 #include<bits/stdc.h> using namespace std;int n,q; vector<int> g[200001]; int dis[200001],dep…

「Mac畅玩鸿蒙与硬件49」UI互动应用篇26 - 数字填色游戏

本篇教程将带你实现一个数字填色小游戏&#xff0c;通过简单的交互逻辑&#xff0c;学习如何使用鸿蒙开发组件创建趣味性强的应用。 关键词 UI互动应用数字填色动态交互逻辑判断游戏开发 一、功能说明 数字填色小游戏包含以下功能&#xff1a; 数字选择&#xff1a;用户点击…

001__VMware软件和ubuntu系统安装(镜像)

[ 基本难度系数 ]:★☆☆☆☆ 一、Vmware软件和Ubuntu系统说明&#xff1a; a、Vmware软件的说明&#xff1a; 官网&#xff1a; 历史版本&#xff1a; 如何下载&#xff1f; b、Ubuntu系统的说明&#xff1a; 4、linux系统的其他版本&#xff1a;红旗(redhat)、dibian、cent…

【NebulaGraph】变化的多跳查询

【NebulaGraph】变化的多跳查询 1. 需求2. 解决方案2.1 确定查询结构2.2 构建查询语句 3. 追加需求&#xff1a;如果增加每一跳都要指定查询某SPACE下的Tag&#xff0c;或者不查询某个Tag怎么办 1. 需求 存在多跳请求&#xff0c;其中每一跳是从上一跳查询结果为基础的。但是 …

【Compose multiplatform教程06】用IDEA编译Compose Multiplatform常见问题

当我们从Kotlin Multiplatform Wizard | JetBrains 下载ComposeMultiplatform项目时 会遇到无法正常编译/运行的情况&#xff0c;一般网页和桌面是可以正常编译的&#xff0c; 我这里着重解决如下问题 1:Gradle版本不兼容或者Gradle连接超时 2:JDK版本不兼容 3:Gradle依赖库连…

如何利用无线路由器实现水泵房远程监测管理

水泵站广泛部署应用在工农业用水、防洪、排涝和抗旱减灾等方面&#xff0c;如果水泵站发生异常&#xff0c;往往会对生产生活造成诸多损失&#xff0c;甚至引发安全事故。因此&#xff0c;建立一套高效、可靠的泵站远程监测管理系统至关重要。 方案背景 目前&#xff0c;我国大…

vue3学习笔记(9)-pinia、storeToRefs、getters

1.新的集中式状态&#xff08;数据&#xff09;管理库&#xff0c;redux vuex pinia 搭建 2.ref拆包 如果在reactive里面定义ref&#xff0c;则打印c时&#xff0c;无需.value 他自动拆包&#xff0c;如果直接在外面定义的ref则需要.value,他没有拆包 3.pinia存储读取数据 存…

【Qt】容器控件、布局管理控件

目录 容器控件 QGroupBox QTabWidget 布局管理控件 QVBoxLayout 例子&#xff1a; QHBoxLayout 例子&#xff1a; QGridLayout 例子&#xff1a; 例子&#xff1a; QFormLayout 例子&#xff1a; QSpacerItem 例子&#xff1a; 容器控件 QGroupBox 表示一个带有…

计算机的错误计算(一百九十六)

摘要 用两个大模型计算 arccos(0.444). 结果保留 4位有效数字。两个大模型的计算结果相同&#xff0c;并均有误差。 例1. 计算 arccos(0.444). 结果保留 4位有效数字。 下面是与一个大模型的对话。 以上为与一大模型的对话。 下面是与另一大模型的对话。 点评&#xff1a; &…

Unity开发微信小游戏踩坑总结

前言 不记录真记不住&#xff0c;这个帖子以后不定时更新。 问题1&#xff1a;图片模糊 问题描述&#xff1a; 在Unity里什么事没有&#xff0c;进入到微信开发者工具里就已经模糊了&#xff0c;人物动画是一团马赛克&#xff0c;图片看着倒是没事。 问题原因&#xff1a;…

Python爬虫教程——7个爬虫小案例(附源码)_爬虫实例

本文介绍了7个Python爬虫小案例&#xff0c;包括爬取豆瓣电影Top250、猫眼电影Top100、全国高校名单、中国天气网、当当网图书、糗事百科段子和新浪微博信息&#xff0c;帮助读者理解并实践Python爬虫基础知识。 包含编程资料、学习路线图、源代码、软件安装包等&#xff01;【…

kafka小实站

需要先在前面的文章里面照着下载好kafka&#xff0c;并且启动 先启动zookeeper 项目目录 package kafka; import lombok.extern.slf4j.Slf4j; import org.apache.kafka.clients.consumer.ConsumerRecord; import org.springframework.kafka.annotation.KafkaListener; import…