10.远程协同开发

19 阅读12分钟

远程协同开发

1.介绍

本章讲解如何使用远程仓库,进行协同开发

2.远程仓库

介绍

迄今为止,我们的项目都是基于本地开发。然而,在团队协同开发的过程中,我们需要将个人的代码发布到远程仓库,这是一个存储Git代码的远程服务器。同时,我们也需要拉取远程仓库中其他团队成员开发的代码到本地,以便整合和同步工作。有了远程仓库,我们的项目才能算真正意义上的协同开发

远程仓库是一个代码托管中心/平台。市面上有许多知名的代码托管中心,如GitHub、Gitee等。这些远程仓库都是基于互联网的,只要接入了互联网,就可以创建属于自己的远程仓库。另外,我们也可以搭建只属于个人或公司的远程仓库。这类远程仓库一般用于某些公司存储自身代码

github

GitHub是由微软公司运营的一款强大的云端软件开发协作平台,它基于Git分布式版本控制系统。GitHub之所以得名,是因为它只支持Git作为唯一的版本库格式进行托管。GitHub拥有1亿以上的开发人员、400万以上的组织机构,成为全球最大的Git版本库托管商。GitHub不仅是成千上万开发者和项目协作的枢纽,也是大部分Git版本库的托管地。很多开源项目使用GitHub实现Git托管、问题追踪、代码审查以及其他活动

GitHub极大地优化了团队协作流程,它不仅提高了代码质量与工作效率,并在全球范围内构建了一个活跃的开源社区,汇聚了海量优质开源项目、开发者资源和技术文档。此外,GitHub还集成了持续集成/持续部署(CI/CD)工具、项目管理面板、API接口等多种功能,为企业和个人开发者提供了全面而完善的软件开发解决方案

gitee

Gitee(码云)是开源中国于2013年推出的基于Git的代码托管平台和企业级研发效能平台。它同样基于Git分布式版本控制系统,为国内开发者提供源代码托管服务。作为中国境内规模最大的代码托管平台之一,Gitee拥有庞大的注册用户群和丰富的代码仓库资源,致力于打造本土化的开源生态环境,同时为企业用户提供企业级研发效能管理和DevOps解决方案,整合了包括CI/CD工具在内的多种开发工具链和服务,助力中国企业与个人开发者更加高效地进行软件开发与创新

Gogs

Gogs是一款由社区驱动、采用Go语言编写的开源轻量级自助Git服务软件,旨在为个人和团队提供便捷的自托管代码托管解决方案。通过在本地服务器或云环境中部署Gogs,用户能够创建、分享和管理项目源代码库,并实现基于Git版本控制的协同开发。它具备简洁易用的Web界面,支持分支管理、Pull Request审查流程以及基本的权限控制功能,使得小型团队或独立开发者无须依赖第三方平台(如GitHub或Gitee)即可搭建私有的、资源占用少且易于维护的Git服务环境。尽管功能相比大型平台更为精简,但Gogs对于寻求快速建立内部或私密代码仓库的场景尤为适用。因其低门槛的安装配置和跨平台特性而广受青睐

GitLab

GitLab是一款基于Git的分布式版本控制系统以及全方位的软件开发工具链。用户在GitLab上不仅能够创建、托管和分享项目源代码,还能够利用其丰富的功能实现从计划、编码、构建、测试到部署的全流程自动化管理。GitLab支持分支管理和Pull/Merge Request审查机制,通过集成式的CI/CD系统(GitLab CI/CD)、问题跟踪系统、代码审核工具、安全扫描及性能分析等功能模块,大大提高了团队协作效率与软件质量。作为全球范围内广泛应用的企业级解决方案,GitLab既可部署于云端服务,也可本地自建服务器进行使用,以满足不同规模组织的安全合规要求与定制化需求

3.协同开发工作流程

