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

目录

一、Issue模板文件

[二、Pull Requests模板文件](#二、Pull Requests模板文件)

分支管理

[1. 理解分支](#1. 理解分支)

[2. 创建与管理分支](#2. 创建与管理分支)

[1. 切换分支与提交历史](#1. 切换分支与提交历史)

[2. 合并分支](#2. 合并分支)

[3. 删除分支](#3. 删除分支)

[4. 解决合并冲突](#4. 解决合并冲突)

[6. 查看分支合并情况](#6. 查看分支合并情况)

快速创建并切换分支

分支管理策略

分支合并模式

分支管理原则

日常开发环境

线上环境

测试流程

[Bug 分支管理](#Bug 分支管理)

[1. 遇到Bug时的处理方法](#1. 遇到Bug时的处理方法)

[2. 使用 git stash 暂存工作区内容](#2. 使用 git stash 暂存工作区内容)

[3. 创建并切换到Bug修复分支](#3. 创建并切换到Bug修复分支)

[4. 恢复之前的工作](#4. 恢复之前的工作)

[5. 注意事项](#5. 注意事项)

[6. 合并策略与冲突预防](#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 的分支功能来管理不同阶段和类型的开发工作流,是一种既便捷又高效的方法~

相关推荐
蚰蜒螟3 分钟前
java class类对象 加载时机
java·开发语言
wangyue45 分钟前
c# 服务中启动exe窗体程序
开发语言·microsoft·c#
_DCG_11 分钟前
c++之左值引用 右值引用 万能引用
java·开发语言·c++
是程序喵呀12 分钟前
JDK、JRE、JVM的区别
java·开发语言·jvm
sealaugh3222 分钟前
aws(学习笔记第二十一课) 开发lambda应用程序
笔记·学习·aws
互联网打工人no11 小时前
C# 事件机制
开发语言·c#
有馬公生1 小时前
Python中的闭包和装饰器
开发语言·python
Hacker_Nightrain1 小时前
[CSAW/网络安全] Git泄露+命令执行 攻防世界 mfw 解题详析
git·安全·web安全
【上下求索】1 小时前
学习笔记079——数据结构之【树】
数据结构·笔记·学习
獨枭1 小时前
Git 下载问题及解决方法
git