【Git】多人协作 -- 详解

一、多人协作(1)

⽬前,我们所完成的工作如下:

  • 基本完成 Git 的所有本地库的相关操作,git 基本操作,分支理解,版本回退,冲突解决等等。

  • 申请码云账号,将远端信息 clone 到本地,以及推送和拉取。

是时候做最重要的一件事情了,实现多人协作开发。

为了做这件事情,需要先做一些准备工作。我们之前已经将项目 clone 到了指定目录,如:

完成任务:

在 Windows 环境下,再 clone 同一个项目仓库,来模拟和我们⼀起协作开发的另一名小伙伴:

找一个新的文件夹,进入文件夹后右键:

clone 成功:

注意:这里是模拟了两个用户。但在实际开发中,每个用户都有属于自己的 gitee/github 账号,如果要多人进行协同开发,必须要将用户添加进开发者,用户才有权限进行代码提交:

邀请用户:

到此,相当于有了两个用户,分别在 Linux 和 Windows 上针对于同个项目进行协作开发,我们的准备工作到此结束。

目前,我们的仓库中只有一个 master 主分支,但在实际的项目开发中,在任何情况下其实都是不允许直接在 master 分支上修改代码的,这是为了保证主分支的稳定。所以在开发新功能时,常常会新建其他分支,供开发时进行迭代使用。那么接下来,就让我们在 gitee 上新建 dev 远程分支供我们使用:

创建成功:

创建成功的远程分支是可以通过 Git 拉取到本地来,以实现完成本地开发工作。接下来让我们和另一名开发的小伙伴都将远程仓库进行一次拉取操作。

对于我们要操作的是:

注意 :之前讲的 git branch 只能查看本地分支,要查看远程分⽀需要加上  -r  选项。但前提是要 pull  ⼀下拉取最新的远端仓库,才能看到最新的内容。

拉取后便可以看到远程的 dev 分支,接着切换到 dev 分支供我们进行本地开发。要说明的是,我们切换到的是本地的 dev 分支,根据示例中的操作,会将本地分支和远程分支的进行关系链接。

对于另一名小伙伴要操作的是:

现在,我们就可以和小伙伴在 dev 上完成开发。

首先,让我们在 dev 分支上进行一次开发,并 push 到远程:

来看看码云上目前仓库的状态:

至此,我们已经将代码成功推送至码云,接下来假如小伙伴要和我们协同开发,碰巧也要对 file.txt 文件做修改,并试图推送:

这时推送失败,因为小伙伴的最新提交和你推送的提交有冲突,解决办法也很简单,Git 已经给出了提示,先用 git pull 把最新的提交从 origin/dev 抓下来,然后再在本地进行合并,并解决冲突,再推送。操作如下:

解决冲突,重新推送:

此时,在远端的码云就能够看到我们的新提交了:

由此,两名开发者已经开始可以进行协同开发了,不断的 git pull/add/commit/push,遇到冲突就使用之前讲的冲突处理解决掉冲突。

对于我们来说,要想看到小伙伴的代码,只需要 pull 一下即可:

最后不要忘记,虽然我们是在分支上进行多人协作开发,但最终的目的是要将开发后的代码合并到 master 上去,让我们的项目运行最新的代码。接下来我们就需要做这件事情了:

切换至 master 分支,pull 一下,保证本地的 master 是最新内容,合并前这么做是一个好习惯。

切换至 dev 分支,合并 master 分⽀,这么做是因为如果有冲突的话,可以在 dev 分支上进行处理,而不是在 master 上解决冲突,这么做也是一个好习惯。

切换至 master 分支,合并 dev:

将 master 分支推送到远端:

此时再查看远端仓库,master 已经是最新代码了:

此时,dev 分支对于我们来说就没用了, 那么 dev 分支就可以被删除掉。我们可以直接在远程仓库中将 dev 分支删除掉:

