【Git 小妙招】学习多人协作场景(万字图文讲解+实战练习)

文章目录

  • 前言
  • 1. 多人协作(场景一)
  • 2. 多人协作(场景二)
  • 3. 解决一个问题
  • 总结


前言

还记得我们学习 Git 是为了什么吗? 当然是实现多人协作了. 在学习了解博主前面关于 Git 的文章后, 我们就可以模拟来进行一些超超超简单的多人协作场景了. 本文就简单举两个多人协作的例子.

关注收藏, 开始学习吧🧐


1. 多人协作(场景一)

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

  • 基本完成 Git 的所有本地库的相关操作,Git 基本操作,分⽀理解,版本回退,冲突解决等等
  • 申请码云账号,将远端信息 clone 到本地,以及推送和拉取。

以上操作感觉还未学习的读者, 请阅读博主 Git 系列文章.

是时候⼲最重要的⼀件事情了,实现多⼈协作开发!为了做这件事情,我们需要先做⼀些准备⼯作。

我们之前已经将项⽬ clone 到了指定⽬录,如:

在这里插入图片描述

接下来我们在 windows 环境下,再 clone 同⼀个项⽬仓库,来模拟和你⼀起协作开发的另⼀名⼩伙伴:

在这里插入图片描述

clone 成功

在这里插入图片描述

注意,在这里我们是用我的同一个账户模拟了两个⽤⼾,实际开发中,每个⽤⼾都有⾃⼰的 gitee/github 账号,如果要多⼈进⾏协同开发,必须要将⽤⼾添加进开发者,⽤⼾才有权限进⾏代码提交:

在这里插入图片描述

邀请用户, 有三种邀请方式, 任选其一即可:

在这里插入图片描述

到此,相当于有了两个⽤⼾,分别在 linux 和 windows 上针对于同项⽬进⾏协作开发,我们的准备⼯作到此结束。

⽬前,我们的仓库中只有⼀个 master 主分⽀,但在实际的项⽬开发中,在任何情况下其实都是不允许直接在 master 分⽀上修改代码的,这是为了保证主分⽀的稳定。所以在开发新功能时,常常会新建其他分⽀,供开发时进⾏迭代使⽤。

那么接下来,就让我们在 gitee 上新建 dev 远程分⽀供我们使⽤:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

创建成功:

在这里插入图片描述

创建成功的远程分⽀是可以通过 Git 拉取到本地来,以实现完成本地开发⼯作。

接下来让我们和另⼀名开发的⼩伙伴都将远程仓库进⾏⼀次拉取操作,并观察结果:

对于我们要进行操作的是(Linux 系统上):

在这里插入图片描述

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

在这里插入图片描述

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

对于小伙伴要进行的操作是(Windows 系统上):

在这里插入图片描述

现在,你和你的⼩伙伴就可以在 dev 上完成开发。

⾸先,让我们在 dev 分⽀上进⾏⼀次开发,并 push 到远程。例如:

root@iZ2ze7exqfegl4m4g4l9hdZ:~/test_dir/git-test# vim file.txt
root@iZ2ze7exqfegl4m4g4l9hdZ:~/test_dir/git-test# cat file.txt
hello git
complete the first function!
root@iZ2ze7exqfegl4m4g4l9hdZ:~/test_dir/git-test# git add file.txt
root@iZ2ze7exqfegl4m4g4l9hdZ:~/test_dir/git-test# git commit -m "first function"
[dev 59498d7] first function
 1 file changed, 1 insertion(+)
root@iZ2ze7exqfegl4m4g4l9hdZ:~/test_dir/git-test# git push origin dev
Username for 'https://gitee.com': whisper_2021
Password for 'https://whisper_2021@gitee.com': 
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 2 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 285 bytes | 285.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
remote: Powered by GITEE.COM [GNK-6.4]
To https://gitee.com/Whisper_2021/git-test.git
   245b9dd..59498d7  dev -> dev

让我们来看看码云上⽬前仓库的状态:

在这里插入图片描述

⾄此,我们已经将代码成功推送⾄码云,接下来假如你的⼩伙伴要和你协同开发,碰巧也要对 file.txt ⽂件作修改,并试图推送,例如:

在这里插入图片描述
这时推送失败,因为你的⼩伙伴的最新提交和你推送的提交有冲突,解决办法也很简单,Git 已经提⽰我们,先⽤ git pull 把最新的提交从 origin/dev 抓下来,然后,在本地进⾏合并,并解决冲突,再推送。操作如下:

在这里插入图片描述

解决冲突, 重新推送:

在这里插入图片描述

此时,我们看到远端的码云已经能看到我们的新提交了!

在这里插入图片描述

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

对于你来说,要想看到⼩伙伴的代码,只需要 pull ⼀下即可,例如:

在这里插入图片描述

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

  1. 切换⾄ master分⽀, pull ⼀下,保证本地的 master 是最新内容。
    在这里插入图片描述
  2. 切换⾄ dev 分⽀, 合并 master 分⽀,这么做是因为如果有冲突,可以在dev分⽀上进⾏处理,⽽不是在在master上解决冲突。
    在这里插入图片描述
  3. 切换⾄ master 分⽀,合并 dev 分⽀。
    在这里插入图片描述
  4. 将 master 分⽀推送⾄远端。
    在这里插入图片描述
    此时,查看远端仓库,master已经是最新代码了:
    在这里插入图片描述
    此时,dev 分⽀对于我们来说就没⽤了, 那么 dev 分⽀就可以被删除掉。我们可以直接在远程仓库中将dev分⽀删除掉:
    在这里插入图片描述

总结⼀下,在同⼀分⽀下进⾏多⼈协作的⼯作模式通常是这样:

  • ⾸先,可以试图⽤ git push origin branch-name 推送⾃⼰的修改;
  • 如果推送失败,则因为远程分⽀⽐你的本地更新,需要先⽤ git pull 试图合并;
  • 如果合并有冲突,则解决冲突,并在本地提交;
  • 没有冲突或者解决掉冲突后,再⽤ git push origin branch-name 推送就能成功!
  • 功能开发完毕,将分⽀ merge 进 master,最后删除分⽀。

2. 多人协作(场景二)

⼀般情况下,如果有多需求需要多⼈同时进⾏开发,是不会在⼀个分⽀上进⾏多⼈开发,⽽是⼀个需求或⼀个功能点就要创建⼀个 feature 分⽀。

现在同时有两个需求需要你和你的⼩伙伴进⾏开发,那么你们俩便可以各⾃创建⼀个分⽀来完成⾃⼰的⼯作。在上个部分我们已经了解了可以从码云上直接创建远程分⽀,其实在本地创建的分⽀也可以通过推送的⽅式发送到远端。在这个部分我们就来⽤⼀下这种⽅式。

对于你来说,可以进⾏以下操作(Linux 系统上):

  1. 新增本地分支 feature-1 并切换
    在这里插入图片描述
  2. 新增需求内容, 创建 function1 文件
    在这里插入图片描述
  3. 将 feature-1 分支推送到远端
    在这里插入图片描述

对于小伙伴来说,可以进行以下操作(Windows 系统上):

  1. 创建并切换到 feature-2 分支
    在这里插入图片描述
  2. 在分支下为需求新增 function2 文档
    在这里插入图片描述
  3. 将 feature-2 分支推送至远端
    在这里插入图片描述

此时,在本地,你看不⻅他新建的⽂档,他看不⻅你新建的⽂档。并且推送各⾃的分⽀时,并没有任何冲突,你俩互不影响,⽤起来很舒服!!

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

在这里插入图片描述

对于你的 feature-1 分支

在这里插入图片描述

对于⼩伙伴的 feature-2 分⽀:

在这里插入图片描述

正常情况下,你俩就可以在⾃⼰的分⽀上进⾏专业的开发了!

但天有不测⻛云,你的⼩伙伴突然⽣病了,但需求还没开发完,需要你帮他继续开发,于是他便把 feature-2 分⽀名告诉你了。这时你就需要在⾃⼰的机器上切换到 feature-2 分⽀帮忙继续开发,要做的操作如下:

  1. 必须先拉取远端仓库的内容
    在这里插入图片描述
  2. 可以看到远程分支中已经有了 feature-2
    在这里插入图片描述
  3. 切换到 feature-2 分支上, 可以和远程的 feature-2 分支关联起来, 否则将来只使用 git push 推送内容会失败
    在这里插入图片描述

切换成功后,便可以看⻅ feature-2 分⽀中的 function2 ⽂件了,接着就可以帮⼩伙伴进⾏开发:

  1. 继续开发
    在这里插入图片描述
  2. 推送内容
    在这里插入图片描述

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

在这里插入图片描述
这时,你的⼩伙伴已经修养的差不多,可以继续进⾏⾃⼰的开发⼯作,那么他⾸先要获取到你帮他开发的内容,然后接着你的代码继续开发。或者你已经帮他开发完了,那他也需要在⾃⼰的电脑上看看你帮他写的代码:

在这里插入图片描述

pull ⽆效的原因是⼩伙伴没有指定本地 feature-2 分⽀与远程 origin/feature-2 分⽀的链接,根据提⽰,设置 feature-2 和 origin/feature-2 的链接即可:

在这里插入图片描述

⽬前,⼩伙伴的本地代码和远端保持严格⼀致。你和你的⼩伙伴可以继续在不同的分⽀下进⾏协同开发了。

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

由于你的⼩伙伴率先开发完毕,于是开始 merge

  1. 切换至 master, pull 一下, 保证本地 master 是最新内容
    在这里插入图片描述
  2. 切换至 feature-2 分支, 合并 master 分支
    在这里插入图片描述
  3. 切换至 master 分支, 合并 feature-2 分支
    在这里插入图片描述
  4. 将 master 分支推送至远端
    在这里插入图片描述

此时远程仓库的状态:

在这里插入图片描述

当你的⼩伙伴将其代码 mergemaster 后,这时你也开发完成了,也需要进⾏ mergemaster 操作,于是你:

  1. 切换至 master 分支, pull 一下, 保证本地的 master 是最新内容
    在这里插入图片描述
  2. 切换至 feature-1 分支, 合并 master 分支
    在这里插入图片描述
  3. 由于 feature-1 分支已经 merge 了新内容, 为了保证远程分支最新, 最好先 push 一下
    在这里插入图片描述
  4. 切换至 master 分支, 合并 feature-1 分支
    在这里插入图片描述
  5. 将 master 分支推送至远端
    在这里插入图片描述

此时远程仓库的状态:

在这里插入图片描述

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

在这里插入图片描述

这就是多⼈协作的⼯作模式,⼀旦熟悉了,就⾮常简单。

3. 解决一个问题

有细心的读者应该可以发现, 在远程分⽀删除后,本地 git branch -a 依然能看到已经被删除掉的分支.

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

这样就删除了那些远程仓库不存在的分⽀。而对于本地仓库的删除,之前的博文也已经提到了,⼤家可以⾃⾏进行操作。


总结

✨ 本文主要讲解了如何使用 Git 进行多人协作开发, 举了两个简单的场景进行演示, 并在文章结尾处解决了一个问题.
✨ 想了解更多知识, 请持续关注博主, 本人会不断更新学习记录, 跟随我一起不断学习 -> 跳转Git专栏.
✨ 感谢你们的耐心阅读, 博主本人也是一名学生, 也还有需要很多学习的东西. 写这篇文章是以本人所学内容为基础, 日后也会不断更新自己的学习记录, 我们一起努力进步, 变得优秀, 小小菜鸟, 也能有大大梦想, 关注我, 一起学习.

再次感谢你们的阅读, 你们的鼓励是我创作的最大动力!!!!!

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

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

相关文章

C++ 强制类型转换static_cast<typeName>

C允许通过强制类型转换机制显式地进行类型转换。强制类型转换的格式有两种。 如: 为将存储在变量nData中的int值转换为long类型,可以使用下面的表达式中的一种: (long)nData …

Unity 问题 之 ScrollView ,LayoutGroup,ContentSizeFitter 一起使用时,动态变化时无法及时刷新更新适配界面的问题

Unity 问题 之 ScrollView ,LayoutGroup,ContentSizeFitter 一起使用时,动态变化时无法及时刷新更新适配界面的问题 目录 Unity 问题 之 ScrollView ,LayoutGroup,ContentSizeFitter 一起使用时,动态变化时无法及时刷新更新适配界面的问题 一、简单介绍…

js中将数字转成中文

文章目录 一、实现二、最后 一、实现 如果要将数字10、100和1000转换成中文的"十"、“一百"和"一千”,可以使用以下 JavaScript 代码实现: function numberToChinese(num) {const chineseNums [零, 一, 二, 三, 四, 五, 六, 七, …

最新版 JESD79-5B,2022年,JEDEC 内存SDRAM规范

本标准定义了DDR5 SDRAM规范,包括特性、功能、交流和直流特性、封装以及球/信号分配。本标准旨在为x4、x8和x16 DDR5 SDRAM设备定义符合JEDEC标准的8 Gb至32 Gb的最低要求。该标准是基于DDR4标准(JESD79-4)和DDR、DDR2、DDR3和LPDDR4标准的一…

IP应用场景的规划

IP地址作为互联网通信的基石,在现代社会中扮演着至关重要的角色。本文将深入探讨IP地址在不同应用场景中的规划与拓展,探讨其在网络通信、安全、商业、医疗和智能城市等领域的关键作用与未来发展趋势。 IP地址的基本原理 IP地址是分配给网络上设备的数…

NC65 查询单据所处的流程状态以及流程平台客户端工具类

1、查询单据所处的流程状态 nc.bs.wfengine.engine.EngineService的queryFlowStatus()方法 /*** 查询单据所处的流程状态* * param billId* param billType* param result* return* throws DbException*/public int queryFlowStatus(String billId, String billType, int flo…

每日一练2023.12.23——考试座位号【PTA】

题目链接:L1-005 考试座位号 题目要求: 每个 PAT 考生在参加考试时都会被分配两个座位号,一个是试机座位,一个是考试座位。正常情况下,考生在入场时先得到试机座位号码,入座进入试机状态后,系…

手机无人直播:解放直播的新方式

现如今,随着科技的迅猛发展,手机已经成为我们生活中不可或缺的一部分。除了通讯、娱乐等功能外,手机还能够通过直播功能将我们的生活实时分享给他人。而针对传统的直播方式,使用手机进行无人直播成为了一种全新的选择。 手机无人…

聊聊软件行业那些事

博主介绍:✌全网粉丝5W,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验…

2023-12-22 linux C语言pthread_kill函数,pthread_kill(tid, 0)可以用来判断线程是否存在

一、该函数其实不是kill线程,而是向线程发送一个signal,pthread_kill()函数的作用是向某个线程传递一个信号,创建的线程中signal(SIGKILL,sig_handler)函数去处理对应的信号,如果你给一个线程发送了SIGQUIT、SIGKILL,但…

【vue】开发常见问题及解决方案

有一些问题不限于 Vue,还适应于其他类型的 SPA 项目。 1. 页面权限控制和登陆验证页面权限控制 页面权限控制是什么意思呢? 就是一个网站有不同的角色,比如管理员和普通用户,要求不同的角色能访问的页面是不一样的。如果一个页…

华为鸿蒙(HarmonyOS):连接一切,智慧无限

华为鸿蒙是一款全场景、分布式操作系统,旨在构建一个真正统一的硬件生态系统。该操作系统于2019年8月首次发布,并被设计为可以应用于各种设备,包括智能手机、智能手表、智能电视、车载系统等多种智能设备。 推荐一套最新版的鸿蒙4.0开发教程 …

深度剖析:Golang中结构体方法的高级应用

深度剖析:Golang中结构体方法的高级应用 引言结构体方法的基础回顾结构体的定义和用法方法的定义和绑定基本语法和用法 高级特性与应用封装、继承和多态方法集与接口的关系结构体方法的匿名字段和嵌入结构体 性能优化与最佳实践接收器类型的选择:指针还是…

【QT八股文】系列之篇章1 | QT的基础知识及事件/机制

【QT八股文】系列之篇章1 | QT的基础知识及事件/机制 前言0. 基础Qt/PyQt5介绍/关联Qt的优缺点(为什么要用qt来做界面)Qt 的核心机制请简要介绍一下Qt中的主窗口(MainWindow)类,它有哪些重要的函数和成员变量&#xff…

【K8s】1# 使用kuboard-spray安装K8s集群

文章目录 搭建k8s集群1.推荐配置1.1.服务器配置1.2.软件版本 2.使用Kuboard-Spray安装k8s集群2.1.配置要求2.2.操作系统兼容性2.3.安装 Kuboard-Spray2.4.加载离线资源包2.5.规划并安装集群2.6.安装成功2.7.访问集群 3.涉及的命令3.1.linux 4.问题汇总Q1:启动离线集…

MES系统怎么实现车间管理中的生产计划和排产计划

MES中的生产计划和排产计划都是制造企业中非常重要的概念,它们的目的是为了确保企业能够按时交付高质量的产品,同时还要保持生产效率和成本效益。 一、生产计划 生产计划是指制造企业为了满足客户需求而制定的计划,它包括了制造的数量、时间…

C++类与对象(中)第一篇

目录 前言: 类的六个默认成员函数 构造函数 析构函数 拷贝构造函数 拷贝场景一:函数参数类型为类类型对象 拷贝场景二:利用已存在的对象创建新对象 拷贝场景三:函数返回值类型为类类型对象 前言: 编译器编译类…

JavaScript原型,原型链 ? 有什么特点?

一、原型 JavaScript 常被描述为一种基于原型的语言——每个对象拥有一个原型对象 当试图访问一个对象的属性时,它不仅仅在该对象上搜寻,还会搜寻该对象的原型,以及该对象的原型的原型,依次层层向上搜索,直到找到一个…

Unity中Shader旋转矩阵(四维旋转矩阵)

文章目录 前言一、围绕X轴旋转1、可以使用上篇文章中,同样的方法推导得出围绕X轴旋转的点阵。2、求M~rotate~ 二、围绕Y轴旋转1、可以使用上篇文章中,同样的方法推导得出围绕Y轴旋转的点阵。2、求M~rotate~ 三、围绕Z轴旋转1、可以使用上篇文章中&#x…

离散型制造企业为什么要注重MES管理系统的实施

离散型制造企业经常面临三个核心问题:生产什么、生产多少以及如何生产。尽管许多企业都实施了ERP系统,但仍然绕不开MES管理系统的话题。本文将从三个方面详细解释为什么离散型企业需要实施MES管理系统。 一、生产线经常出现的问题 在离散型企业中&#…