Git:多人协作

news2025/4/8 0:35:12

目录

多人协作一

准备工作

开发者1准备工作

开发者2准备工作

协作开发

将内容合并进master

多人协作二

开发者1进行工作

开发者2进行工作

特殊场景

将内容合并进master


之前所学习的Git操作,是为了多人协作开发做铺垫的,因为在公司中,一个项目肯定是很多开发人员一起开发的,下面就详细讲述多人协作开发相关知识

多人协作一

首先我们制定一个多人协作的工作目标:远程master分支下file.txt文件新增代码"aaa"、"bbb"

目前远程master分支下的 file.txt 文件的代码只有两行:

实现要求:由开发者1新增"aaa",由开发者2新增"bbb"

条件:两个开发者在一个分支(自己创建的分支)下协作完成

我们模拟两个开发者时:
在我们自己的云服务器上开发,当做是第一个开发者
另一名开发者我们可以在Windows系统下,把仓库克隆下来,当做第二个开发者


准备工作

因为是需要两个开发者在同一个分支下协作完成, 所以首先需要自己创建一个分支,我们既可以在本地创建也可以在远程仓库gitee上创建,下面首先演示在gitee上创建:

点击分支:

点击新建分支:

命名为dev:

此时就会显示创建出的dev分支:


开发者1准备工作

首先在云服务器上进行开发者1的准备工作:

此时远程仓库的分支如下:

本地有一个本地master分支,还有一个远程的master分支:

因为在远程创建了dev分支后,本地看不到这个dev分支,所以需要 pull 拉取操作:
master和master分支会自动建立连接,所以直接直接 git pull 即可

此时本地的分支状态如下所示:


开发者2准备工作

再在Windows系统下进行开发者2的准备工作:

创建一个文件夹,将这个 remote-gitcode 仓库克隆到本地:

此时开发者2的分支状态就是:

整体的状态如下:

此时开发1和开发者2的准备工作就完成了


协作开发

下面的任务就是让开发者1在dev分支下新增 aaa 代码,开发者2也在dev分支下新增 bbb 代码

首先在云服务上,查看分支的情况:

  • 对于本地来说只有一个 master 主分支
  • 对于远程来说,有 master 和 dev 两个分支

我们之前跟大家交代过了,对于所有本地的修改,必须在本地分支上进行操作,再通过 git push 的操作,将本地的提交推送至远程的某一个分支下

我们不能直接切到远程的某一个分支下进行修改,因为如果直接这样修改,远程仓库的代码直接被改变,那么 push、pull 操作还有什么意义呢,所以 git 是不支持去切换到远程的某一个分支下进行开发的

而此时我们本地是没有 dev 分支的,所以我们可以创建一个本地分支出来,下面执行:
git checkout -b dev origin/dev

上述命令的意义是:

  • 在本地创建一个 dev 分支,并切换到本地的 dev 分支上
  • 将本地的 dev 分支和远程的 dev 链接起来

我们想要查看建立的连接,可以执行 git branch -vv

之所以要这样建立连接,意义就是:
在我们后徐操作中,想要执行 git push / git pull 这些命令时,就可以直接执行 git push / git pull,不需要在后面跟上非常长的后缀来建立连接了


下面就可以在本地的 dev 分支上对 file.txt 文件进行修改了,添加上 aaa:

修改完成后,执行 add、commit 命令,再调用 git status 查看状态,提示我们接下来需要执行 git push 操作推送到远程仓库中去:

由于上面已经将本地的 dev 分支和远程的 dev 分支建立好连接了,所以直接执行 git push 即可:

此时就推送到远程了,接下来观察远程仓库的 dev分支下的 file.txt 文件是否发生了改变:

开发者1的工作就完成一大半了,此时远程仓库的 dev 分支的 file.txt 文件中也有了 aaa 内容


下面是开发者2进行操作,在刚刚克隆仓库的位置,打开 git bash here,进行命令行式的操作,查看当前的分支:

下面在 Windows 系统下也创建一个 dev 分支,一般建议与远程仓库的 dev 分支进行连接,但是上面已经演示了连接的情况,所以在开发者2这里就演示不连接的情况
直接执行 git checkout -b dev

此时查看连接情况,发现确实本地的 dev 分支并没有与远程仓库的 dev 分支建立连接:

此时因为我们没有连接,如果直接执行 git pull 命令的话,就会报错,并提示我们需要执行下面框出来的操作才能正确的 pull:

所以我们就将这个复制下来,将 <branch> 修改为 dev 即可:

此时再执行 git branch -vv 查看连接情况,就可以发现本地的 dev 分支与远程的 dev 分支建立了连接:


由于开发者2在克隆的时候,远程仓库的 file.txt 文件中只有前两行代码,还没有开发者1新增的 aaa 内容,这是正常的,开发者2的工作内容就是新增自己的 bbb 即可,所以直接打开 file.txt,新增 bbb:

保存退出后,执行 add、commit、push 操作,但是却有下面的报错:

报错信息告诉我们:远程拒绝了我们的推送操作,是当前的分支和远程的分支是有一定差异的,差异的原因是远程仓库的 dev 分支是有 aaa 的,而本地仓库的 dev 分支下是有 bbb 内容的,都是在 file.txt 文件中存在的,此时它们是有一个冲突的

如果git允许推送,那么 aaa 和 bbb 都是在 file.txt 的第三行的内容,git并不清楚我们是需要 aaa 还是需要 bbb,所以git就直接拒绝推送请求,我们需要人工手动的解决这个冲突

上面的黄色字体也告诉我们解决方法就是:先执行 git pull 将远程仓库的 dev 分支的内容拉取到本地来,我们进行完冲突解决后,再推送至远程即可:

此时 file.txt 文件如下:

我们手动将内容改为我们想要的即可:

修改完后,再执行 add、commit、push 三板斧,就能够推送成功了:

下面打开远程仓库 dev 分支下的的 file.txt 文件,就有了 aaa 和 bbb 的代码:

此时就做到了开发者1和开发者2在远程的 dev 分支上做到了新增的代码,下面完成最后一步,在 master 分支上也新增这两行代码,也就是将 dev 合并到 master 分支上


将内容合并进master

远程仓库的 dev 分支上多了 aaa 和 bbb,但是 master 分支上并没有多这两行代码

原因就是 master 分支没有进行 merge 操作,没有将 dev 分支的内容 merge 进 master 分支下

接下来有两种方式可以合并:

  • 提出一个 pull request 合并申请单,管理员同意后,就可以进行 merge 操作了(这里的 pull request 在前面有提到过)
  • 让本地的 master 分支 merge dev 分支,再将本地的 master 分支 push 推送到远程仓库中

方式一:PR申请单

 pull request 操作如下, 点击新建:

源分支选择 dev 分支,目标分支选择 master 分支,再添加相关的信息,点击创建就可以完成:

这种方式中的审查员,实际上在公司中对应的是老板或项目经理,是为程序员缩写的代码提供保障性的


方式二:本地合并再推送

我们上面的开发者1和开发者2都完成了自己的任务,以开发者1为例,开发者1并没有开发者2新增的 bbb 代码,所以开发者1需要先 pull 远程的 dev 分支,保证代码的完整性

开发者1此时的 file.txt 文件内容为:

执行 git pull 操作后:

此时对于开发者1来说 dev 分支上就有了 aaa 和 bbb 了


在之前提到过,如果直接使用 master 分支合并 dev 分支,可能会发送冲突,而 master 分支是比较重要的,不应该出现这些问题

所以我们的策略就变为:使用 dev 分支去合并 master 分支,如果有冲突的话就在本地的 dev 分支下解决,不会影响 master 分支,如果没有冲突再让 master 分支合并 dev 分支即可

