目前,我们所完成的工作如下:
-
基本完成 Git 的所有本地库的相关操作,Git 基本操作,分支理解,版本回退,冲突解决等等
-
申请 Gitee账号,将远端信息 clone到本地,以及推送和拉取
现在进入最重要的环节 ------ 多人协作开发
准备工作:模拟多人协作环境
为了演示多人协作,我们需要模拟两个开发者协同工作的场景
环境设置
-
开发者A(Linux环境):已经 clone了远程仓库
-
开发者B(Windows环境):模拟另一位开发者,同样 clone相同的仓库
Shell
# 开发者A(Linux)的当前目录
$ pwd
/home/HY/dir/test
Windows环境克隆仓库


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


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



2、拉取远程分支到本地
两位开发者都需要将远程dev分支拉取到本地:
开发者A(Linux)操作
Shell
# 拉取远程更新
$ 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)
开发者B(Windows)操作

3、协作开发流程
步骤1:开发者A进行开发并推送
Shell
# 确认当前分支
$ 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


步骤2:开发者B尝试推送(遇到冲突)

步骤3:解决冲突
先用git pull把最新的提交从origin/dev拉取下来

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

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

由此,两名开发者已经可以进行协同开发了,不断的git pull/add/commit/push,遇到了冲突,就使用我们之前讲的冲突处理解决冲突
对于你来说,想要看到小伙伴的代码,只需要pull一下即可,例如
步骤4:开发者A获取更新
Shell
# 查看当前文件
$ 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上去,让我们的项目运行最新的代码。接下来我们就需要做这件事情了
Shell
# 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 git@gitee.com: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 -
清理分支:最后删除已合并的分支
进阶协作:多分支并行开发
在实际项目中,通常会为每个需求或功能点创建独立的分支,实现并行开发
场景设定
-
功能1:由开发者A负责
-
功能2:由开发者B负责
1、创建功能分支
开发者A创建feature-1分支
Shell
# 新增本地分支 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 git@gitee.com:null_mian/test.git
* [new branch] feature-1 -> feature-1
开发者B创建feature-2分支

此时,在本地,你看不见他新建的文档,他看不见你新建的文档。并且推送各自的分支时,并没有任何冲突,你俩互不影响,用起来很舒服!
2、查看Gitee状态

feature-1分支内容

feature-2分支内容

3、跨分支协作(帮同事继续开发)
当同事因故无法继续开发时,可以切换到对方的分支帮助开发
开发者A协助开发者B
Shell
# 必须先拉取远端仓库内容
$ 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 git@gitee.com:null_mian/test.git
d246966..061df75 feature-2 -> feature-2

开发者B获取更新

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

4、功能开发完毕,合并到master
开发者B先合并feature-2


开发者A合并feature-1
Shell
# 切换至 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 git@gitee.com: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 git@gitee.com:null_mian/test.git
4b96a42..9effc8e master -> master
$ git status
# On branch master
nothing to commit, working directory clean

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

注意 :在实际开发中,通常会在
dev分支基础上创建feature分支,而不是直接在master上创建。此处为演示方便,简化了流程。
远程分支管理
清理已删除的远程分支引用
当远程分支被删除后,本地仍能看到这些分支的引用
Shell
$ 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地址,远程分支,还有本地分支与之相对应关系等信息
Shell
$ git remote show origin
* remote origin
Fetch URL: git@gitee.com:null_mian/test.git
Push URL: git@gitee.com: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,查看那些远程仓库已经不存在的分支
Shell
$ git remote prune origin
Pruning origin
URL: git@gitee.com: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 -
解决可能出现的冲突
-
发起Pull Request进行代码审查
-
审查通过后合并到目标分支
分支管理:
-
及时删除已合并的分支
-
定期清理过时的分支引用
-
使用有意义的命名规范
常用命令回顾
| 操作 | 命令 | 说明 |
|---|---|---|
| 查看分支 | 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> |
删除已合并的本地分支 |
通过掌握这些协作技巧,团队可以高效地进行并行开发,同时保持代码库的整洁和稳定。