准备工作:模拟多人协作环境
为了演示多人协作,我们需要模拟两个开发者协同工作的场景。
环境设置
- 开发者 A(Linux 环境):已经 clone 了远程仓库
- :模拟另一位开发者,同样 clone 相同的仓库
本文介绍了 Git 多人协作开发的完整流程。内容包括模拟多开发者环境、基础协作(同一分支下的协同、冲突解决)、进阶协作(多分支并行开发、跨分支协助)、远程分支管理以及合并策略。重点讲解了分支创建、拉取推送、冲突处理及清理过时引用的命令操作,旨在帮助团队高效进行并行开发并保持代码库稳定。

为了演示多人协作,我们需要模拟两个开发者协同工作的场景。
# 开发者 A(Linux)的当前目录
$ pwd
/home/HY/dir/test


要进行协同开发,必须将其他开发者添加为项目成员并分配相应权限。


至此,我们已经模拟了两个开发者(Linux 和 Windows)共同协作的场景。
在实际项目中,不允许直接在 master 分支上进行开发。我们需要创建专门的开发分支。



两位开发者都需要将远程 dev 分支拉取到本地:
# 拉取远程更新
$ git pull
From https://gitee.com/null_mian/test
* [new branch] dev -> origin/dev
Already up-to-date.
# 查看远程分支
$ git branch -r
origin/HEAD -> origin/master
origin/dev
origin/master
# 创建本地 dev 分支并关联远程 dev 分支
$ git checkout -b dev origin/dev
Branch dev set up to track remote branch dev from origin.
Switched to a new branch 'dev'
拉取后便可以看到远程的 dev 分支,接着切换到 dev 分支供我们进行本地开发。要说明的是,我们切换到的是本地的 dev,根据示例中的操作,会将本地分支和远程分支进行关系链接。
注意:
git branch只能查看本地分支,查看远程分支需加上-r选项(前提是要先pull)

# 确认当前分支
$ git branch
* dev
master
# 修改文件
$ vim file.txt
$ cat file.txt
happy cooperating with you!!!
# 提交并推送
$ git add file.txt
$ git commit -m "Add a greeting line"
[dev 5830349] Add a greeting line
1 file changed, 1 insertion(+)
create mode 100644 file.txt
# 推送到远程 dev 分支
$ git push origin dev
...
To https://gitee.com/null_mian/test.git
4331117..5830349 dev -> dev



先用 git pull 把最新的提交从 origin/dev 拉取下来。

然后,在本地进行合并,并解决冲突,再推送。

此时,我们看到远端的 Gitee 已经能看到我们的新提交了。

由此,两名开发者已经可以进行协同开发了,不断的 git pull/add/commit/push,遇到了冲突,就使用我们之前讲的冲突处理解决冲突。
对于你来说,想要看到小伙伴的代码,只需要 pull一下即可,例如:
# 查看当前文件
$ cat file.txt
happy cooperating with you!!!
# 拉取最新代码
$ git pull
...
From gitee.com:null_mian/test
a7545aa..5e9eeb7 dev -> origin/dev
Updating a7545aa..5e9eeb7 Fast-forward
file.txt | 1 +
1 file changed, 1 insertion(+)
# 查看合并后的文件
$ cat file.txt
happy cooperating with you!!!
me too!!!
最后不要忘记,虽然我们是在分支上进行多人协作开发,但最终的目的是要将开发后的代码合并到 master 上去,让我们的项目运行最新的代码。接下来我们就需要做这件事情了。
# 1、切换至 master 分支,pull 一下,保证本地的 master 是最新内容
# 合并前这么做是一个好习惯
$ git checkout master
Switched to branch 'master'
$ git pull
Already up-to-date.
# 2、切换至 dev 分支,合并 master 分支
# 这么做是因为如果有冲突,可以在 dev 分支上解决,保证 master 分支的稳定性
# 这么做是一个好习惯
$ git checkout dev
Switched to branch 'dev'
$ git merge master
Already up-to-date.
# 3、切换至 master 分支,合并 dev 分支
$ git checkout master
Switched to branch 'master'
$ git merge dev
Updating 4331117..5e9eeb7 Fast-forward
file.txt | 2 ++
1 file changed, 2 insertions(+)
create mode 100644 file.txt
$ cat file.txt
happy cooperating with you!!!
me too!!!
# 4、将 master 分支推送到远端
$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 7 commits.
# (use "git push" to publish your local commits)
# nothing to commit, working directory clean
$ git push origin master
...
To [email protected]:null_mian/test.git
4331117..5e9eeb7 master -> master
$ git status
# On branch master
nothing to commit, working directory clean
此时,查看远端仓库,master 分支已经是最新代码了。

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