总结一下,在同一分支下进行多人协作的工作模式通常是这样:

  • 首先,可以试图用 git push origin branch-name 推送自己的修改。
  • 如果推送失败,是因为远程分支比我们的本地更新,需要先用 git pull 试图合并。
  • 如果合并有冲突,就解决冲突,并在本地提交。(解决冲突是一件很麻烦的事情)
  • 没有冲突或者解决掉冲突后,再用 git push origin branch-name 推送就能成功。
  • 功能开发完毕,将分支 merge 进 master,最后删除分支。

二、多人协作(2)

完成任务:

一般情况下,如果有多需求需要多人同时进行开发,是不会在一个分支上进行多人开发,而是一个需求或一个功能点就要创建一个 feature 分支。现在同时有两个需求需要我们和小伙伴进行开发,那么我俩便可以各自创建一个分支来完成自己的工作。前面我们已经了解了可以从码云上直接创建远程分支,其实在本地创建的分子也可以通过推送的方式发送到远端。在这个部分我们就来用一下这种方式。

对于我而言,可以进行以下操作:

  • 新增本地分支 feature-1 并切换

  • 新增需求内容 —— 创建 feature1 文件

  • 将 feature-1 分支推送到远端

对于小伙伴来说,可以进行以下操作:

  • 创建并切换到 feature-2 分支

  • 在分支下为需求新增 function2 文档

  • 将 feature-2 分支推送至远端

此时在本地看不见伙伴新建的文档,他也看不见我们新建的文档,并且推送各自的分支时,并没有任何冲突,我俩不受对方的影响,用起来就很舒服。

再来看下远端码云上此时的状态:

对于我们的 feature-1 分支:

对于小伙伴的 feature-2 分支:

正常情况下,我俩就可以在自己的分支上进行专业的开发了。但万一有天小伙伴突然生病了,但需求还没开发完,需要我帮他继续开发,于是他就把 feature-2 分支名告诉我。这时我就需要在自己的机器上切换到 feature-2 分支帮忙继续开发,要做的操作如下:

  • 必须先拉取远端仓库内容

  • 可以看到远程已经有了 feature-2

  • 切换到 feature-2 分支上,可以和远程的 feature-2 分支关联起来,否则将来只使用 git push 推送内容会失败

切换成功后,便可以看见 feature-2 分支中的 function2 文件了,接着就可以帮小伙伴进行开发:

  • 继续开发

  • 推送内容

查看远程状态,推送成功了:

这时小伙伴已经修养的差不多,可以继续进行自己的开发工作,那么他首先要获取到我们帮他开发的内容,然后接着我们的代码继续开发。或者我们已经帮他开发完了,那他也需要在自己的电脑上看看我们帮他写的代码:

可以发现代码没有 pull 下来。

Pull 无效的原因是:小伙伴没有指定本地 feature-2 分支与远程 origin/feature-2 分支的链接。

根据提示,设置 feature-2 和 origin/feature-2 的链接即可:

目前,小伙伴的本地代码和远端保持严格一直。我和小伙伴可以继续在不同的分支下进行协同开发了。

各自功能开发完毕后,我们需要将代码合并到 master 中才算真正意义上的开发完毕。

新建一个 Pull Request,让 feature-2 分支合并到 master 分支上:

让 feature-1 分支合并到 master 分支上:

  • 切换至 master 分支pull 一下,保证本地的 master 是最新内容,合并前这么做是⼀个好习惯

  • 切换至 feature-1 分支,合并 master 分支。这么做是因为如果有冲突,可以在 feature-1 分支上进行处理,而不是在 master 上解决冲突,这么做也是⼀个好习惯

  • (1)由于 feature-1 分支已经 merge 进来了新内容,为了保证远程分支最新,所以最好 push ⼀下。
  • (2) push 的另⼀个原因是因为在实际的开发中,master 的 merge 操作一般不是由我们自己在本地进行操作,其他⼈员或某些平台 merge 时,操作的肯定是远程分支,所以就要保证远程分支的最新。
  • (3)如果 merge 出现冲突,不要忘记需要 commit 才可以 push。

