【Git】--- 多人协作实战场景

news2025/4/18 0:02:13

 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 进行移除

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

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

相关文章

Higress: 阿里巴巴高性能云原生API网关详解

一、Higress概述 Higress是阿里巴巴开源的一款基于云原生技术构建的高性能API网关&#xff0c;专为Kubernetes和微服务架构设计。它集成了Ingress控制器、微服务网关和API网关功能于一体&#xff0c;支持多种协议和丰富的流量管理能力。 发展历程 Higress 从最初社区的 Isti…

VM——相机拍照失败

1、问题&#xff1a;相机频闪触发&#xff0c;在MVS中正常出图&#xff0c;在VM中出现拍照失败 2、解决&#xff1a; 1、首先排查网络设置&#xff08;巨帧是否设置&#xff09; 2、电脑的所有防火墙是否关闭 3、在MVS中恢复相机的设置参数为默认参数&#xff0c;删除VM中的全…

初识Redis · 简单理解Redis

目录 前言&#xff1a; 分布式系统 开源节流 认识Redis 负载均衡 缓存 微服务 前言&#xff1a; 本文只是作为Redis的一篇杂谈&#xff0c;简单理解一下Redis为什么要存在&#xff0c;以及它能做到和它不能做到的事儿&#xff0c;简单提及一下它对应的优势有什么&#…

自动驾驶时间同步

主要包含两个大的概念&#xff1a;时间系统间的时间同步与传感器数据间的时间同步 1. 时间系统间的时间同步 概念&#xff1a; 自动驾驶域控一般由多个芯片与多种类型的传感器组成&#xff0c;如&#xff1a;MCU SoC Camera Lidar Radar USS GNSS&#xff0c;其中 MCU…

项目进度延误的十大原因及应对方案

项目进度延误主要源于以下十大原因&#xff1a;目标不明确、需求频繁变更、资源配置不足或不合理、沟通不畅、风险管理不足、缺乏有效的项目监控、技术难题未及时解决、团队协作效率低下、决策链过长、外部因素影响。其中&#xff0c;需求频繁变更是导致延误的关键因素之一&…

消息队列(IPC技术)

目录 一、Linux 中主要的进程间通信方式如下&#xff1a; 二、消息队列函数 &#xff08;1&#xff09;msgget函数 功能概述 函数原型 参数解释 返回值 示例 结果 问题 (2) msgsnd函数 功能概述 函数原型 参数说明 返回值 示例 结果 &#xff08;3&#xff0…

突破焊丝虚影干扰,端子焊点缺陷检测如何实现自动化?

端子焊点作为 3C 产品中连接电路的关键环节&#xff0c;其质量优劣对产品性能有着决定性影响。然而&#xff0c;传统人工检测端子焊点不仅效率低下&#xff0c;难以满足大规模生产需求&#xff0c;而且误判率高&#xff0c;无法精准把控产品质量&#xff0c;成为企业提质增效智…

电能质量在线监测分析装置支持实时监测、数据存储及远程传输,适用于电网、工业等场景

电能质量在线监测分析装置主要技术指标 2.1工作电源 交流&#xff1a;220V10% &#xff1b;50Hz0.5Hz&#xff1b;谐波畸变率不大于15&#xff05; 直流&#xff1a;220V10%&#xff0c;纹波系数不大于5% 2.2电流信号输入 输入方式&#xff1a;电流互感器输入&#xff1b; …

01分数规划

好久没发博客了……浅浅复活一下&#xff0c;讲个冷门些的算法。 算法目的&#xff1a;选出k组ai,bi使得 最大。 算法过程&#xff1a; 不妨考虑二分答案&#xff0c;那么答案的形式便是 的形式&#xff0c;则可通过移项转化为&#xff0c;进一步的&#xff0c;我们可以将…

网络安全防护技术

边界安全防护——防火墙 控制&#xff1a;在网络连接点上建立一个安全控制点&#xff0c;对进出数据进行限制隔离&#xff1a;将需要保护的网络与不可信任网络进行隔离&#xff0c;隐藏信息并进行安全防护记录&#xff1a;对进出数据进行检查&#xff0c;记录相关信息 防火墙…

课程分享 | 安全设计原则

讲师介绍 前言 在数字化时代&#xff0c;软件安全已从技术问题升级为关乎企业存亡的战略要务。从SolarWinds供应链攻击到Log4j漏洞风暴&#xff0c;一次次安全事件不断警示我们&#xff1a;传统的边界防护思维已无法应对日益复杂的威胁环境。面对不断演进的攻击手段&#xff0…

【数据结构 · 初阶】- 单链表

目录 一.相关指针知识点 二.链表 1.为什么学了顺序表还要学链表 2.优点 三.实现 1.链表的打印 —— 理解链表结构 (2) 物理结构图 2.链表的尾插 —— 入门 错误写法&#xff1a;tail ! NULL 总结&#xff1a; 正确代码物理图解&#xff1a; (2) 尾插整体代码 (思考…

在Linux系统命令行如何使用deepseek官方API调用AI大模型?

在Linux系统命令行如何调用deepseek官方API调用AI大模型&#xff1f; 书接上文&#xff1a; 同样的开头哈哈哈哈&#xff1a; ”在这个AI技术飞速发展的时代&#xff0c;每一个程序员都应该问问自己&#xff1a;如何将人工智能的强大能力融入到我们熟悉的操作系统中&#xff…

我开源了一个“宝藏”开源项目

我开源了一个“宝藏”开源项目 - AI需求分析项目 | 适合交作业和学习 &#x1f680; 前言 大家好&#xff01;最近在学习软件工程和大模型应用开发的过程中&#xff0c;我发现许多学生都遇到了需求分析AI的题目。把一份需求文档转化为用户故事、实体关系或数据库设计&#xff…

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值

本文首发在我的个人博客&#xff1a; 理解CSS3 的 max/min-content及fit-content等width值https://www.brandhuang.com/article/1744253362074 width/height 的属性值 fit-content 这是一个 CSS3 属性&#xff0c;用来设置元素的宽度和高度&#xff0c;值为 fit-content&#…

关键路径任务延误,如何快速调整

快速识别延误原因、优化资源配置、实施任务并行、调整任务优先级是关键路径任务延误后快速调整的有效方式。其中&#xff0c;快速识别延误原因尤为重要&#xff0c;需要项目管理者及时发现影响关键路径任务延误的核心问题&#xff0c;通过系统性的分析&#xff0c;确保延误的具…

Elasticsearch 全面解析

Elasticsearch 全面解析 前言一、简介核心特性应用场景 二、核心原理与架构设计1. 倒排索引&#xff08;Inverted Index&#xff09;2. 分片与副本机制&#xff08;Sharding & Replication&#xff09;3. 节点角色与集群管理 三、核心特点1. 灵活的查询语言&#xff08;Que…

linux入门四:Linux 编译器

一、C 语言编译器 GCC&#xff1a;开启编程之旅 1.1 GCC 安装&#xff1a;一站式工具链 GCC&#xff08;GNU Compiler Collection&#xff09;是 Linux 下最常用的 C/C 编译器&#xff0c;支持多种编程语言。安装命令&#xff08;适用于 Debian/Ubuntu 系统&#xff09;&…

springboot集成springcloud vault读值示例

接上三篇 Vault---机密信息管理工具安装及常用示例 Vault机密管理工具集群配置示例 vault签发根证书、中间证书、ca证书流程记录 项目里打算把所有密码都放到vault里管理&#xff0c;vault提供了springcloud vault用来在springboot里连接vault&#xff0c;启动加载vault里的值放…