《Git 简易速速上手小册》第3章:分支管理(2024 最新版)

news2024/11/28 10:44:19

在这里插入图片描述

文章目录

  • 3.1 创建与合并分支
    • 3.1.1 基础知识讲解
    • 3.1.2 重点案例:为 Python 项目添加新功能
    • 3.1.3 拓展案例 1:使用 Pull Requests (PRs) 在团队中合作
    • 3.1.4 拓展案例 2:解决合并冲突
  • 3.2 分支策略的最佳实践
    • 3.2.1 基础知识讲解
    • 3.2.2 重点案例:开发一个 Python Web 应用
    • 3.2.3 拓展案例 1:紧急修复生产错误
    • 3.2.4 拓展案例 2:准备发布
  • 3.3 解决分支冲突
    • 3.3.1 基础知识讲解
    • 3.3.2 重点案例:合并 Python 项目的特性分支
    • 3.3.3 拓展案例 1:使用 GUI 工具解决冲突
    • 3.3.4 拓展案例 2:使用 `git rebase` 处理冲突

3.1 创建与合并分支

在 Git 的多维宇宙中,分支让我们能够在不同的时间线上安全地开发新功能、修复 bug 或尝试新想法,而不会影响到主分支的稳定。理解如何有效地创建和合并分支,是每个使用 Git 的开发者都需要掌握的技能。

3.1.1 基础知识讲解

  • 创建分支:使用 git branch [branch-name] 创建一个新分支,但这个命令不会自动切换到新分支。要开始在新分支上工作,你需要使用 git checkout [branch-name] 切换到该分支。或者,你可以使用 git checkout -b [branch-name] 来创建并立即切换到新分支。
  • 合并分支:一旦在分支上完成了工作,你就可以通过 git merge [branch-name] 将其合并回主分支。这个命令应该在你想要合并到的目标分支上执行,通常是 mainmaster

3.1.2 重点案例:为 Python 项目添加新功能

假设你正在开发一个 Python 项目——一个简单的命令行待办事项应用。你决定添加一个新功能:允许用户为待办事项设置优先级。

步骤 1:创建新分支

git checkout -b feature-add-priority

在这个新分支上,你开始开发新功能。

步骤 2:编写代码

todo.py 中,你添加了新的代码来支持优先级设置:

def add_todo_with_priority(todo, priority):
    # 添加带有优先级的待办事项的逻辑
    pass

步骤 3:提交更改

完成开发后,你提交了更改。

git add todo.py
git commit -m "Add priority to todo items"

步骤 4:合并分支

现在,你准备将这个新功能合并回主分支。

git checkout main
git merge feature-add-priority

成功!你的新功能现在是应用的一部分了。

3.1.3 拓展案例 1:使用 Pull Requests (PRs) 在团队中合作

假设你的项目托管在 GitHub 上,你想要在团队中分享并审查这个新功能。

步骤 1:推送分支到远程仓库

git push origin feature-add-priority

步骤 2:创建 Pull Request

在 GitHub 上,对 feature-add-priority 分支创建一个新的 Pull Request,邀请你的团队成员对这个新功能进行审查。

通过 PR,你的团队可以在合并代码之前讨论、审查和测试这个新功能。

3.1.4 拓展案例 2:解决合并冲突

在你的 Pull Request 被审查的同时,另一个团队成员也对 todo.py 做了更改并已经合并到了 main 分支。当你尝试合并你的分支时,Git 报告了冲突。

步骤 1:更新本地 main 分支

git checkout main
git pull

步骤 2:在你的分支上执行合并

git checkout feature-add-priority
git merge main

Git 通知你 todo.py 有冲突。你打开文件,手动解决这些冲突,然后提交更改。

git add todo.py
git commit -m "Resolve merge conflict with main"
git push origin feature-add-priority

最后,你的 Pull Request 已经准备好被合并,而且没有任何冲突了。

通过这一章,你学会了如何在 Git 中创建和管理分支,以及如何在项目开发中有效利用分支来添加新功能和修复错误。记住,分支是你在代码宇宙中探索新领域的魔法棒,使用它们可以让你的开发工作变得更加高效和有条不紊。

在这里插入图片描述


3.2 分支策略的最佳实践

在 Git 的宇宙中,合理的分支策略就像是星际旅行的导航图,确保你能够在代码的海洋中航行而不迷失方向。分支策略的选择对于维持项目的结构清晰、提高团队协作效率、并加速开发流程至关重要。

