当前位置: 首页 > backend >正文

【Git】多人协作

目录

多人协作一

• 对于我们要操作的是:

• 对于小伙伴要操作的是:

多人协作二

• 对于你来说,可以进行以下操作:

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

多人协作三

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


多人协作一

目前,我们所完成的工作如下:
• 基本完成 Git 的所有本地库的相关操作,git基本操作,分支理解,版本回退,冲突解决等等
• 申请码云账号,将远端信息clone到本地,以及推送和拉取。
是时候干最重要的一件事情了,实现多人协作开发!为了做这件事情,我们需要先做一些准备工作。
我们之前已经将项目 clone 到了指定目录,如:

hyb@139-159-150-152:~/git_teaching$ pwd
/home/hyb/git_teaching

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

Clone 成功

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

邀请用户:

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

首先我们模拟的情况是多人在同一个分支下进项开发的情况。

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

创建成功:

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

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

• 对于我们要操作的是:

之前我们讲的 git branch 其实只能查看本地分支,要查看远程分支需要加上-r选项。git branch -a可以查看本地、远程所有的分支。

这里可以看到本地仓库的远程分支没有dev,因为需要我们pull一下拉取最新的远端仓库,才能看到最新的内容。

拉取后便可以看到远程的 dev 分支,这里需要说明的是我们这里看到的远程仓库的dev、master分支其实是远程仓库的引用,用来完成远程仓库和本地仓库的连接,并不支持我们直接切换到远程的dev进行开发。

此外我们发现这里pull拉取远程仓库并不需要指明具体拉取哪一个远程分支到本地的哪一个分支,这是因为master远程和本地已经完成了连接。对于这种已经完成的连接的分支,git push我们同样可以直接推送同步,不需要指明。

接着切换到 本地dev 分支供我们进行本地开发。

我们本地的dev创建,会自动提示我们dev已经完成设置,可以自动追踪远程仓库的dev分支。这里其实是因为我们本地已经存在远程仓库的dev分支引用,本地的dev会自动根据引用与远程仓库对应分支完成连接(同名分支自动匹配连接)我们可以使用git branch -vv 来查看本地分支原远程分支连接情况,如果连接成功,本地分支后会自动跟上远程仓库分支。

如上图,在本地已经存在远程分支dev引用下,我们使用git checkout -b [dev] [origin/dev]可以创建本地dev分支同时完成与远程仓库分支连接,之后pull/push可以直接使用短命令了

• 对于小伙伴要操作的是:

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

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

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

至此,我们已经将代码成功推送至码云,接下来假如你的小伙伴要和你协同开发,

这时,我们先直接创建dev本地分支,但是这里我们使用的是git checkout -b [name] 命令,我们发现本地与远程分支并没有建立连接,这是我们再pull拉取远程仓库,我们发现出现分支不会自动追踪的情况,我们想要重新建立连接,根据提示,需要使用git branch --set-upstream-to=origin/<branch> dev,手动建立连接

但是这时推送会失败,因为你的小伙伴的最新提交和你推送的提交在远程仓库上是在同一个分支的同一个文件上开发的,修改的位置相同,产生了冲突,

解决办法也很简单,Git已经提示我们,先用 git pull 把最新的提交从origin/dev 抓下来,然后,在本地进行合并,并解决冲突,再推送。操作如下:

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

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

这一步我们可以现在本地master合并dev,再推送到远程仓库master;也可以在远程通过pull request的功能来完成。

所谓的pull request本质上是一份申请单,申请者填写对应的说明交由仓库管理者进行代码的测试审理,审核通过,可以将对应的分支进行合并。(一般审核员的角色是有BOSS或者leader担任的,所以申请单的方式可以更好的保证master的稳定性,实际更推荐这种方式)

本地合并再推送的方式具体步骤:我们需要先pull,确保我们本地分支的版本是最新的,避免后续出现bug,然后master merge dev,并解决冲突,再将master push到 远程。