git push origin branch-name 推送自己的修改git pull 合并git push origin branch-name 推送master在实际项目中,通常会为每个需求或功能点创建独立的分支,实现并行开发。
feature-1 分支# 新增本地分支 feature-1 并切换
$ git branch
* master
$ git checkout -b feature-1
Switched to a new branch 'feature-1'
# 新增需求内容 - 创建 function1 文件
$ vim function1
$ cat function1
Done!
# 将 feature-1 分支推送到远端
$ git add function1
$ git commit -m "add function1"
[feature-1 7390347] add function1
1 files changed, 1 insertion(+)
$ git push origin feature-1
...
remote: Create a pull request for 'feature-1' on Gitee by visiting:
remote: https://gitee.com/null_mian/test/pull/new/null_mian:feature-1...null_mian:master
To [email protected]:null_mian/test.git
* [new branch] feature-1 -> feature-1
feature-2 分支
此时,在本地,你看不见他新建的文档,他看不见你新建的文档。并且推送各自的分支时,并没有任何冲突,你俩互不影响,用起来很舒服!

feature-1 分支内容
feature-2 分支内容
当同事因故无法继续开发时,可以切换到对方的分支帮助开发。
# 必须先拉取远端仓库内容
$ git pull
··· From gitee.com:null_mian/test
7390347..66735e3 feature-1 -> origin/feature-1
* [new branch] feature-2 -> origin/feature-2
···
# 可以看到远程已经有了 feature-2
$ git branch -a
* feature-1
master
remotes/origin/HEAD -> origin/master
remotes/origin/dev
remotes/origin/feature-1
remotes/origin/feature-2
remotes/origin/master
# 切换到 feature-2 分支上,可以和远程的 feature-2 分支关联起来,
# 否则将来只使用 git push 推送内容会失败
$ git checkout -b feature-2 origin/feature-2
Branch feature-2 set up to track remote branch feature-2 from origin.
Switched to a new branch 'feature-2'
# 查看文件
$ ls
function2 README.en.md README.md
# 继续开发
$ vim function2
$ cat function2
Done! Help done!
# 提交并推送
$ git add function2
$ git commit -m "modify function2"
[feature-2 061df75] modify function2
1 file changed, 2 insertions(+), 1 deletion(-)
$ git push origin feature-2
...
To [email protected]:null_mian/test.git
d246966..061df75 feature-2 -> feature-2


pull 是因为没有指定本地 feature-2 分支与远程 origin/feature-2 分支的链接,设置 feature-2 和 origin/feature-2 的链接即可。

masterfeature-2

