如何使用 Git 进行多人协作开发(全流程图解)

news2025/2/24 6:07:27

文章目录

    • 分支管理策略
      • 1.什么是Feature Branching?
      • 2.Feature Branching如何工作?
    • 多人协作一:单分支
      • 1.准备工作
      • 2.创建分支
      • 3.在分支上开发
      • 4.分支合并
      • 5.清理
    • 多人协作二:多分支
      • 1.创建分支
      • 2.在分支上开发
      • 3. pull request
      • 4.清理

 在软件开发中,多人协作是一项必不可少的任务。而 Git 作为目前最受欢迎的分布式版本控制工具,提供了强大的功能和灵活的工作流程,使得多人协作开发变得更加高效。本篇博客将带你实践如何正确使用 Git 进行多人协作开发
 在本篇博客中,你将学到以下内容:

  1. Feature Branching 分支管理策略
  2. 多人单分支开发与多人多分支开发的差别
  3. 如何安全的解决合并冲突

分支管理策略

 Git分支策略允许开发人员在一个项目上进行协作,同时跟踪更改并维护多个版本的代码库。主流的分支管理策略有 Trunk-Based DevelopmentFeature BranchingGit Flow等等,本文将基于较为简单的 Feature Branching 分支管理策略展开。虽然分支管理策略多种多样,但最好的策略一定是与你的团队特征和项目需求相匹配的。

1.什么是Feature Branching?

 在实际开发中,master 分支非常强调环境的稳定性。因此当我们要开发新的功能或者特性时,需要从 master 分支上拉取 feacture 分支,这样开发者就能在 feacture 分支上独立开发而不影响主分支。当完成开发后,需要提交 pull requestfeacture 分支合并回 master 分支中。 通过 pull request ,仓库中的其他成员能对即将 merge 的代码进行审核并提出建议,从而保证了安全可靠性。
在这里插入图片描述

2.Feature Branching如何工作?

  1. 创建 feacture 分支:feacture 分支一定是从 master 分支上拉取的
  2. feacture 分支上完成开发:通常一个分支就对应着一个特定的功能
  3. 提交 pull request:请求将分支合并回 master 分支
  4. 审查批准:其他开发人员如果对你的代码满意的话,就会同意将你的分支合并到 master 分支。通过代码审查,我们通常能在分支 merge 回主分支前发现错误
  5. 清理:完成开发后,应该及时将没用的 feacture 分支删除,保持代码仓库的整洁

 下面将结合具体的例子为大家逐步骤实践上面的流程,同时带大家体会多人在单分支上开发和在多分支上开发的区别

多人协作一:单分支

  • 任务:开发者A和开发者B在同一分支 feacture 下开发。开发者A在 README 中增加一行 aaa,开发者B在 README 中增加一行 bbb

1.准备工作

  • 场景:开发者A事先克隆过远程仓库,开发者B则在创建分支后才克隆远程仓库
    在这里插入图片描述
    在这里插入图片描述

  • 在实际开发中,如果要进行多人协作开发,首先需要将其他成员添加进来
    在这里插入图片描述

2.创建分支

创建分支的方式有两种:

  • 在远程仓库直接创建
  • 在本地创建分支 xxx 后使用指令 git push origin xxx 在远端创建一个与本地 xxx 分支对应的 xxx 分支
  1. 在单分支场景中,我们首先采用方法一创建分支
    在这里插入图片描述
    在这里插入图片描述
  2. 使用指令 git branch -r 指令可以查看远程仓库中的所有分支,但是对于开发者A而言只能看到 master 分支
    在这里插入图片描述
  3. 原因也不难理解,开发者A是在创建 feacture 分支前克隆远程仓库的,因此当前是落后与远程仓库的最新版本。我们需要使用 git pull 指令来更新分支信息:
    在这里插入图片描述

🎯[说明]:
git pull 指令具有以下两个作用:

  1. 拉取远程分支中的最新提交,并自动合并 (需要建立追踪关系
  2. 更新远程仓库的分支信息(不需要建立追踪关系)


 如何理解建立追踪关系呢?git pull 指令的完整用法是 git pull <远程主机名> <远程分支名>:<本地分支名>,当我们完整使用 git pull 指令时,不需要考虑建立追踪关系的问题,而当我们简写为 git pull 时,本地分支默认为当前的工作分支,远程分支为与之建立链接的远程分支。当我们 clone 远程仓库时其实自动建立了本地master分支与远程master分支的追踪关系——即连接,因此我们可以采用简写的方式。

📌[建议]: 在开发前首先使用 git pull 指令,确保从最新版本开始开发

在windows上模拟开发者B:
在这里插入图片描述

3.在分支上开发

开发者A:

  1. 在本地创建 feacture 分支,并与远端的 origin/feacture 分支建立连接在这里插入图片描述

    • git checkout -b feacture origin/feacture 指令创建一个 feacture 分支并切换到 feacture 分支上,并建立远端 feacture 分支的追踪关系
    • git branch -a 指令用于显示本地和远端的所有分支
    • git branch -vv 指令显示本地分支与远端分支的追踪关系。可以看到此时本地的 feacture 分支已经与远端的 origin/feacture 分支建立了连接
  2. feacture 分支上完成开发,并提交到远端的 origin/feacture 分支上
    在这里插入图片描述

开发者B:

  1. 在本地创建 feacture 分支,并与远端的 origin/feacture 分支建立连接
    在这里插入图片描述

  2. 当我们尝试push到远端仓库时发生了冲突,原因是远端仓库的版本比我们当前的版本高(因为开发者A完成了push操作),我们首先需要 pull 远端仓库的分支内容,解决完冲突后才能再次 add + commit + push
    📌[建议]: 在开发前首先使用 git pull 指令,确保从最新版本开始开发

  3. 因为我们已经建立了本地 feacture 分支与远端 feacture 分支的链接,所以可以直接使用 git pull 指令拉取
    在这里插入图片描述

  4. 手动解决冲突,从当前版本和远程仓库中的版本选择一个
    在这里插入图片描述
    在这里插入图片描述

  5. 重新 add + commit + push。此时我们就可以顺利推送到远程仓库了在这里插入图片描述

4.分支合并

合并分支也有两种方式:

  • 提交 pull request,通过代码审验后合并到 master 分支
  • 在本地 master 分支上合并后再 push 到远端的 master 分支

事先声明,方法一是更被推荐的。出于教学的考虑,在单分支的版本中,先带大家用用方法二

  1. 前面提到,我们要保证主分支的稳定性,因此我们不能直接将 feacture 分支合并到 master 分支上,因为在解决合并冲突的过程中,我们就有可能在无意中改出了更大的 BUG。正确的做法是先将 master 分支合并到 feacture 分支上,解决冲突后并且确认没有 bug 后再合并到 master 分支上。先前有过masterfeacture 分支的合并记录,再合并时就不会出现冲突(都是本地操作)
    在这里插入图片描述
  2. 将本地的 master 分支提交到远端
    在这里插入图片描述在这里插入图片描述

5.清理

完成合并后,就可以将没用的 feacture 分支删除。删除分支也有两种方式:

  • 在远端和本地分别删除 feacture 分支
  • 在本地删除 feacture 分支后推送到远端

这里先为大家呈现第一种删除方式:

  1. 远端删除 feacture 分支
    在这里插入图片描述
  2. 本地删除 feacture 分支
    在这里插入图片描述
  3. 此时我们使用 git branch -r 指令仍然能看到 origin/feacture,此时我们需要使用 git pull --prune 指令进行修剪
    在这里插入图片描述

多人协作二:多分支

多人在单分支上协作开发时,经常需要解决冲突的问题;而使用多分支,各个开发者在各自的分支上独立开发,只需要在最后合并分支时解决冲突即可

  • 任务:开发者A在 feacture-1 分支下编写文件file1。开发者B在 feacture-2 分支下编写文件file1、file2

1.创建分支

前面提到,创建分支的方式有两种:

  • 在远程仓库直接创建
  • 在本地创建分支 xxx 后使用指令 git push origin xxx 在远端创建一个与本地 xxx 分支对应的 xxx 分支

我们现在采用第二种方式创建分支:

开发者A:

  1. 在本地创建 feacture-1 分支。此时在创建分支时我们不能再后面指定与远程分支 orgin/feacture -1 建立连接,因此此时远程仓库中并没有这个分支
    在这里插入图片描述
    在这里插入图片描述

  2. 执行 git push origin feature-1 ,Git 将会将本地 feature-1 分支上提交推送到 origin 远程仓库中的相应分支。如果远程仓库不存在名为 feature-1 的分支,则 git 会创建之;如果存在,则将修改合并到该分支上
    在这里插入图片描述

  3. 使用 git branch -vv 指令就可以发现,本地的 feacture-1 分支并没有与远端的 feacture-1 分支建立追踪关系。
    在这里插入图片描述

  4. 因此我们不能直接使用 git pull、git push 等缩写指令。解决方法 git 也已经提示我们了①使用完整的命令 ②建立远端分支与本地分支的追踪关系
    在这里插入图片描述 5. 采用方法②来解决问题在这里插入图片描述

开发者B同理

此时远端已经多了两个分支:
在这里插入图片描述

2.在分支上开发

开发者A与开发者B各自在分支上完成开发,并提交到远程分支 feacture-1feacture-2

3. pull request

我们前面提到,合并分支也有两种方式:

  • 提交 pull request,通过代码审验后合并到 master 分支
  • 在本地 master 分支上合并后再 push 到远端的 master 分支

这里我们就是采用 pull request 的方式合并分支

开发者A:

  • 提交 pull request。可自动合并说明没有遇到冲突
    在这里插入图片描述
  • 仓库的管理人员完成对你的审核通过、测试通过后,就可以合并到 master 分支中。在“文件”一栏中可以看到你的修改
    在这里插入图片描述在这里插入图片描述

开发者B:

  • 提交 pull request。不可自动合并说明遇到了冲突
    在这里插入图片描述
  • 我们不能在 master 分支上处理冲突。解决方式与之前类似,先将 master 分支合并到 feacture-2 分支上,解决完冲突后再将 feacture-2 分支合并到 master 分支上
  • 切换到 master 分支上,首先 git pull 拉取最新版本的 master 分支代码!!
    在这里插入图片描述
  • 切换到 feacture-2 分支上,合并 master 分支。遇到冲突,冲动解决冲突
    在这里插入图片描述
  • 冲突解决,并推送到远端仓库
    在这里插入图片描述
  • 此时再次发起 pull request 请求就不会遇到问题了
    在这里插入图片描述
    在这里插入图片描述

4.清理

前面提到,删除分支也有两种方式:

  • 在远端和本地各自删除 feacture 分支
  • 在本地删除 feacture 分支后推送到远端

现在我们演示第二种删除方式

  • 删除远端分支:git push origin --delete xxx
  • 删除本地分支:git branch -D xxx
    在这里插入图片描述

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

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

相关文章

/usr/bin/ld: cannot find -lmysqlcllient

文章目录 1. question: /usr/bin/ld: cannot find -lmysqlcllient2. solution 1. question: /usr/bin/ld: cannot find -lmysqlcllient 2. solution 在 使用编译命令 -lmysqlclient时&#xff0c;如果提示这个信息。 先确认一下 有没有安装mysql-devel 执行如下命令 yum inst…

js对象属性

在面向对象的语言中有一个标志&#xff0c;那就是都有类&#xff0c;通过类可以创建任意多个相同属性、方法的对象。在js中没有类的存在&#xff0c;所以js中的对象&#xff0c;相对于类语言中对象有所不同。 js中定义对象为&#xff1a;“无序属性的集合&#xff0c;其属性可…

新版绿豆视频APP视频免授权源码 V6.6插件版

新版绿豆视频APP视频免授权源码 V6.6插件版 简介&#xff1a; 新版绿豆视频APP视频免授权源码 插件版 后端插件开源&#xff0c;可直接反编译修改方便 对接苹果cms,自定义DIY页面布局&#xff01; 绿豆影视APP对接苹果cms 所有页面皆可通过后端自由定制 此版本后端源码 前…

二叉树创建、前序遍历、中序遍历、后序遍历、层序遍历

#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<malloc.h> #define N 100 typedef char data_t;typedef struct tree {data_t data;//存放本节点数据struct tree* l_child;//存放左孩子节点地址struct tree* r_child;//存放右孩子节点地址 }Tree;Tre…

Zig实现Hello World

1. 什么是zig 先列出一段官方的介绍: Zig is a general-purpose programming language and toolchain for maintaining robust, optimal, and reusable software. 大概意思就是说&#xff1a; Zig是一种通用编程语言和工具链&#xff0c;用于维护健壮、最佳和可重用的软件。 官…

电脑计算机xinput1_3.dll丢失的解决方法分享,四种修复手段解决问题

日常生活中可能会遇到的问题——xinput1_3.dll丢失的解决方法。我相信&#xff0c;在座的很多朋友都曾遇到过这个问题&#xff0c;那么接下来&#xff0c;我将分享如何解决这个问题的解决方法。 首先&#xff0c;让我们来了解一下xinput1_3.dll文件。xinput1_3.dll是一个动态链…

服务注册发现_高可用Eureka注册中心搭建

在微服务架构这样的分布式环境中&#xff0c;我们需要充分考虑发生故障的情况&#xff0c;所以在生产环境中必须对各个组件进行高可用部署&#xff0c;对于微服务如此&#xff0c;对于服务注册中心也一样。 问题&#xff1a; Spring-Cloud为基础的微服务架构&#xff0c;所有的…

vulhub venom

文章目录 靶场环境信息收集ftp服务二、信息利用三、任意文件上传三 sudo提权靶场环境 `vmware 靶场信息:https://www.vulnhub.com/entry/venom-1,701/ 下载地址:https://download.vulnhub.com/venom/venom.zip 新建虚拟机打开下载后的ovf文件 遇见导入失败合规性检查时,重试…

找不到d3dcompiler_43.dll,无法继续执行代码如何解决

d3dcompiler_47.dll 是一个与 DirectX 相关的动态链接库&#xff08;DLL&#xff09;&#xff0c;它包含了 DirectX 图形编译器的一些功能。当您的电脑出现 d3dcompiler_47.dll 丢失的情况时&#xff0c;可能会导致一些基于 DirectX 的游戏或应用程序无法正常运行。下面我们将介…

【刷题笔记9.24】LeetCode:只出现一次的数字

LeetCode&#xff1a;只出现一次的数字 一、题目描述 给你一个 非空 整数数组 nums &#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题&#xff0c;且该算法只使…

ImportError: Java package ‘edu‘ not found, requested by alias ‘edu‘

参考issue&#xff1a; https://github.com/ncbi-nlp/NegBio/issues/44 我目前的解决办法 pip uninstall jpype1 -y可以成功运行。

CCNP-OSPFv3

现在在企业中&#xff0c;用的IPv4居多&#xff0c;在我们的手机上&#xff0c;数据中心&#xff0c;运营商以及一些大企业用的都是IPv6&#xff1b; 为啥用IPv6啊&#xff0c;因为IPv4地址不够用&#xff0c;IPv4地址只有32bit&#xff0c;而IPv6足足有128bit&#xff1b; 那…

【23-24 秋学期】 NNDL 作业2

习题2-1 分析为什么平方损失函数不适用于分类问题&#xff0c;交叉熵损失函数不适用于回归问题 平方损失函数 平方损失函数&#xff08;Quadratic Loss Function&#xff09;经常用在预测标签&#x1d466;为实数值的任务中 表达式为&#xff1a; 交叉熵损失函数 交叉熵损失函…

RGB-D转3D点云原理及实现代码

在图像处理和计算机视觉领域&#xff0c;RGBD 是指结合图像颜色和深度信息的数据格式。文本介绍如何使用Python将RGBD数据转换为3D点云&#xff0c;可以使用 NSDT 3DConvert 在线查看3D点云或者进行格式转换&#xff1a; 1、RGBD 颜色深度 缩写 RGB 代表三基色通道&#xf…

Unity中Shader用到的向量的乘积

文章目录 前言一、向量的乘法1、点积2、差积 二、点积&#xff08;结果是一个标量&#xff09;1、数学表示法2、几何表示法 三、叉积1、向量叉积的结果 与 两个相乘的向量互相垂直2、判断结果正负方向的方法&#xff1a;右手法则 前言 Unity中Shader用到的向量的点积 一、向量…

华为OD机试 - 最小传输时延 - 深度优先搜索DFS(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明计算源节点1到目的节点5&#xff0c;符合要求的时延集合 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&…

Gnomon绑定基础(约束 IK 节点)

点约束 方向约束 父约束 目标约束 修改后 对象方向 IK控制柄 直的骨骼&#xff0c;指定IK怎么弯曲 直的骨骼&#xff0c;指定IK怎么弯曲 样条曲线 数学节点 乘除节点 混合节点 注意

免杀对抗-无文件落地分离拆分-文本提取+加载器分离+参数协议化+图片隐写

无文件落地&分离拆分 无文件落地&分离拆分其实就是内存免杀&#xff0c;内存免杀是将shellcode直接加载进内存&#xff0c;由于没有文件落地&#xff0c;因此可以绕过文件扫描策略的查杀。为了使内存免杀的效果更好&#xff0c;在申请内存时一般采用渐进式申请一块可读…

Mysql数据库SQL语句与管理

Mysql数据库基本语句与管理 1、常用的数据类型2、数据库管理3、SQL语句3.1语言分类3.2sql语句 4、DQL查询数据记录4.1查询4.2修改4.3删除4.4alter修改 5、总结 1、常用的数据类型 数据类型 &#xff08;1&#xff09;int&#xff1a;整型 用于定义整数类型的数据 &#xff08;…

使用Spring Boot和MyBatis访问数据库

使用Spring Boot和MyBatis访问数据库 Spring Boot和MyBatis是Java开发中非常流行的框架&#xff0c;它们可以帮助你轻松地构建和管理数据库应用程序。本文将介绍如何使用Spring Boot和MyBatis访问数据库&#xff0c;并提供示例代码以帮助你入门。 准备工作 在开始之前&#x…