可以看到远程仓库已经提交成功。

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

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


• 首先,可以试图用 git push origin branch-name 推送自己的修改;


• 如果推送失败,则因为远程分支比你的本地更新,需要先用 git pull 试图合并;


• 如果合并有冲突,则解决冲突,并在本地提交;


• 没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功!


• 功能开发完毕,将分支 merge 进 master,最后删除分支。

多人协作二

一般情况下,如果有多需求需要多人同时进行开发,是不会在一个分支上进行多人开发,而是一个需求或一个功能点就要创建一个feature 分支。(多人协作一中,我们已经发现,多人单分支下开发非常容易冲突,并且我们也需要很多操作去时刻保证分支是最新的)。

现在同时有两个需求需要你和你的小伙伴进行开发,那么你们俩便可以各自创建一个分支来完成自己的工作。在上个部分我们已经了解了可以从码云上直接创建远程分支,其实在本地创建的分支也可以通过推送的方式发送到远端。在这个部分我们就来用一下这种方式。

注:实际开发中其实还是更推荐远程直接创建分支的情况,因为本地创建,我们往往无法保证master分支是最新版本,需要pull拉取一下。


• 对于你来说,可以进行以下操作:

这个时候由于远程没有对应的分支,我们创建feature-1其实并没有与远程分支建立连接。

尝试push会报错(没有连接,我们就无法直接使用git push),这里我们需要git push origin [本地分支名] 直接推送至远端,这时候远端也会自动创建同名分支,并完成连接。

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

但这时对于小伙伴来说,是无法保证本地master是最新最全最稳定的版本,所以需要先pull,之后重复上述操作,创建对应分支,指定分支push。

远端feature-22也成功创建了。

此时,在本地,你看不见他新建的文档,他看不见你新建的文档。并且推送各自的分支时,并没有任何冲突,你俩互不影响,用起来很舒服!!
再来看下远端码云上此时的状态:

对于你的 feature-1 分支:

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

回顾上述方式,我们可以直观的感受到不同分支开发大大降低了冲突的可能。

多人协作三

正常多人协作二情况下,你和小伙伴就可以在自己的分支上进行专业的开发了!
但天有不测风云,你的小伙伴突然生病了,但需求还没开发完,需要你帮他继续开发,于是他便把
feature-2 分支名告诉你了。这时你就需要在自己的机器上切换到 feature-2 分支帮忙继续开发,这个时候其实又回到了多人协作一的情况了。

这里需要说明的是明明我们这里feature-2没有建立连接,为什么我们依然可以使用git pull拉取呢?

其实我们这里git pull拉取的仅仅只是远程仓库下的分支,拉取的是仓库的内容,得到是远程分支的引用,并不是拉取远程分支的内容,所以我们这里即使远程feature-2没有与本地建立连接,依然可以直接使用git push。

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

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

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

Pull 无效的原因是本地已经存在feature-2情况下,直接使用git push拉取的是分支下的内容,不是仓库下的分支,小伙伴没有指定本地 feature-2 分支与远程 origin/feature-2 分支的链接,根据提
示,设置feature-2和origin/feature-2的链接即可:

目前,小伙伴的本地代码和远端保持严格一致。你和你的小伙伴可以继续在不同的分支下进行协同开发了。
各自功能开发完毕后,不要忘记我们需要将代码合并到master中才算真正意义上的开发完毕。
由于你的小伙伴率先开发完毕,于是开始 merge,这里我们使用PR申请单方式,先将feature-2合并到master :

到此feature-2完成合并。

当你的小伙伴将其代码merge 到master 后,这是你也开发完成了,也需要进行 merge 到
master 操作,这个时候也是可以使用PR方式进行合并,但是目前的提交流程如下图,我们发现feature-1其实已经落后master版本了,我们其实是无法保证直接将远程feature-1合并到master不出现冲突,所以这里不推荐PR直接合并的。