在 dev 分支合并 master 前,需要保证此时本地的 master 分支是最新的,因为远程的 master 分支有可能会添加新的内容,所以第一步是本地的 master 分支执行 pull 操作,保证本地的 master 分支与远程的 master 分支的内容是一样

master 分支执行 pull 操作

dev merge master

此时 dev 分支合并 master 分支后并没有冲突问题,所以就可以 master 分支上合并 dev 分支

此时本地仓库的 master 分支的 file.txt 文件为:

本地 master 推送到 远程仓库的 master:

此时远程仓库中 master 分支下的 file.txt 文件,就有了 aaa 和 bbb 内容了:


到此为止,就完成了我们的目标,此时我们创建的 dev 分支就没有任何用处了,就可以进行删除操作了

点击管理:

点击右边的删除图标:

此时就只剩下 master 分支了:


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

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

因为上述的第三点,合并有冲突需要解决冲突,而解决冲突是较为麻烦的,所以在同一分支下多人协作是不常见的, 所以接下来所讲的多人协作二,是在不同分支下的多人协作的场景


多人协作二

首先我们制定一个多人协作的工作目标:远程 master 分支下新增 function1 和 function2 文件

实现要求:由开发者1新增 unction1 ,由开发者2新增 function2

条件:两个开发者在不同分支下协作完成(各自让某一个功能私有某一个分支)

我们目前关注的仓库如下:

下面就需要创建分支完成任务了,有两种方式:

  • 远程创建分支
  • 本地创建分支,先 pull,再 push 到远程

推荐第一种,因为远程创建分支是直接基于远程的 master 分支进行创建,可以保证是最新的代码,而本地创建分支并不能保证是最新的代码


开发者1进行工作

首先在开发者1这里,创建一个 feature-1 分支,并切换到 feature-1 分支:

在这个分支中创建 function1 文件:

接着执行 add、commit 操作:

由于本地和远程没有建立链接,所以还不能进行 push 操作,但是我们可以直接将 feature-1 分支直接推送到远端:

git push origin feature-1

此时观察分支情况,本地和远端都有了 feature-1 分支:

在 gitee 上也能看到新增的 feature-1 分支:

feature-1 分支中的 function 文件也有了新增的代码:

所以此时的图示就变为了:


开发者2进行工作

查看 Windows 下开发者2的分支情况:

此时处于 dev 分支,我们切换到 master 分支上:

此时的 master 分支不是最新的,因为在上面的 多人协作一 中,我们已经给 file.txt 文件中新增了 aaa 和 bbb,而开发者2的 file.txt 的内容并没有更新:

所以首先需要 pull,拉取最新的代码:


此时就可以新建一个 feature-2 分支:

由于是在 Windows 下,所以直接右键创建一个 function2 文件即可:

此时与开发者1一样,先 add、commit:

再直接将 feature-2 分支推送到远端: git push origin feature-2

此时 gitee 上就有三个分支了:

此时的 feature-2 分支下的 function2 文件内容也推送上来了:

我们发现不同的开发者在各自的分支中开发,最终推送到远端,是没有冲突的,直到最后合并时才可能会有冲突

相比于多人在同一分支开发来说,多人在不同分支下开发是非常方便的 

此时的图示变为:


特殊场景

正常情况下,两个开发者就可以在自己的分支上进行专业的开发了

但是天有不测风云,你的小伙伴突然生病了,但需求还没开发完,需要你帮他继续开发,于是他便把 feature-2 分支名告诉你了,这时你就需要在自己的机器上切换到 feature-2 分支帮忙继续开发,所以下面需要开发者1帮助开发者2完成

也就是开发者1需要切换到 feature-2 分支下进行开发

开发者1的分支情况如下,看不到远程的 feature-2 分支:

所以第一步是使用 pull 拉取远程的 feature-2 分支:

git pull 的两种场景:

  • 拉取分支内的内容 (需要关联远程仓库的分支)
  • 拉取仓库的内容