3.2.1 基础知识讲解

  • 主分支(Main or Master):这是项目的主干,通常包含生产级的代码。所有的开发分支最终都会合并回这里。
  • 开发分支(Develop):用于日常开发的分支,这里是所有新特性、改进和 bug 修复的起点和终点。
  • 特性分支(Feature branches):从开发分支分出的,用于开发新特性或改进。每个特性分支集中解决一个具体问题,开发完成后合并回开发分支。
  • 修复分支(Hotfix branches):用于快速修复生产环境中的问题。它们从主分支分出,并在修复后直接合并回主分支和开发分支。
  • 发布分支(Release branches):当开发分支的当前状态准备发布时,从开发分支分出。用于准备发布版本,修复发现的最后时刻的 bug,完成后合并到主分支和开发分支。

3.2.2 重点案例:开发一个 Python Web 应用

假设你正在开发一个 Python Web 应用,计划采用 Git Flow 分支策略。

步骤 1:建立分支结构

首先,确保你有 maindevelop 分支。所有新特性都将从 develop 分支中分出。

git checkout -b develop
git push -u origin develop

步骤 2:开发新特性

你决定添加一个新的 API 端点。因此,你从 develop 分支创建一个新的特性分支。

git checkout -b feature-new-api develop

在这个分支上,你添加了新的 API 端点相关的代码:

# app.py
def new_api():
    return "New API Response"

完成后,将特性分支合并回 develop 分支。

git checkout develop
git merge feature-new-api

3.2.3 拓展案例 1:紧急修复生产错误

你的应用在生产中发现了一个严重的 bug。你需要立即修复它,因此你从 main 分支创建一个 hotfix 分支。

git checkout -b hotfix-fix-bug main

修复完成后,将 hotfix 分支合并回 maindevelop 分支,确保所有的改进都被纳入。

git checkout main
git merge hotfix-fix-bug
git checkout develop
git merge hotfix-fix-bug

3.2.4 拓展案例 2:准备发布

develop 分支准备好发布新版本时,你从 develop 分支创建一个 release 分支。

git checkout -b release-1.0.0 develop

release 分支上,你可能需要做一些最后的修复和准备工作。完成后,将 release 分支合并回 maindevelop 分支,并打上新版本的标签。

git checkout main
git merge release-1.0.0
git tag -a v1.0.0
git checkout develop
git merge release-1.0.0

通过实践这些分支策略,你不仅能保持项目的结构清晰,还能确保团队中的每个人都在正确的轨道上前进。记住,良好的分支策略是高效团队协作的基石,选择适合你团队和项目的策略,让你的开发过程像顺畅的河流一样流淌。

在这里插入图片描述


3.3 解决分支冲突

在 Git 的多维宇宙中,分支冲突就像是不同时间线的英雄遇到了意见分歧。虽然它们可能会阻碍我们的进程,但正确地解决冲突可以使我们的项目变得更加强大和一致。理解如何高效解决分支冲突是每个使用 Git 的开发者必须掌握的技能。

3.3.1 基础知识讲解

  • 冲突的成因:当两个分支对同一文件的同一部分进行了不同的修改,然后尝试合并这两个分支时,Git 无法自动决定哪个版本是正确的。这时,Git 会停止合并过程并标记出冲突的位置,等待人工解决。
  • 查看冲突:冲突的文件会被 Git 标记,并在文件中直接显示冲突的部分,通常会包含 <<<<<<<=======>>>>>>> 这样的标记。
  • 解决冲突:解决冲突需要开发者编辑冲突的文件,决定保留哪个版本的更改,或者结合两个版本的更改。解决完冲突后,需要将文件重新添加到暂存区并提交。

3.3.2 重点案例:合并 Python 项目的特性分支

假设你正在开发一个 Python 项目,项目中有一个 calculator.py 文件。你在 feature-add-function 分支上添加了一个加法函数,同时你的队友在 feature-subtract-function 分支上添加了一个减法函数。当你们尝试将这两个分支合并到 main 分支时,冲突发生了。

步骤 1:开始合并

你首先尝试合并你队友的分支:

git checkout main
git merge feature-subtract-function

合并成功,没有冲突。接着,你尝试合并你的分支:

git merge feature-add-function

这时,Git 报告 calculator.py 存在冲突。

步骤 2:解决冲突

打开 calculator.py,你看到了类似这样的内容:

<<<<<<< HEAD
def subtract(x, y):
    return x - y
=======
def add(x, y):
    return x + y
>>>>>>> feature-add-function

决定保留两个函数,并删除 Git 的标记:

def add(x, y):
    return x + y

def subtract(x, y):
    return x - y

步骤 3:完成合并

解决冲突后,你将更改添加到暂存区并提交:

git add calculator.py
git commit -m "Resolve merge conflict by including both add and subtract functions"

