【Git】多人协作一(同一分支下)

文章目录

  • [1. 邀请用户](#1. 邀请用户)
  • [2. 新建分支](#2. 新建分支)
  • [3. 协助开发](#3. 协助开发)
  • [4. 将内容合并到 main](#4. 将内容合并到 main)
    • [方法一:提交 PR 申请单](#方法一:提交 PR 申请单)
    • [方法二:本地 main 分支合并 dev 分支](#方法二:本地 main 分支合并 dev 分支)
  • [5. 总结](#5. 总结)

1. 邀请用户

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

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

是时候干最重要的一件事情了,实现多人协作开发!为了做这件事情,我们需要先做一些准备工作。

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

bash 复制代码
[Tom@vm-centos:~/gitCode_Teaching]$ pwd
/home/Tom/gitCode_Teaching

因为我们要多人进行协同开发,所以还要再去创建一个 Github 账号(这里不再进行演示),然后要将创建好的用户添加进开发者,用户才有权限进行代码提交。

进入目标仓库页面,点击右上角 Settings(齿轮图标),在左侧菜单中选择 Collaborators

然后点击 Add people

在输入框中输入被邀请者的 GitHub 用户名或邮箱(支持模糊匹配),选择匹配的用户后,点击 Add collaborator 按钮。

邀请发送后,被邀请者会收到邮件通知,点击邮件中的 Accept invitation 链接,跳转到 GitHub 页面后确认加入项目:

此时,就可以看到另外一个用户被添加进来了:

项目管理员可在 Settings → Moderation options 中管理合作者的权限(如读写权限)。GitHub默认赋予合作者 Write 权限(可推送代码),如需更细粒度控制,可结合文件或分支保护规则。

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

2. 新建分支

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

那么接下来,就让我们在 github上新建 dev 远程分支供我们使用。

点击 View all branches

创建 dev 分支:

此时,远程仓库就有两个分支了:

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

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

  • 对于我们要操作的是:
bash 复制代码
# 拉取最新的分支
git pull

# 查看分支
git branch -r

# 同时打印本地分支和远程分支
git branch -a

结果如下:

然后,我们用刚刚新创建的 Harry 用户来把仓库克隆到服务器上(注意,我这里使用了一台新的服务器)

Clone 成功!另外,别忘了设置用户名和邮箱:

bash 复制代码
git config [--global] user.name "Your Name"   
git config [--global] user.email "email@example.com" 

# 把 Your Name 改成新用户昵称
# 把 email@example.com 改成邮箱的格式,只要格式正确即可。

结果如下:

3. 协助开发

本次协作开发的任务要求如下:

  • 目标:main 分支下 file.txt 文件新增代码 "aaa"、"bbb"
  • 实现:由开发者 Tom 新增 "aaa",由开发者 Harry 新增 "bbb"
  • 条件:在一个分支下协作完成。

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

注:这里可以说明一下,当我们建立链接以后,就可以直接使用 git pull / git push 这种短命令了,但是如果你使用短命令给你报出下面的警告信息:

bash 复制代码
warning: push.default is unset; its implicit value is changing in
Git 2.0 from 'matching' to 'simple'. To squelch this message
and maintain the current behavior after the default changes, use:

  git config --global push.default matching

To squelch this message and adopt the new behavior now, use:

  git config --global push.default simple

解决办法很简单:

bash 复制代码
# 方案 A:采用新标准(推荐)
git config --global push.default simple

# 方案 B:保持旧习惯
git config --global push.default matching

开发者一

  • 对于 Tom 操作的是:
bash 复制代码
# 创建本地dev分支,并和远程的dev分支建立链接,然后再切换到dev分支上
git checkout -b dev origin/dev

# 查看
git branch -a

# 查看建立链接
git branch -vv

结果如下:

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

bash 复制代码
# 新增一行内容
echo "aaa" >> file.txt

# 添加并提交
git add .
git commit -m "modify file.txt: aaa"

# 将dev分⽀推送到远端
git push

结果如下:

让我们来看看远程仓库的状态(注意 Compare & pull request 是合并操作,暂时不需要点)。

切换到 dev 分支,我们就可以看到推送成功的内容了:

至此,Tom 用户的开发操作已经完成了,接下来,我们用 Harry 用户开始操作。

开发者二

  • 对于 Harry 要操作的是
bash 复制代码
# 创建本地dev分支,并和远程的dev分支建立链接,然后再切换到dev分支上
git checkout -b dev origin/dev

# 查看
git branch -a

# 查看建立链接
git branch -vv

结果如下:

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

bash 复制代码
# 新增一行内容
echo "bbb" >> file.txt

# 添加并提交
git add .
git commit -m "modify file.txt: aaa"

# 将dev分⽀推送到远端
git push

结果如下:

现在的报错 remote: Invalid username or token. 是因为 GitHub 要求使用 Personal Access Token (PAT)(个人访问令牌)或 SSH Key 来替代传统的登录密码。

解决方式如下:

如果你不想每次推送都复制粘贴这么长的字符串,可以设置凭据助手让 Git 记住它:

bash 复制代码
# 设置凭据缓存(默认记住 15 分钟)
git config --global credential.helper cache

# 或者长期存储(下次输入正确后,信息会保存在本地磁盘)
git config --global credential.helper store

因为在 Harry 用户上,我们使用的是 HTTPS 的方式来克隆的,长期来看,开发者更倾向于使用 SSH 密钥,这样完全不需要输入用户名和密码。

解决完之后,再次推送:

这时推送失败,因为 Harry 的最新提交和 Tom 推送的提交有冲突(远程仓库包含你本地没有的更新),解决办法也很简单,Git 已经提示我们,先用 git pull 把最新的提交从 origin/dev 抓下来,然后,在本地进行合并,并解决冲突,再推送。

操作如下:

bash 复制代码
# 拉取远程更新
git pull

注意:如果你们在 git pull 的时候,遇到下面这种情况:

那么直接执行以下命令,告诉 Git 默认使用合并策略即可。

bash 复制代码
git config --global pull.rebase false

接下来你需要手动打开文件解决冲突:

bash 复制代码
# 查看冲突
cat file.txt

# 打开文件解决冲突
vim file.txt

结果如下:

此时,我们再来查看一下本地仓库的状态,下面显示是正常的。

解决完冲突以后,重新提交推送:

此时,我们到远端的仓库已经能看到新的提交了:

里面的内容如下:

4. 将内容合并到 main

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

方法一:提交 PR 申请单

还记得 Tom 用户推送完以后,在远端仓库有一个 Compare & pull request 吗?我们直接点击进行合并操作

点击 Create pull request

然后再点击 Merge pull request

可以看到,此时 Tom 用户在 file.txt 文件中新增的 "aaa" 已经合并到了 main 分支上:

当然,此时 main 分支里面的 file.txt 的内容也只有 "aaa":

方法二:本地 main 分支合并 dev 分支

注意:这里 Tom 和 Harry 用户都可以进行 merge 操作,任选一个即可。我们选择在 Tom 用户上进行操作。

先在本地 dev 分支上拉取远程最新的 dev 分支代码:

bash 复制代码
# 查看所在分支
git branch

# 查看文件内容
cat file.txt

# 拉取
git pull

结果如下:

然后切换至 main 分支,pull 一下,保证本地的 main 是最新内容。

bash 复制代码
# 切换到main分支
git checkout main

# 拉取(合并前这么做是一个好习惯)
git pull

结果如下(因为我们刚刚提交了一个 PR 申请单,所以 main 分支有一行新增的 "aaa"):

然后切换至 dev 分支,合并 main 分支

bash 复制代码
# 切换到dev分支
git checkout dev

# 合并操作
git merge main

可以看到,什么也没有发生,这么做是因为如果有冲突,可以在 dev 分支上进行处理,而不是在 main 上解决冲突(假设现在 main 分支上新增了一行 "ccc",那么就需要这一步操作)。

然后切换至 main 分支,合并 dev 分支:

bash 复制代码
# 切换到main分支
git checkout main

# 合并操作
git merge dev

# 查看文件内容
cat file.txt

结果如下:

然后将 main 分支推送至远端:

bash 复制代码
# 推送到远端
git push

结果如下:

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

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

5. 总结

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

  • 首先,可以试图用 git push origin branch-name 推送自己的修改;
  • 如果推送失败,则因为远程分支比你的本地更新,需要先用 git pull 试图合并;
  • 如果合并有冲突,则解决冲突,并在本地提交;
  • 没有冲突或者解决掉冲突后,再用 git push origin branch-name 推送就能成功!
  • 功能开发完毕,将分支 mergemain,最后删除分支。
相关推荐
__雨夜星辰__2 小时前
VS Code 的Remote-SSH/Remote Development插件无法连接到 Ubuntu 系统下 的远程虚拟主机(VMware)
运维·vscode·ubuntu·ssh
学好statistics和DS2 小时前
Git 同步冲突
大数据·git·elasticsearch
风静如云3 小时前
VSCode:SSH后无法使用c0pil0t
vscode
系'辞6 小时前
【obsidian指南】配置obsidian git插件,实现obsidian数据定时同步到github仓库(Mac电脑)
macos·github·agent·知识库
草梅友仁14 小时前
墨梅博客 1.0.0 发布与更新 | 2026 年第 2 周草梅周报
github·ai编程·nuxt.js
德彪稳坐倒骑驴15 小时前
Git常用命令
git
周末程序猿15 小时前
杂谈|2025年总结
github
无限进步_16 小时前
【C语言&数据结构】对称二叉树:镜像世界的递归探索
c语言·开发语言·数据结构·c++·git·算法·visual studio
Controller-Inversion16 小时前
cdn协议
计算机网络·github