拉取到远程的 feature-2 分支后,我们在本地也创建 feature-2 分支,并关联到远程的 feature-2 分支:git checkout -b feature-2 origin/feature-2

下面就 vim 打开 function2 文件,继续开发:

此时就可以进行 add、commit、push 三板斧了,因为刚刚建立好链接了,所以可以直接 push:

此时远程仓库 gitee 上,feature-2 分支上的 function2 文件内容也更新了:


到这时,开发者2的病好了,开发者2就继续在 Windows 下开发,此时开发者2并看不到开发者1帮忙写的代码:

所以此时开发者2就需要进行 pull 拉取操作,将远程仓库的 feature-2 分支的内容同步到本地分支上,但是此时直接 pull 是会失败的,因为 开发者2 并没有与远程仓库的 feature-2 分支建立连接

所以下面先建立连接,再 pull:

查看 function2 文件,拉取成功:


开发者2 再加上最后一行内容:

继续执行 add、commit、push:

远程仓库 gitee 也同步了更新的代码:


将内容合并进master

开发者1和开发者2的工作已经完成了,最后一件事就是将 feature-1 分支和 feature-2 分支合并进 master 主分支中

这次的合并,我们可以选择发起 pull request 申请单的方式合并,并点击创建 pull request:

假设作为审查人员的我们,打开 pull request,往下翻,点开文件,就能看到源分支和目标分支的差异:

如果代码没有问题,我们就点击已阅,通过,点击提交:

接着点击合并分支:

点击接收 pull request:

此时 pull request 上方,就会显示已合并:

此时 master 分支就有了 function2.txt 文件了:

 

也就是下面的流程:


feature-2 分支已经合并完成了,现在还剩下 feature-1 分支,有一些细节需要注意,下面详细说明

目前的合并流程为:

期望的操作是:

但是在 feature-1 合并进 master 主分支时,可能是有冲突的,所以如果有冲突的话是需要解决冲突的,这里就又回到了我们之前说到的解决冲突的方法

我们不能直接用 master 分支合并 feature-1 分支,这里有可能将 master 分支在解决冲突的过程中解决坏了,所以方法就是:先让 feature-1 分支去合并 master 分支,合并完冲突后,再让 master 分支合并 feature-1 分支,此时就不会有什么问题了

所以图示为:


下面实操一下上述的两步

feature-1 分支 merge master 分支

首先切到本地的 master 分支,pull 一下代码,不论本地当前是不是最新的代码,这都是一个好习惯:

再切换到 feature-1 分支上,让 feature-1 分支 merge master 分支:git merge master
此时出现下面的页面,表示 merge 的时候没有出现任何冲突,按下 Ctrl + x 退出即可:

此时本地合并完后,执行 push 推送到远程仓库:

下面 feature-1 分支合并完 master 分支后,没有任何冲突,此时就可以按照前面 master 分支合并 feature-2 分支的方式合并

也就是提交 pull request,审核人员审核通过即可:

接着已阅、通过、提交:

 再点击接受 pull request

此时 master 分支上,关于开发者1和开发者2的代码就全部合并上了:

最后再删除 feature-1 分支和 feature-2 分支即可


git branch -a 打印已被删除的远程分支

我们在远程仓库中已经删除了 feature-1 和 feature-2 分支了,远程仓库只剩 master 分支了:

但是 git branch -a 仍然会打印已被删除的远程分支

我们可以执行:git remote show origin,用于展示远程分支的情况:

在我们已经删除的 dev、feature-1、feature-2 分支后显示是 stale 状态,也就是陈旧的状态,推荐我们执行 git remote prune origin,即可移除执行 git branch -a 时已经在远程删除的这几个分支
此时再次执行 git branch -a 时,就不会显示远程已经删除的分支了

如果想删除本地的 dev 分支,执行 git branch -d dev 即可:


Git:多人协作到此结束

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

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

相关文章

JSX基础 —— 识别JS表达式