3.3.3 拓展案例 1:使用 GUI 工具解决冲突

许多 GUI Git 客户端和集成开发环境(IDE)如 Visual Studio Code 提供了可视化的冲突解决工具。这些工具可以直观地显示冲突,并允许你选择哪个版本要保留,或者编辑文件以结合两个版本的更改。

3.3.4 拓展案例 2:使用 git rebase 处理冲突

在某些情况下,git rebase 是一个比 git merge 更好的选择,特别是在你想要保持项目历史线性的时候。使用 rebase 时,如果遇到冲突,处理流程与 merge 类似,但每次解决冲突后,你会使用 git rebase --continue 而不是提交更改,直到 rebase 完成。

通过正确地解决分支冲突,你不仅保持了项目的一致性,还加深了对团队工作的理解。记住,冲突不是要避免的障碍,而是提高项目质量和团队协作的机会。

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

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

相关文章

如何使用 sqlalchemy declarative base 多层次继承

在SQLAlchemy中&#xff0c;通过declarative_base创建的基类可以通过多层次的继承建立继承关系。这允许你在数据库中创建具有继承结构的表。在我使用某数据库做中转的时候&#xff0c;经常会遇到各种各样的问题&#xff0c;例如下面的问题&#xff0c;通过记录并附上完美的解决…

【Spring原理高级进阶】有Redis为啥不用?深入剖析 Spring Cache:缓存的工作原理、缓存注解的使用方法与最佳实践

&#x1f389;&#x1f389;欢迎光临&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;特别推荐给大家我的最新专栏《Spring 狂野之旅&#xff1a;底层原理高级进阶》 &#x1f680…

系统架构25 - 软件架构设计(4)

软件架构复用 软件产品线定义分类原因复用对象及形式基本过程 软件产品线 软件产品线是指一组软件密集型系统&#xff0c;它们共享一个公共的、可管理的特性集&#xff0c;满足某个特定市场或任务的具体需要&#xff0c;是以规定的方式用公共的核心资产集成开发出来的。即围绕…

力扣题目训练(9)

2024年2月2日力扣题目训练 2024年2月2日力扣题目训练412. Fizz Buzz414. 第三大的数415. 字符串相加129. 求根节点到叶节点数字之和131. 分割回文串65. 有效数字 2024年2月2日力扣题目训练 2024年2月2日第九天编程训练&#xff0c;今天主要是进行一些题训练&#xff0c;包括简…

MogaNet实战:使用 MogaNet实现图像分类任务(二)

文章目录 训练部分导入项目使用的库设置随机因子设置全局参数图像预处理与增强读取数据设置Loss设置模型设置优化器和学习率调整策略设置混合精度&#xff0c;DP多卡&#xff0c;EMA定义训练和验证函数训练函数验证函数调用训练和验证方法 运行以及结果查看测试完整的代码 在上…

第二部分阶段总结

第二部分阶段总结 1.知识补充1.1 nolocal关键字1.2 yield from1.3 深浅拷贝 2.阶段总结3.考试题 1.知识补充 1.1 nolocal关键字 在之前的课程中&#xff0c;我们学过global关键字。 name rootdef outer():name "武沛齐"def inner():global namename 123inner()…

OpenMVG(特征匹配、照片组重建点云、GPS位置信息、GMS)

目录 1 图像的特征匹配 2 图像中提取GPS位置信息 2.1 写入GPS信息到图像中 2.2 读取带有GPS的图像 3 SIFT/AKAZE/AKAZE_MLDB特征提取对比 4 GMS Filter 5 将球形全景图转换为6个透视视图 6 照片组重建点云 1 图像的特征匹配 #include "openMVG/features/feature.…

算法-16-并查集

并查集简介 并查集&#xff1a;一开始&#xff0c;把a&#xff0c;b&#xff0c;c放入并查集&#xff0c;a自己一个集合&#xff0c;b自己一个&#xff0c;c自己一个 提供的方法 1.boolean isSameSet(a,b)&#xff0c;判断ab是否在同一个集合 2.void union(a,b),把a所…

红日靶场(初学)

按照以前的来说一般是有两层网络的内网和外网 这个也是这样的 所以需要两张网卡&#xff0c;一个用来向外网提供web服务&#xff0c;一个是通向内网 以下就是配置 以下就是一些相关信息 外网网段是写成了192.168.111.1/24 WEB PC DC kali 开始扫描 nmap -sS -sV -Pn -T4 19…

软件实例分享,茶楼收银软件管理系统,支持计时计费商品销售会员管理定时语音提醒功能