为了更保险的做法,这里我们其实应该先在本地将远程master拉取到本地,feature-1合并master,解决冲突,push到远程,再在远程上PR合并feature-1(其实之前feature-2合并方式也不太安全,实际上应该按照这种方式合并)。

先pull,保证版本最新。

发现feature-1并没有与远程连接,我们这里指定分支push

最后重复上述PR操作,远程合并分支。

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

这就是多人协作的工作模式,一旦熟悉了,就非常简单。

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

当前我们已经删除了远程的几个分支,但是使用 git branch -a 命令可以查看所有本地分支和远程分
支,但发现很多在远程仓库已经删除的分支在本地依然可以看到,这是因为这些是本地存储的远程分支的引用,需要我们手动删除。例如:

hyb@139-159-150-152:~/git_teaching$ git pull
Already up to date.
hyb@139-159-150-152:~/git_teaching$ git branch -a
dev
feature-1
feature-2
* master
remotes/origin/HEAD -> origin/master
remotes/origin/dev
remotes/origin/feature-1
remotes/origin/feature-2
remotes/origin/master

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

hyb@139-159-150-152:~/git_teaching$ git remote show origin
* remote origin
Fetch URL: git@gitee.com:hyb91/git_teaching.git
Push URL: git@gitee.com:hyb91/git_teaching.git
HEAD branch: master
Remote branches:
master tracked
refs/remotes/origin/dev stale (use 'git remote prune' to remove)
refs/remotes/origin/feature-1 stale (use 'git remote prune' to remove)
refs/remotes/origin/feature-2 stale (use 'git remote prune' to remove)
Local branches configured for 'git pull':
dev merges with remote dev
feature-1 merges with remote feature-1
feature-2 merges with remote feature-2
master merges with remote master
Local ref configured for 'git push':
master pushes to master (up to date)

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

hyb@139-159-150-152:~/git_teaching$ git remote prune origin
Pruning origin
URL: git@gitee.com:hyb91/git_teaching.git
* [pruned] origin/dev
* [pruned] origin/feature-1
* [pruned] origin/feature-2
hyb@139-159-150-152:~/git_teaching$ git branch -a
dev
feature-1
feature-2
* master
remotes/origin/HEAD -> origin/master
remotes/origin/master

这样就删除了那些远程仓库不存在的分支。对于本地仓库的删除,之前的文章已经讲解了,大家可以自行操作。

http://www.xdnf.cn/news/18853.html

相关文章:

  • k8sday18 HELM
  • AI编写测试用例
  • 【微服务】SpringBoot 整合 Easy-Es 实战操作详解
  • 深入探索Vue:前端开发的强大框架
  • 字母异位词分组,leetCode热题100,C++实现
  • 嵌入式学习day38
  • 搭建域服务器
  • spring-ai-alibaba使用
  • 第18章|变量:把数据装进“盒子”的正确方式
  • 机器学习 TF-IDF方法
  • 【docker apoc 部署的neo4j安装apoc插件】
  • MySQL 面试题系列(五)
  • 【Kafka】重点概念和架构总结
  • Python 入门操作指南
  • 如何在 Docker 和AKS上使用 IIS
  • iOS技术之通过Charles抓包http、https数据
  • 【Linux】基本指令学习3
  • opencv+yolov8n图像模型训练和推断完整代码
  • Clerk 用户认证系统集成文档
  • ollama离线部署+大语言模型
  • AI-调查研究-62-机器人 机械臂五大应用场景详解:从焊接到手术,从农田到太空
  • 4步用代码拆解数学建模中的TOPSIS评价决策! ! !
  • Apache Commons Lang 3
  • 野火STM32Modbus主机读取寄存器/线圈失败(二)-解决CRC校验错误
  • uC/OS-III 队列相关接口
  • 数据分析与数据挖掘
  • 企业如何构建全面的高防IP防护体系?
  • Teams Workflows 业务流程搭建与Linux自动化运维拓展应用全解析
  • 状态设计模式
  • 构建面向人工智能决策的世界模型引擎所需的基本知识体系