在JSX中可以通过 大括号语法 { } 识别JS中的表达式&#xff0c;比如常见的变量、函数调用、方法调用等等 1、使用引号传递字符串 2、使用JavaScript变量 3、函数调用和方法调用 (函数和方法本质没有区别&#xff0c;这里默认&#xff1a; 函数是自己定义的&#xff0c;方法是…

docker镜像和容器(二)

在开始这篇文章之前&#xff0c;有几个需要了解的概念 docker镜像是什么 docker镜像是什么(有兴趣可以参考一下这篇知乎的回答) 文章这里引用一个回答 电脑装系统的时候&#xff0c;需要一张盘&#xff0c;我们称其为镜像&#xff0c;镜像是一个固定的文件&#xff0c;这次读…

Unity XR-XR Interaction Toolkit开发使用方法(十)组件介绍(XR Interaction Group)

目录 一、插件介绍 二、主要组件 XR Interaction Manager XR Controller XR Interactor XR Direct Interactor XR Ray Interactor XR Socket Interactor XR Gaze Interactor 三、XR Interaction Group 1、组件介绍 2、核心功能与特点 优先级与冲突管理 动态交互切…

【2025.2.25更新】wordpress免费AI插件,文章内容、图片自动生成、视频自动生成、网站AI客服、批量采集文章,内置deepseek联网满血版

wordpress免费AI插件&#xff0c;文章内容、文章图片、长尾关键词、视频自动生成、网站AI客服、批量采集文章&#xff0c;插件已接入腾讯云大模型知识引擎xDeepSeek&#xff0c;基于腾讯云大模型知识引擎xDeepSeek可联网满血版&#xff0c;插件可实现文章生成、长尾关键词生成、…

ISIS(中间系统到中间系统)——基础

ISIS是一项通用的动态路由协议&#xff0c;其隶属于链路状态路由协议&#xff0c;最初运行与OSI七层的网络层&#xff0c;采用组播地址224.0.0.14和224.0.0.15两个组波段&#xff0c;由于其较高的拓展性与高速收敛&#xff0c;被大多数运营商网络所使用 起源 ISIS最初是由国际…

DeepSeek 开源狂欢周(二)DeepEP深度技术解析 | 解锁 MoE 模型并行加速

在大模型时代&#xff0c;Mixture-of-Experts (MoE) 模型凭借其强大的容量和高效的计算能力&#xff0c;成为研究和应用的热点。然而&#xff0c;MoE 模型的训练和推理面临着巨大的专家并行通信挑战。近日&#xff0c;DeepSeek 开源了 DeepEP 项目&#xff0c;为解决这一难题提…

Linux网络之传输层协议(UDP,TCP协议)

目录 重新认识端口号 端口号划分 netstat pidof UDP协议 UDP的特点 面向数据报 UDP的缓冲区 全双工和半双工 TCP协议 TCP的特点 TCP报头分析 源端口&#xff0c;目标端口&#xff0c;数据偏移(报文首部长度) 序号 确认号 窗口 6个标志位 ACK SYN …

HTML第二节

一.列表 1.列表的简介 2.无序列表 注&#xff1a;1.ul里面只能放li&#xff0c;不能放标题和段落标签 2.li里面可以放标题和段落等内容 3.有序列表 4.定义列表 注&#xff1a;要实现上图的效果需要CSS 二.表格 1.表格介绍 注&#xff1a;1.th有额外的效果&#xff0c;可以…

坐标变换及视图变换和透视变换(相机透视模型)

文章目录 2D transformationScaleReflectionShear&#xff08;切变&#xff09;Rotation around originTranslationReverse变换顺序复杂变换的分解 齐次坐标&#xff08;Homogenous Coordinates&#xff09;3D transformationScale&TranslationRotation Viewing / Camera t…

Vue 表单优化:下拉框值改变前的确认提示与还原逻辑实现