当本地代码提交后,需要通过push命令推送到远程仓库中。这样,代码就被共享出去了,当其他成员想要获取远程仓库的代码时,可以使用clone/fetch/pull等命令将远程仓库的代码拉取到本地,并与本地仓库的代码进行合并

协同开发工作流程示意图如下图所示:

FigureP21543227.jpg

4.发布远程仓库

介绍

使用git init命令可以初始化一个本地仓库,然而这个仓库并不能被项目团队的其他成员所发现。因此,我们需要在代码托管平台(如Gitee)中创建一个远程仓库,然后使用Git提供的命令将本地仓库的代码推送至远程仓库,供团队其他成员拉取

创建远程仓库

FigureP21688115.jpg

FigureP21643242.jpg

FigureP21743281.jpg

推送仓库

git push [http地址] [远程分支名称]

输入完上述命令后,Gitee将弹出对话框提示用户输入用户名和密码,如下图所示:

FigureP21843452.jpg

输入完用户名和密码并单击确定按钮后,表示推送成功,如下图所示:

FigureP21843453.jpg

刷新Gitee页面,发现本地仓库已经推送到远程仓库中,如下图所示:

FigureP21943571.jpg

凭证处理

推送完毕后,可以让Git保存刚刚推送时输入的用户名和密码。这样,下次推送时就不需要再次输入用户名和密码了

可以通过配置Git的方式来保存凭证

# 永久保存凭证(后续执行push/pull/clone等指令不需要再重新输入代码托管平台的账号密码)
git config --system credential.helper store
# 可以使用这个命令清除凭证
git config --system --unset credential.helper

再次推送的时候,重新输入账号密码,然后Git就会将本次的凭证保存起来了,下次推送时就不需要输入用户名和密码了

5.协同开发相关命令

push命令

介绍

远程仓库创建好后,需要在本地建立一个本地仓库,然后使用git push命令将本地仓库推送到远程仓库中

语法

FigureT21784971.jpg

remote命令

介绍

我们之前使用push指令推送本地项目到远程仓库,这一过程中需要我们知晓远程仓库的地址。然而,远程仓库的地址往往较长且不易记忆。git remote命令用于管理Git仓库中的远程仓库,该命令提供了一些用于查看、添加、重命名和删除远程仓库的功能。通过为远程仓库设置别名,我们在操作远程仓库时,便无须记忆那一长串复杂的地址,使得操作远程仓库变得更加便捷

语法

FigureT22084975.jpg

案例
# 添加别名
git remote add test01 https://gitee.com/xxx/aaa.git
# 查看别名列表(remot指令会为仓库添加两个别名)
git remote -v
# 查看仓库信息
git remote show test01
# 重命名仓库
git remote rename test01 test02
# 查看别名列表
git remote -v
# 删除别名
git remote rm test02
# 重新查看别名列表
git remote -v

clone命令

介绍

git clone命令用于将远程仓库完整地克隆(clone)到本地,相当于在本地创建一个与远程仓库相同的仓库副本。此时本地无须执行git init,等待git clone执行完毕会自动生成.git文件夹。由于是克隆来的,所以.git文件夹中存放着与远程仓库一模一样的版本库记录

语法

FigureT22284980.jpg

注意

使用clone命令将远程仓库的项目克隆到本地之后,会为项目设置默认的别名为origin,并在本地仓库创建远程分支对应的远程跟踪分支

案例
git clone https://gitee.com/xxx/test01.git
git remote -v

fetch命令

介绍

fetch命令用于获取远程仓库的代码。默认情况下,获取的最新代码在本地分支对应的远程跟踪分支上,并不在当前的分支。如果当前项目不存在远程跟踪分支将会创建一个远程跟踪分支,然后将最新的内容存储在远程跟踪分支上。因此,一般在使用完fetch命令后,还要将本地分支与远程跟踪分支进行合并,这样才能确保代码能够更新到本地仓库

语法

FigureT22384983.jpg