此时远程仓库的状态:

此时, feature-1 feature-2 分支对于我们来说就没用了, 那么我们可以直接在远程仓库中将 dev 分支删除掉:

以上就是多人协作的工作模式。


三、远程分支删除后,本地 git branch -a 依然能看到的解决办法

当前我们已经删除了远程的几个分支,使用 git branch -a 命令可以查看所有本地分支和远程分支,但发现很多在远程仓库已经删除的分支在本地依然可以看到。

使用命令 git remote show origin 可以查看 remote 地址,远程分支,还有本地分支与之相对应关系等信息。

此时我们可以看到那些远程仓库已经不存在的分支,根据提示,使用命令:git remote prune origin

这样就删除了那些远程仓库不存在的分支。而对于本地仓库的删除,前面我们已经学过了,这里就不再赘述了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【牛客面试必刷TOP101】Day33.BM70 兑换零钱(一)和BM71 最长上升子序列(一)

文章目录 前言一、BM70 兑换零钱(一)题目描述题目解析二、BM71 最长上升子序列(一)题目描述题目解析总结 前言 一、BM70 兑换零钱(一) 题目描述 描述: 给定数组arr,arr中所有的值都为正整数且不重复。每个值代表一种面值的货币,每种面值的货币…

数据安全未来之路,天空卫士荣誉领榜《中国数据安全50强(2024)》

《中国数据安全50强(2024)》 数世咨询首份《中国数据安全50强(2024)》报告发布。天空卫士凭借其卓越的技术创新、市场领导力、业务收入能力和企业发展能力,在众多竞争者中脱颖而出,荣登50强榜单&#xff0…

yolov5模型pt转engine

目录 1. 环境准备1.1 安装tensorrt1.1.1 pip安装1.1.2 压缩包安装 2. pt转engine 1. 环境准备 1.1 安装tensorrt 1.1.1 pip安装 pip install tensorrt 1.1.2 压缩包安装 很可能会失败,最保险的方法是下载tensorRT的压缩包,比如:下载Tenso…

分享:2024年(第12届)“泰迪杯”数据挖掘挑战赛省级奖项获奖名单公示

本次竞赛有评选省奖的省份有广东省、广西壮族自治区、河北省、湖北省。各省奖项依据“泰迪杯”全国评审专家组统一评阅的最终成绩区分省份后从高到低依序按比例产生。 广东省 省级奖项获奖名单公示 奖项设置: 一等奖:约占该省份队伍总数的5%&#xff0…

【正则表达式】入门

参考视频:10分钟快速掌握正则表达式_哔哩哔哩_bilibili 这个网站用来测试写的正则表达式效果:regex101: build, test, and debug regex 示例: 限定符 ? 表示前一个字符可有可无 比如这里输入:de? 匹配结果可以得到d和de * 前…

【Android WebView】WebView基础

一、简介 WebView是一个基于webkit引擎、展现web页面的控件。Android的Webview在低版本和高版本采用了不同的webkit版本内核,4.4后直接使用了Chrome。 二、重要类 以WebView类为基础,WebSettings、WebViewClient、WebChromeClient为辅助共同完成安卓段加…

微服务中的相关概念