feature-1# 切换至 master 分支,pull 一下,保证本地的 master 是最新内容。
# 合并前这么做是一个好习惯
$ git checkout master
Switched to branch 'master'
$ git pull
...
From gitee.com:null_mian/test
eb21de3..4b96a42 master -> origin/master
Updating eb21de3..4b96a42 Fast-forward
function2 | 2 ++
1 file changed, 2 insertions(+)
create mode 100644 function2
# 切换至 feature-1 分支,合并 master 分支
# 这么做是因为如果有冲突,可以在 feature-1 分支上进行处理,而不是在 master 分支上解决冲突
# 这么做是一个好习惯
$ git checkout feature-1
Switched to branch 'feature-1'
$ git merge master
Merge made by the 'recursive' strategy.
function2 | 2 ++
1 file changed, 2 insertions(+)
create mode 100644 function2
# 查看合共结果
$ ls
a.so b.ini file.txt function1 function2 README.en.md README.md
# 1、由于 feature-1 分支已经 merge 进来了新内容,为了保证远程分支最新,所以最好 push 一下。
# 2、要 push 的另一个原因是因为在实际的开发中,master 的 merge 操作一般不是由我们自己在本地进行操作,
# 其他人员或某些平台 merge 时,操作的肯定时远程分支,所以就要保证远程分支的最新。
# 3、如果 merge 出现冲突,不要忘记需要 commit 才可以 push!
$ git status
# On branch master
nothing to commit, working directory clean
# 推送 feature-1 更新到远程
$ git push origin feature-1
...
To [email protected]:null_mian/test.git
66735e3..9effc8e feature-1 -> feature-1
# 切换至 master 分支,合并 feature-1 分支
$ git checkout master
Switched to branch 'master'
$ git merge feature-1
Updating 4b96a42..9effc8e Fast-forward
function1 | 1 +
1 file changed, 1 insertion(+)
create mode 100644 function1
# 将 master 分支推送至远端
$ git status
# On branch master
nothing to commit, working directory clean
$ git push origin master
...
To [email protected]:null_mian/test.git
4b96a42..9effc8e master -> master
$ git status
# On branch master
nothing to commit, working directory clean

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

注意:在实际开发中,通常会在
dev分支基础上创建feature分支,而不是直接在master上创建。此处为演示方便,简化了流程。
当远程分支被删除后,本地仍能看到这些分支的引用。
$ git pull
Already up-to-date.
# 查看所有分支(包含已删除的远程分支)
$ git branch -a
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 地址,远程分支,还有本地分支与之相对应关系等信息。
$ git remote show origin
* remote origin
Fetch URL: [email protected]:null_mian/test.git
Push URL: [email protected]:null_mian/test.git
HEAD branch (remote HEAD is ambiguous, may be one of the following):
feature-1
master
Remote branches:
feature-1 tracked
feature-2 tracked
master tracked
refs/remotes/origin/dev stale (use 'git remote prune' to remove)
Local branches configured for 'git pull':
feature-2 merges with remote feature-2
master merges with remote master
Local refs configured for 'git push':
feature-1 pushes to feature-1 (up to date)
feature-2 pushes to feature-2 (up to date)
master pushes to master (up to date)
使用命令 git remote prune origin,查看那些远程仓库已经不存在的分支。
$ git remote prune origin
Pruning origin URL: [email protected]:null_mian/test.git
* [pruned] origin/dev
$ git branch -a
feature-1
feature-2
* master
remotes/origin/HEAD -> origin/master
remotes/origin/feature-1
remotes/origin/feature-2
remotes/origin/master
这样就删除了那些远程仓库不存在的分支。对于本地仓库的删除,之前的课程已经学过了,大家可以自行操作。
master:稳定版本,禁止直接开发dev:集成测试分支feature/*:功能开发分支master| 操作 | 命令 | 说明 |
|---|---|---|
| 查看分支 | git branch -a | 查看所有分支 |
| 创建分支 | git checkout -b <name> | 创建并切换分支 |
| 关联远程分支 | git checkout -b <local> origin/<remote> | 创建本地分支并关联远程 |
| 推送分支 | git push origin <branch> | 推送本地分支到远程 |
| 拉取更新 | git pull | 拉取远程更新并合并 |
| 清理分支引用 | git remote prune origin | 清理已删除的远程分支引用 |
| 删除本地分支 | git branch -d <branch> | 删除已合并的本地分支 |
通过掌握这些协作技巧,团队可以高效地进行并行开发,同时保持代码库的整洁和稳定。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML 转 Markdown 互为补充。 在线工具,Markdown 转 HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML 转 Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online