Git 多人协作

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

  • 基本完成 Git 的所有本地库的相关操作,Git 基本操作,分支理解,版本回退,冲突解决等等

  • 申请 Gitee账号,将远端信息 clone到本地,以及推送和拉取

现在进入最重要的环节 ------ 多人协作开发

准备工作:模拟多人协作环境

为了演示多人协作,我们需要模拟两个开发者协同工作的场景

环境设置

  1. 开发者A(Linux环境):已经 clone了远程仓库

  2. 开发者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分支删除

基础协作工作模式总结

  1. 尝试推送 :使用git push origin branch-name推送自己的修改

  2. 处理推送失败 :如果失败,说明远程分支比本地更新,需先git pull合并

  3. 解决冲突:如有冲突,在本地解决冲突并提交

  4. 再次推送 :冲突解决后,再次使用git push origin branch-name推送

  5. 功能合并 :开发完毕,将分支合并进master

  6. 清理分支:最后删除已合并的分支

进阶协作:多分支并行开发

在实际项目中,通常会为每个需求或功能点创建独立的分支,实现并行开发

场景设定

  • 功能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-2origin/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-1feature-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> 删除已合并的本地分支

通过掌握这些协作技巧,团队可以高效地进行并行开发,同时保持代码库的整洁和稳定。

相关推荐
BlackWolfSky2 小时前
React中文网课程笔记2—实战教程之井字棋游戏
笔记·react.js·游戏
BlackWolfSky2 小时前
React中文网课程笔记1—快速入门
前端·笔记·react.js
chushiyunen2 小时前
发票合并拆分笔记
笔记
航Hang*2 小时前
第二章:网络系统建设与运维(高级)—— IS-IS路由协议
运维·服务器·网络·笔记·智能路由器·ensp
聆风吟º2 小时前
【顺序表习题|图解|双指针】合并两个有序数组 + 训练计划 I
c语言·数据结构·c++·经验分享·算法
冻伤小鱼干2 小时前
《自动驾驶与机器人中的slam技术:从理论到实践》笔记——ch7(2)
笔记·机器人·自动驾驶
强子感冒了2 小时前
Java集合框架深度学习:从Iterable到ArrayList的完整继承体系
java·笔记·学习
猫腻余腥3 小时前
Git 命令使用教程
git
lanhuazui103 小时前
git常见操作
git