在开发表单类功能时&#xff0c;我们经常需要对用户的重要操作进行确认提示&#xff0c;以避免误操作导致的数据丢失或错误。本文将通过一个实际案例&#xff0c;介绍如何在 Vue 中实现下拉框值改变前的确认提示&#xff0c;并在用户取消操作时还原原始值。 场景描述 在项目中…

使用mermaid查看cursor程序生成的流程图

一、得到cursor生成的流程图文本 cursor写的程序正常运行后&#xff0c;在对话框输入框中输入诸如“请生成扫雷的代码流程图”&#xff0c;然后cursor就把流程图给生成了&#xff0c;但是看到的还是文本的样子&#xff0c;保留这部分内容待用 二、注册一个Mermaid绘图账号 …

(八)趣学设计模式 之 装饰器模式!

目录 一、 啥是装饰器模式&#xff1f;二、 为什么要用装饰器模式&#xff1f;三、 装饰器模式的实现方式四、 装饰器模式的优缺点五、 装饰器模式的应用场景六、 装饰器模式 vs 代理模式七、 总结 &#x1f31f;我的其他文章也讲解的比较有趣&#x1f601;&#xff0c;如果喜欢…

JVM线程分析详解

java线程状态&#xff1a; 初始(NEW)&#xff1a;新创建了一个线程对象&#xff0c;但还没有调用start()方法。运行(RUNNABLE)&#xff1a;Java线程中将就绪&#xff08;ready&#xff09;和运行中&#xff08;running&#xff09;两种状态笼统的称为“运行”。 线程对象创建…

毕业项目推荐:基于yolov8/yolo11的野生菌菇检测识别系统(python+卷积神经网络)

文章目录 概要一、整体资源介绍技术要点功能展示&#xff1a;功能1 支持单张图片识别功能2 支持遍历文件夹识别功能3 支持识别视频文件功能4 支持摄像头识别功能5 支持结果文件导出&#xff08;xls格式&#xff09;功能6 支持切换检测到的目标查看 二、数据集三、算法介绍1. YO…

DeepSeek 助力 Vue3 开发:打造丝滑的页眉(Header)

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…

PHP应用程序设计:一个实际的例子(3)

使应用程序适用于网络 如果你正好计划用P H P开发你自己的服务程序&#xff08;或者其他一些相似的东西&#xff09;&#xff0c;请重新思考一下。你可能已经对这些思想有些迷惑了&#xff1a;实现一个聊天服务程序意味着实现一个网络服务程序。这是我们实际上介绍给大家的东西…

RabbitMQ 的介绍与使用

一. 简介 1> 什么是MQ 消息队列&#xff08;Message Queue&#xff0c;简称MQ&#xff09;&#xff0c;从字面意思上看&#xff0c;本质是个队列&#xff0c;FIFO先入先出&#xff0c;只不过队列中存放的内容是message而已。 其主要用途&#xff1a;不同进程Process/线程T…

OpenCV给图像添加噪声

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 如果你已经有了一张干净的图像&#xff0c;并希望通过编程方式向其添加噪声&#xff0c;可以使用 OpenCV 来实现这一点。以下是一个简单的例子&a…

Elasticsearch:使用阿里云 AI 服务进行嵌入和重新排名

作者&#xff1a;来自 Elastic Toms Mura 将阿里云 AI 服务功能与 Elastic 结合使用。 更多阅读&#xff0c;请参阅 “Elasticsearch&#xff1a;使用阿里 infererence API 及 semantic text 进行向量搜索”。 在本文中&#xff0c;我们将介绍如何将阿里云 AI 功能与 Elastics…

管理后台环境配置

后端配置及启动 a. 软件安装 1. Java sdk 1.8 2. maven 3.6 3. intellij IDEA 2024 4. Visual C Redistributable 5. mongodb 7.0 6. mysql 8.0 双击安装&#xff1a;mysql-installer-community-8.0.41.0.msi 版本选择&#xff1a;Full&#xff0c;包括服务器和客户端 …