案例

在一个新的目录重新拉取一份远程仓库到本地

# 拉取项目
git clone https://gitee.com/aaa/test01.git
# 进入项目
cd test01/
# 查看别名
git remote -v
# 查看日志,origin/master就是master分支的远程跟踪分支
git log --oneline --all

假如test01远程仓库代码有更新后,可以进行如下操作

# 使用fetch将远程分支master的代码拉取到本地分支master的远程跟踪分支上
git fetch orgin master
# 查看日志,发现代码被拉取到origin/master分支上
git log --oneline --all
# 查看当前master分支的工作空间,发现代码没有被合并到master分支
cat aaa.txt
# 将远程跟踪分支origin/master的代码合并到master分支中
git merge origin/master
# 查看日志,发现代码变更
git aaa.txt

pull命令

介绍

fetch命令可以将远程仓库的代码拉取到本地仓库中,但拉取下来的代码并不在我们本地仓库所操作的那个分支上,而是在远程跟踪分支上。因此,使用fetch命令拉取代码后,通常都需要合并(merge)到本地分支,这样一个完整的拉取代码才算结束

pull命令用于获取远程仓库的代码。与fetch命令不同的是,pull命令先拉取远程仓库的最新代码到本地后,然后再与本地分支进行合并。这样,就不需要人为地进行合并了。在实际使用中,pull命令会更加常用

语法

FigureT22584988.jpg

案例

在一个新的目录重新拉取一份远程仓库到本地

# 拉取项目
git clone https://gitee.com/aaa/test01.git
# 进入项目
cd test01/
# 查看别名
git remote -v
# 查看日志,origin/master就是master分支的远程跟踪分支
git log --oneline --all

使用pull命令拉取代码

# 查看拉取之前的日志
git log --oneline --all
# 查看工作空间内容发现没有变化
cat aaa.txt
# 将远程分支master的代码拉取到远程跟踪分支origin/master,再将本地分支master与远程跟踪分支origin/master合并
git pull origin master
# 查看日志
git log --oneline --all
# 查看工作空间内容发现变更了
cat aaa.txt

6.远程跟踪分支

介绍

Git的远程跟踪分支是存储在本地仓库中的一种特殊引用,它用于追踪远程分支的最新提交。它们以(远程仓库名)/(分支名)的形式命名,如origin/master

远程跟踪分支用于记录本地仓库最后一次与远程仓库交互时的位置,其作用是告诉用户目前所跟踪的远程分支的状态(指向哪一个提交)。远程跟踪分支内容只读且自动更新,与远程仓库交互(如fetch、pull等)后会依据远程仓库的状态移动到新的提交上。开发者可以基于这些远程跟踪分支创建或关联本地分支进行开发,并使用git push和git pull等命令与远程仓库实现代码同步

远程分支的拉取

当本地分支被提交到远程仓库后,就会建立远程分支。需要注意的是,我们在克隆项目时,远程分支并不会被克隆下来,被克隆下来的只有远程分支对应的远程跟踪分支

虽然,在进行克隆时,远程分支并不会被克隆到本地,但是,我们可以根据远程跟踪分支来创建本地分支

创建时机

  • push:当执行push操作后,会将本地分支提交到远程仓库中并创建远程分支,与此同时,会创建远程分支对应的远程跟踪分支
  • clone:当执行clone操作后,远程分支并不会被拉取到本地,但本地会创建所有远程分支对应的远程跟踪分支
  • fetch:当执行fetch操作拉取指定远程分支代码到本地时,会在本地创建该远程分支对应的远程跟踪分支。远程分支的代码被拉取到这个远程跟踪分支上时,通常需要使用当前分支合并远程跟踪分支来更新工作空间
  • pull:当执行pull操作拉取指定远程分支代码到本地时,会在本地创建该远程分支对应的远程跟踪分支。然后将当前分支与远程跟踪分支合并