Eureka Eureka 是由 Netflix 开发的一个服务发现和注册中心,广泛应用于微服务架构中。Eureka 主要用于管理和协调分布式服务的注册和发现,确保各个服务之间能够方便地找到并通信。它是 Netflix OSS(Netflix Open Source Software&#xff09…

指针和数组

同一指针相减的绝对值得到的是之间元素的个数 #include"stdio.h" #include"string.h" int main() {int arr[10]{0};printf("%d\n",&arr[9]- &arr[0]);return 0; } 不同类型的指针减去指针没有意义 地址加地址,指针加指针没…

UE5 C++ 跑酷游戏练习 Part1

一.修改第三人称模板的 Charactor 1.随鼠标将四处看的功能的输入注释掉。 void ARunGANCharacter::SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) {// Set up action bindingsif (UEnhancedInputComponent* EnhancedInputComponent CastChecked&…

【Linux基础IO】常见的对文件操作的函数、文件描述符fd、访问文件的本质分析

目录 fopen函数 chdir函数 fclose函数 fwrite和fread函数 open函数 umask函数 write函数 read函数 close函数 文件描述符fd 进程访问文件的本质分析 fopen函数 参数mode: w方式打开文件:1、如果被打开文件不存在,系统会在使用fopen函…

玄机平台流量特征分析-常见攻击事

前言 熟悉常见的攻击流量特征,我们就可以通过主机的一个流量情况来判断主机遭受了何种攻击。这里来看看玄机平台的一道题目。 步骤1.1 这里需要我们找出恶意扫描者,也就是黑客的ip。下载好附件之后用wiresharke打开,直接筛选http协议的流量…

CSS【实战】抽屉动画

效果预览 技术要点 实现思路 元素固定布局(fixed)在窗口最右侧外部js 定时器改变元素的 right 属性,控制元素移入,移出 过渡动画 transition transition: 过渡的属性 过渡的持续时间 过渡时间函数 延迟时间此处改变的是 right …

C# Winform 侧边栏,切换不同页面

在项目中我们经常遇到需要在主界面上切换不同子页面的需求,常用做法是左侧显示子页面菜单,用户通过点击左侧菜单,实现右边子页面的展示。 实例项目实现: 项目左侧侧边栏实现FlowLayoutPanel使用显示不同子窗体 实例链接&#xf…

行业模板|DataEase应用平台对接大屏模板推荐

DataEase开源数据可视化分析工具于2022年6月发布模板市场(https://templates-de.fit2cloud.com),并于2024年1月新增适用于DataEase v2版本的模板分类。模板市场旨在为DataEase用户提供专业、美观、拿来即用的大屏模板,方便用户根据…

利用深度学习进行纹理分析以改善计算机视觉

利用深度学习进行纹理分析以改善计算机视觉 人工智能的一个独特应用领域是帮助验证和评估材料和产品的质量。在IBM,我们开发了创新技术,利用原生移动、专用微传感器技术和AI来提供实时工作的解决方案,利用商用智能手机技术,并提供…

.NET周刊【6月第3期 2024-06-18】

国内文章 记一次 .NET某游戏币自助机后端 内存暴涨分析 https://www.cnblogs.com/huangxincheng/p/18243233 文章讨论了程序中非托管内存暴涨的问题。作者描述了友人发现内存问题并请他帮助分析的背景,利用WinDbg工具分析Linux平台上的内存泄漏情况。文章介绍了如…

Jenkins教程-3-github自动化测试任务构建

上一小节我们学习了Jenkins在windows和mac系统上安装搭建环境的方法,本小节我们讲解一下Jenkins构建github自动化测试任务的方法。 接下来我们以windows系统为例,讲解一下构建实际自动化测试任务的具体步骤。 安装git和github插件 点击进入Jenkins插件…

2.什么是计算机程序

什么是计算机程序? 计算机程序是为了告诉计算机"做某件事或解决某个问题"而用"计算机语言编写的命令集合(语句) 只要让计算机执行这个程序,计算机就会自动地、有条不紊地进行工作,计算机的一切操作都是由程序控制的,离开程序,计算机将一事无成 现实生活中你如…

网络安全 - DDoS 攻击原理 + 实验

DDoS 攻击 什么是 DDoS 进攻 D D o S \color{cyan}{DDoS} DDoS(Distributed Denial of Service,分布式拒绝服务)攻击是一种通过多个计算机系统同时向目标系统发送大量请求,消耗其资源,使其无法正常服务的攻击方式。DD…

经验分享,在线文本比较工具

这里分享一个在线文本比较工具,打开网页即用,很方便 网址: https://www.jq22.com/textDifference 截图: