【Git】--- 多人协作实战场景
Welcome to 9ilk's Code World

(๑•́ ₃ •̀๑) 个人主页: 9ilk
(๑•́ ₃ •̀๑) 文章专栏: Git
前面我们学习了Git的所有本地仓库的相关操作:git基本操作,分支理解,版本回退,冲突解决等等。同时我们还理解了远端仓库在开发的作用以及相关操作push和pull。但更重要的是Git是一把团队开发的利器,我们应该见见实际中利用Git进行多人开发的场景。
🏠 多人开发场景一
目标:远程仓库master分支下file.txt文件新增代码“aaa" "bbb"。
实现:开发者1新增”aaa", 开发者2新增“bbb”。
条件:在一个分支下协作完成。
我们知道master往往是作为稳定的分支,一般开发我们是新建一个开发分支dev来进行开发,稳定开发没有问题之后再合并到master分支上,因此我们可以在远程仓库上新建开发分支dev:

模拟两个开发者
说明:我们以Linux云服务器作为开发者1,Windows作为开发者2。
(1)开发者1
对于开发者1,目前的状态如下:

此时开发者1是看不到远端刚新建的开发分支的:
git branch -r //查看远程分支

我们需要对远端仓库进行拉取:
git pull //拉取
git branch -a //同时打印本地和远程分支

此时开发者1的状态:

补充细节:对于git push + 远程仓库 远程分支,此时是不需要与远程仓库建立远程连接的 ; git clone的时候,Git会自动为本地仓库的master分支和远程仓库的master分支建立连接,因此我们能直接使用git push命令将本地修改推送到远端,而不用指明远程仓库和远程分支。
(2)开发者2
Windows本地选取目录作为本地仓库进行git clone远端仓库:

开发者2此时的状态:

开发者1dev分支新增
我们可以在本地也新建分支来开发,并且和远程的开发分支建立连接:
git checkout -b dev1 origin/dev1 //本地新建dev1分支+切换到该分支+追踪远端dev1分支
此时对于dev1分支向远端推送时,可以直接使用git push到远端的dev1分支,而不用指明仓库,我们可以使用git branch -vv 命令查看本地分支和远端分支的关系 :

开发者1对file.txt文件新增“aaa"并推送到远端:
vim file.txt //新增aaa
git add file.txt
git commit -m "modify aaa file.txt"
git push
我们到远端仓库的dev1分支上就能看到file.txt新增aaa:

开发者2dev分支新增
同样我们也需要在开发者2本地仓库新建分支进行开发:

与开发者1不同,我们新建分支时并没有与远程仓库建立连接,我们可以使用git branch --set-upstream-to=【远程分支】 【本地分支】 来追踪远端仓库的分支

开发者2对file.txt新增”bbb"并提交:

由于开发者1之前已经对远端提交了修改,因此冲突是少不了的,此时我们应该git pull拉取远端仓库内容,并手动解决冲突后提交:

开发分支dev合并到master
(1) 方式一:本地的master分支合并本地dev分支,再推送本地master分支到远端的master
(2) 方式二:在远端仓库提交Pull Request 由管理员进行合并
说明:我们这里演示方式一。
我们之前讲过master是作为我们线上发布的一个稳定分支,所以我们不能直接让master合并dev,因为可能产生冲突,我们最好是先让dev合并master,有冲突在dev上解决,解决完再让master合并dev。
但在进行dev合并master操作之前,我们最好养成一个好习惯,即先从远端仓库拉取一下,保证本地dev是最新的:

master pull:

dev合并master:

确认无冲突之后,master合并dev分支并推送到远程master分支:

我们可以到远程仓库进行查看:

此时dev1分支的开发任务到这里就已经结束了,我们可以在本地和远端对其进行删除。
总结
在同一分支下进行多人协作的工作模式通常是这样:
1. 首先,可以试图用git push 远程仓库 远程分支 推送自己的修改。
2. 如果推送失败,则因为远程分支比你的本地更新,需要先使用git pull试图合并。
3. 如果合并存在冲突,则解决冲突,并在本地提交。
4. 没有冲突或解决完冲突之后,再用git push 远程仓库 远程分支 推送即可。
5. 功能开发完毕,将分支merge进master,最后删除分支。
🏠 多人开发场景二
目标:远程master分支下新增function1和function2文件,代表两个功能。
实现:由开发者1新增function1,开发者2新增function2。
条件:在不同分支下协作完成。
我们要实现的场景概括起来就是:两个开发者各自一个分支,各自开发各自功能,在不同分支下进行协作。
既然要创建分支,我们知道创建分支有两种方式:
- 方式一:在远程新建分支,在本地进行push和拉取。
- 方式二:在本地新建分支,完成开发之后再push到远程仓库。
说明:对于这两种方式,更推荐第一种,因为我们远程创建的话,基于master创建新分支,而此时远程仓库的master分支是目前最新最稳定的;而如果是方式二的话,你本地的master分支不一定是最新的,功能分支和master分支合并之前,本地master还需要pull拉取远程仓库,因此操作比较冗杂。
注:之前方式一我们已经演示过了,我们本次演示下方式二。
开发者1开发
假设开发者1需要新增function1功能,此时我们可以在本地新建分支进行开发,开发完成之后利用Git三板斧提交到远程仓库:

由于我们是在本地新建的开发分支,在远端是没有该分支与我们进行连接的!我们可以使用git push 远程仓库 远程分支来直接推送到远端:
注 : 我们之前进行与远程仓库连接跟踪,使用的是git checkout -b 新分支 远程仓库/远程分支(新建分支的场景)和 git push --set-upstream 远程仓库 远程分支(远程中已经存在对应的分支),我们现在的场景中并不是新建分支而且远程也没有对应分支。

此时我们在远程仓库应该看到除了master分支之外,存在新分支feature1:

开发者2开发

上一个开发场景中,我们对于file.txt最新应该是新增了aaa bbb内容的,对于开发者2来说,master还不是最新的!我们首先应该先git pull一下,这也是一个好习惯
git pull
拉取完之后开发者2就可以进行正式开发了, 同样我们也是新建本地分支开发,开发完成之后进行三板斧操作直接推送到远端:

注意 : 此时本地的feature2是并没有对远程的feature2分支进行追踪管理的,即没有进行连接

此时开发者1和开发者2状态如下:

此时,在本地开发者1和开发者2互相看不到各自的文档,并且推送各自的分支时,并没有任何冲突,互不影响!
协作开发
由上可知,开发者1和开发者2目前是互不影响的,但是否能由开发者1暂时承担开发者2的开发任务呢? 答案是可以的。
开发者1本地是没有远程feature2分支的,因此我们应该首先从远端拉取内容:

Q:为什么这里可以直接git pull 而不需要和远程的feature2先建立连接?
1. 拉取某个特定分支下的内容是需要先建立连接的,才能直接使用git pull命令。
2. 拉取远程仓库中的内容,即拉取分支是不需要建立连接的。
注意:如果不先拉取,在本地就无法查看到远程feature2分支的信息,也就无法建立来连接,进行追踪管理!
拉取完远程仓库之后,我们就可以继续进行开发了。但是开发者1本地是没有feature2分支的,我们首先应该先建立本地feature2分支并进行追踪,然后进行开发:

恢复开发
由于开发者1之前帮我们开发了一部分,此时开发者2需要在本地进行同步,即从远端进行拉取,但之前开发者之前并没有与远程feature2分支建立连接,而是直接推送到远程仓库指定分支,因此我们可以采用以下两种方式进行拉取:
//方式一:本地先与远程建立连接再直接git pull
git branch --set-upstream-to=origin/feature2 feature2
git pull//方式二:pull时指明远程仓库和远程分支
git pull <remote> <branch>
即git pull origin feature2

开发者2开发完之后就可以执行三板斧,此时是已经建立连接的,我们可以直接git push:

打开远程仓库,我们就能发现feature2分支下的function2功能:

功能合并
(1) 通过PullRequest将feature2合并到master
之前我们讲解到合并分支有两种方式:1. 在本地dev先合并master-> 有冲突解决冲突,无冲突则master合并dev,push本地master到远端仓库的master 2. 使用PullRequest在远程合并分支。本次我们讲解第二种方式。
填写PullRequest:

一般在远程仓库合并分支要经历一下流程:

当审查发现无问题之后就会显示可自动合并,我们就能在master分支下查询到开发者2开发的功能:

(2) 本地feature1分支合并master再push到远程
我们先分析一下目前的状态:

feature1要想合并到master,此时由于开发者1和开发者2是各自私有一个功能,因此不会产生冲突。如果有冲突,该怎么解决呢?

我们一个较好的方案是 : 先让feature1在本地合并一下master分支,有冲突就在本地进行解决,然后在push到远程的feature1分支,最后再提交PullRequest在远程进行合并。
同样的,在merge之前,我们最好先pull一下,保证本地master是最新的:

本地将master合并到feature1:

将本地推送到远端:

(3) 通过PullRequest将feature1合并到master
我们已经完成了前两步,剩下的就是在远端提交PR将feature1合并到master:

此时在远程仓库我们应该看到master分支下具有func1和func2两个模块:

注意 : 到这里feature1和feature2分支的任务已经完成了, 我们可以对其进行删除

总结
当多人各自开发一个功能模块时 :
1. 各自可以在远程或本地新建分支进行功能开发
2. 开发完成之后可以在远端提交PR进行合并
3. 为了防止冲突,也可以在本地进行合并master,解决完冲突之后push到远端再提交PR
🏠 远程分支删除后,本地git branch -a依然能看到的解决方法
我们之前在远端已经删除了两个功能分支,但是当我们使用git branch -a选项查看时还能查看:

我们可以使用git remote show origin 来查看更详细的远程分支信息:

我们可以看到对于在远程已经删除的分支,它提示我们可以使用git remote prune 进行移除