软件实例分享&#xff0c;茶楼收银软件管理系统&#xff0c;支持计时计费商品销售会员管理定时语音提醒功能 一、前言 以下软件教程以 佳易王茶社计时计费管理系统软件V18.0为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 问&#xff1a;这个软…

顶级思维方式——认知篇四(全局各个角度考虑结果)

目录 1、空城计司马懿看穿了吗 2、胡宗宪是彻底铲除倭寇、还是要特意留些残余&#xff1f; 3、 都是站在各自的利益、位置上分析问题 4、 识人 5、不要给别人陷害你的机会 6、 最高领导人/管理者&#xff0c;他需要 维护自己英明决策领导、高大形象 7、对领导的投其所好…

C#,数值计算,矩阵的行列式(Determinant)、伴随矩阵(Adjoint)与逆矩阵(Inverse)的算法与源代码

本文发布矩阵&#xff08;Matrix&#xff09;的一些初级算法。 一、矩阵的行列式&#xff08;Determinant&#xff09; 矩阵行列式是指矩阵的全部元素构成的行列式&#xff0c;设A(a)是数域P上的一个n阶矩阵&#xff0c;则所有A(a)中的元素组成的行列式称为矩阵A的行列式&…

【MySQL】待修改

外键约束 含义 外键&#xff1a;用来让两张表的数据之间建立连接&#xff0c;从而保证数据的完整性和一致性。 员工表emp&#xff08;子表&#xff09; idnameagejobsalaryentrydatemanageriddept_id1金庸66总裁200002000-01-01null52张无忌20项目经理125002005-12-05113杨…

栈和队列循环队列(C/C++)

本篇将用数组实现栈、链表实现队列以及使用数组实现循环队列&#xff0c;然后实现了用栈实现队列和用队列实现栈以及一些其他的栈和队列的习题&#xff0c;加深队栈和队列的理解。 若只看对应所需&#xff0c;可直接看文章旁的目录。 1.栈 1.1栈的概念及结构 栈&#xff1a;一…

8.JS中的== 操作符的强制类型转换规则

对于 来说&#xff0c;如果对比双方的类型不一样&#xff0c;就会进行类型转换。假如对比 x 和 y 是否相同&#xff0c;就会进行如下判断流程&#xff1a; 首先会判断两者类型是否相同&#xff0c;类型相同的话就比较两者的大小&#xff1b;类型不相同的话&#xff0c;就会进…

【lesson52】 线程概念

文章目录 线程学习前的了解知识理解线程 线程学习前的了解知识 线程在进程内部执行&#xff0c;是OS调度的基本单位 OS可以做到让进程对进程地址空间进行资源的细粒度划分 比如malloc一块内存空间&#xff0c;我们拿到的一般都是起始位置&#xff0c;但是最终位置我们一般都不…

突发!AI大牛Andrej Karpathy离开OpenAI

刚刚&#xff0c;AI大牛Andrej Karpathy官宣了一条重要消息&#xff1a;他昨天已经从OpenAI离职&#xff0c;不过这中间没有什么戏剧性冲突&#xff0c;他只是想去尝试一下自己的个人项目。 Karpathy在官宣离职的推文中写道&#xff0c;「是的&#xff0c;我昨天离开了OpenAI。…

base64------ “ )!@#$%^*( ”代换 “0-9”

“ )!#$%^&*( ”代换 “0-9” ——[安洵杯 2019]JustBase 题目&#xff1a; VGhlIGdlbxvZ#kgbYgdGhlIEVhcnRoJ#Mgc#VyZmFjZSBpcyBkb!pbmF)ZWQgYnkg dGhlIHBhcnRpY#VsYXIgcHJvcGVydGllcyBvZiB#YXRlci$gUHJlcVudCBvbiBFYXJ)aCBp biBzbxpZCwgbGlxdWlkLCBhbmQgZFzZW(!…

celery异步框架的使用

文章目录 celery的介绍celery的架构celery的快速使用celery 包结构celery 定时 异步 延迟任务django使用celery celery的介绍 celery是什么&#xff1f; -翻译过来是芹菜 -官网&#xff1a;https://docs.celeryq.dev/en/stable/ -吉祥物&#xff1a;芹菜 -分布式的异步任务框架…

计算机网络概述习题拾遗

学习目标&#xff1a; 自下而上第一个提供端到端服务的层次 路由器、交换机、集线器实现的功能层 TCP/IP体系结构的网络接口层对应OSI体系结构的哪两个层次 分组数量对总时延的影响 如果这篇文章对您有帮助&#xff0c;麻烦点赞关注支持一下动力猿吧&#xff01; 学习内容…