相关文章:
【Git】--- 多人协作实战场景
Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏: Git 前面我们学习了Git的所有本地仓库的相关操作:git基本操作,分支理解,版本回退,冲突解决等等。同时我们还理解了远端仓库在开发的作用以及相关操作push…...
Higress: 阿里巴巴高性能云原生API网关详解
一、Higress概述 Higress是阿里巴巴开源的一款基于云原生技术构建的高性能API网关,专为Kubernetes和微服务架构设计。它集成了Ingress控制器、微服务网关和API网关功能于一体,支持多种协议和丰富的流量管理能力。 发展历程 Higress 从最初社区的 Isti…...
常见的 set 选项与空变量检查
在编写 Bash 脚本时,使用 set 命令中的一些选项可以帮助我们在脚本执行过程中及时捕获错误和潜在问题,避免脚本在出错时继续执行,提高脚本的可靠性和健壮性。 set -e:遇到错误就停 set -e 的作用是:一旦脚本中的某个…...
leetcode 377. Combination Sum IV
这道题也是完全背包问题。这道题和第518题几乎一摸一样,所不同的是,第518题要求的是组合数,而第377题要求的是排列数。虽然本题题目描述中说求的是组合数,但从例子1中(1,1,2)和&…...
VM——相机拍照失败
1、问题:相机频闪触发,在MVS中正常出图,在VM中出现拍照失败 2、解决: 1、首先排查网络设置(巨帧是否设置) 2、电脑的所有防火墙是否关闭 3、在MVS中恢复相机的设置参数为默认参数,删除VM中的全…...
初识Redis · 简单理解Redis
目录 前言: 分布式系统 开源节流 认识Redis 负载均衡 缓存 微服务 前言: 本文只是作为Redis的一篇杂谈,简单理解一下Redis为什么要存在,以及它能做到和它不能做到的事儿,简单提及一下它对应的优势有什么&#…...
目标检测YOLO实战应用案例100讲- 基于卷积神经网络的小目标检测算法研究与应用
目录 知识储备 基于改进YOLOv5的小目标检测算法 一、环境配置(Python 3.8+) 二、核心代码实现 1. 改进模型定义(models/yolov5s_tiny.py ) 2. 小目标数据增强(datasets/tiny_aug.py ) 3. 训练脚本(train.py ) 三、关键改进点说明 四、实验配置建议 前言 传统…...
自动驾驶时间同步
主要包含两个大的概念:时间系统间的时间同步与传感器数据间的时间同步 1. 时间系统间的时间同步 概念: 自动驾驶域控一般由多个芯片与多种类型的传感器组成,如:MCU SoC Camera Lidar Radar USS GNSS,其中 MCU…...
项目进度延误的十大原因及应对方案
项目进度延误主要源于以下十大原因:目标不明确、需求频繁变更、资源配置不足或不合理、沟通不畅、风险管理不足、缺乏有效的项目监控、技术难题未及时解决、团队协作效率低下、决策链过长、外部因素影响。其中,需求频繁变更是导致延误的关键因素之一&…...
消息队列(IPC技术)
目录 一、Linux 中主要的进程间通信方式如下: 二、消息队列函数 (1)msgget函数 功能概述 函数原型 参数解释 返回值 示例 结果 问题 (2) msgsnd函数 功能概述 函数原型 参数说明 返回值 示例 结果 (3࿰…...
突破焊丝虚影干扰,端子焊点缺陷检测如何实现自动化?
端子焊点作为 3C 产品中连接电路的关键环节,其质量优劣对产品性能有着决定性影响。然而,传统人工检测端子焊点不仅效率低下,难以满足大规模生产需求,而且误判率高,无法精准把控产品质量,成为企业提质增效智…...
电能质量在线监测分析装置支持实时监测、数据存储及远程传输,适用于电网、工业等场景
电能质量在线监测分析装置主要技术指标 2.1工作电源 交流:220V10% ;50Hz0.5Hz;谐波畸变率不大于15% 直流:220V10%,纹波系数不大于5% 2.2电流信号输入 输入方式:电流互感器输入; …...
Springboot整合JAVAFX
Springboot整合JAVAFX 实体与VO设计 pom.xml文件如下: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xs…...
01分数规划
好久没发博客了……浅浅复活一下,讲个冷门些的算法。 算法目的:选出k组ai,bi使得 最大。 算法过程: 不妨考虑二分答案,那么答案的形式便是 的形式,则可通过移项转化为,进一步的,我们可以将…...
网络安全防护技术
边界安全防护——防火墙 控制:在网络连接点上建立一个安全控制点,对进出数据进行限制隔离:将需要保护的网络与不可信任网络进行隔离,隐藏信息并进行安全防护记录:对进出数据进行检查,记录相关信息 防火墙…...
[数据结构]Trie字典树
GPT的介绍 🧠 一句话总结: 字典树是一种专门用来存很多字符串的“超级前缀树”,查找某个字符串或前缀的时候,特别快! ✍️ 举个生活例子(类比): 你想做一个词典(Dictio…...
【WPF】IOC控制反转的应用:弹窗但不互相调用ViewModel
全称:Inversion of Control,控制反转 场景:A页面需要调用B/C页面等,防止直接在VM中新建别的页面实例,使用IOC设计架构; 创建Service,在Service中实现页面的实例创建和定义页面输入输出参数。 在…...
课程分享 | 安全设计原则
讲师介绍 前言 在数字化时代,软件安全已从技术问题升级为关乎企业存亡的战略要务。从SolarWinds供应链攻击到Log4j漏洞风暴,一次次安全事件不断警示我们:传统的边界防护思维已无法应对日益复杂的威胁环境。面对不断演进的攻击手段࿰…...
【数据结构 · 初阶】- 单链表
目录 一.相关指针知识点 二.链表 1.为什么学了顺序表还要学链表 2.优点 三.实现 1.链表的打印 —— 理解链表结构 (2) 物理结构图 2.链表的尾插 —— 入门 错误写法:tail ! NULL 总结: 正确代码物理图解: (2) 尾插整体代码 (思考…...
在Linux系统命令行如何使用deepseek官方API调用AI大模型?
在Linux系统命令行如何调用deepseek官方API调用AI大模型? 书接上文: 同样的开头哈哈哈哈: ”在这个AI技术飞速发展的时代,每一个程序员都应该问问自己:如何将人工智能的强大能力融入到我们熟悉的操作系统中ÿ…...
我开源了一个“宝藏”开源项目
我开源了一个“宝藏”开源项目 - AI需求分析项目 | 适合交作业和学习 🚀 前言 大家好!最近在学习软件工程和大模型应用开发的过程中,我发现许多学生都遇到了需求分析AI的题目。把一份需求文档转化为用户故事、实体关系或数据库设计ÿ…...
SmolDocling:一种超紧凑的视觉语言模型,用于端到端多模态文档转换
paper地址:SmolDocling: An ultra-compact vision-language model for end-to-end multi-modal document conversion Huggingface地址:SmolDocling-256M-preview 代码对应的权重文件:SmolDocling-256M-preview权重文件 一、摘要 以下是文章摘要的总结: SmolDocling 是一…...
理解CSS3 的 max/min-content及fit-content等width值
本文首发在我的个人博客: 理解CSS3 的 max/min-content及fit-content等width值https://www.brandhuang.com/article/1744253362074 width/height 的属性值 fit-content 这是一个 CSS3 属性,用来设置元素的宽度和高度,值为 fit-content&#…...
关键路径任务延误,如何快速调整
快速识别延误原因、优化资源配置、实施任务并行、调整任务优先级是关键路径任务延误后快速调整的有效方式。其中,快速识别延误原因尤为重要,需要项目管理者及时发现影响关键路径任务延误的核心问题,通过系统性的分析,确保延误的具…...
Elasticsearch 全面解析
Elasticsearch 全面解析 前言一、简介核心特性应用场景 二、核心原理与架构设计1. 倒排索引(Inverted Index)2. 分片与副本机制(Sharding & Replication)3. 节点角色与集群管理 三、核心特点1. 灵活的查询语言(Que…...
linux入门四:Linux 编译器
一、C 语言编译器 GCC:开启编程之旅 1.1 GCC 安装:一站式工具链 GCC(GNU Compiler Collection)是 Linux 下最常用的 C/C 编译器,支持多种编程语言。安装命令(适用于 Debian/Ubuntu 系统)&…...
springboot集成springcloud vault读值示例
接上三篇 Vault---机密信息管理工具安装及常用示例 Vault机密管理工具集群配置示例 vault签发根证书、中间证书、ca证书流程记录 项目里打算把所有密码都放到vault里管理,vault提供了springcloud vault用来在springboot里连接vault,启动加载vault里的值放…...
什么是虚拟线程?与普通线程的区别
引言:线程的演进与挑战 在传统的并发编程中,线程是一种非常重要的概念。我们使用线程来实现任务的并发执行,从而提高程序的执行效率。普通线程(如 Thread 类)是一种重量级的线程,每个线程都对应着操作系统…...
edis 主从复制
Redis 主从复制是一种数据同步机制,主节点(Master)将数据复制到一个或多个从节点(Slave),从 而实现数据备份、读写分离和高可用性。 1、解决我们的日常一个单机故障,而衍生出来 主从架构 2、…...
机器视觉+深度学习,让电子零部件表面缺陷检测效率大幅提升
在精密加工的3C电子行业中,一抹0.1毫米的油渍,一粒肉眼难辨的灰尘或将引发整机性能隐患。当制造业迈入微米级品质竞争时代,产品表面看似微不足道的脏污缺陷,正成为制约企业高质量发展的隐形枷锁。分布无规律的污渍斑点、形态各异的…...
