【Git:多人协作】Git多人协作实战:从同分支到多分支工作流

🔥艾莉丝努力练剑: 个人主页

专栏传送门:《C语言》《数据结构与算法》C/C++干货分享&学习过程记录Linux操作系统编程详解笔试/面试常见算法:从基础到进阶测试开发要点全知道

⭐️为天地立心,为生民立命,为往圣继绝学,为万世开太平


🎬艾莉丝的简介:


目录

艾莉丝的Gitee地址

[1 ~> 多人协作](#1 ~> 多人协作)

[2 ~> 多人协作一:在同一分支下进行多人协作](#2 ~> 多人协作一:在同一分支下进行多人协作)

[2.1 完成准备工作](#2.1 完成准备工作)

[2.2 协作开发](#2.2 协作开发)

[2.2.1 我们的操作](#2.2.1 我们的操作)

[2.2.2 小伙伴的操作](#2.2.2 小伙伴的操作)

[2.2.3 协作开发](#2.2.3 协作开发)

[2.3 将内容合并到master](#2.3 将内容合并到master)

[2.4 总结:在同一分支下进行多人协作的工作模式通常的流程](#2.4 总结:在同一分支下进行多人协作的工作模式通常的流程)

[3 ~> 多人协作二:在不同分支下进行多人协作(通常情况)](#3 ~> 多人协作二:在不同分支下进行多人协作(通常情况))

[3.1 前情提示](#3.1 前情提示)

[3.2 最佳实践](#3.2 最佳实践)

[3.2.1 我的操作](#3.2.1 我的操作)

[3.2.2 小伙伴的操作](#3.2.2 小伙伴的操作)

[3.2.3 在不同分支下进行多人协作](#3.2.3 在不同分支下进行多人协作)

[3.2.4 一个人开发两个分支](#3.2.4 一个人开发两个分支)

[3.3 将内容合并到master](#3.3 将内容合并到master)

[4 ~> 远程分支删除后,本地git branch-a依然能看到的解决办法](#4 ~> 远程分支删除后,本地git branch-a依然能看到的解决办法)

[4.1 解决办法](#4.1 解决办法)

[4.2 最佳实践](#4.2 最佳实践)

Git:多人协作部分博主手记

多人协作一(在同一分支下进行多人协作)

多人协作二(在不同分支下进行多人协作)

[远程分支删除后,本地git branch-a依然能看到的解决办法](#远程分支删除后,本地git branch-a依然能看到的解决办法)

结尾


艾莉丝的Gitee地址

艾莉丝努力练剑的gitee



1 ~> 多人协作

那么,是时候干最重要的一件事情了------没错!实现多人协作开发!为了做这件事情,我们需要先做一些准备工作。我们之前已经将项目clone到了指定目录,如:

bash 复制代码
hyb@139-159-150-152:~/git_teaching$ pwd
/home/hyb/git_teaching

2 ~> 多人协作一:在同一分支下进行多人协作

2.1 完成准备工作

在Windows环境下,再clone同一个项目仓库,来模拟和你一起协作开发的另一名小伙伴乙:

(Windows环境下)找一个目录(文件夹),鼠标右击打开PowerShell窗口------

这里git clone一下HTTPS协议一下即可。

git clone成功了------

注意,指令是模拟了两个用户,实际在开发中,每个用户都有自己的gitee / github账号,如果要多人进行协同开发,必须要将用户添加进开发者,用户才有权限进行代码提交:

邀请用户:

到这里,相当于有了两个用户------分别在linux和windows两个操作系统上针对于同一个项目进行协作开发------至此,我们的准备工作结束。

2.2 协作开发

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

接下来,就让我们在gitee上新建dev远程分支供我们使用:

这样就创建成功了:

创建成功的远程分支是可以通过Git拉取到本地来,以实现完成本地开发工作。

接下来,让我们和另一名开发的小伙伴都将远程仓库进行一次拉取操作(git pull)。

观察结果------

2.2.1 我们的操作

bash 复制代码
hyb@139-159-150-152:~/git_teaching$ git pull
From gitee.com:hyb91/git_teaching
 * [new branch] dev -> origin/dev
Already up to date.
# 注:之前讲的 git branch 其实只能查看本地分⽀,要查看远程分⽀需要加上-r选项。
# 但前提是要pull⼀下拉取最新的远端仓库,才能看到最新的内容。
hyb@139-159-150-152:~/git_teaching$ git branch -r 
 origin/HEAD -> origin/master
 origin/dev
 origin/master
hyb@139-159-150-152:~/git_teaching$ 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分支,根据上述示例中的操作,会将本地分支和远程分支的进行关系链接。

2.2.2 小伙伴的操作

2.2.3 协作开发

现在,你和你的小伙伴就可以在dev上完成开发。

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

bash 复制代码
hyb@139-159-150-152:~/git_teaching$ vim file.txt 
hyb@139-159-150-152:~/git_teaching$ cat file.txt 
hello git
complete the first function!
hyb@139-159-150-152:~/git_teaching$ git add file.txt 
hyb@139-159-150-152:~/git_teaching$ git commit -m "first function"
[dev 305f78a] first function
 1 file changed, 1 deletion(-)
hyb@139-159-150-152:~/git_teaching$ git push origin dev # 将dev分⽀推送到远端 
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 287 bytes | 287.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0)
remote: Powered by GITEE.COM [GNK-6.4]
To gitee.com:hyb91/git_teaching.git
 cc3be59..305f78a dev -> dev

我们看看码云上目前仓库的状态:

至此,我们已经将代码成功推送至码云,假如你的小伙伴要和你协同开发,碰巧也要对file.txt文件作修改,并试图推送,例如:

这时结果是推送失败的------因为你的小伙伴的最新提交和你推送的提交有冲突。

解决办法也很简单------Git已经提示我们:先git pull把最新的提交从origin / dev抓下来,再在本地进行合并,并解决冲突,再推送。操作如下:

解决冲突,我们重新推送:

此时,我们在远端的码云的仓库已经能看到我们的新提交了------

由此,两名开发者已经开始可以进行协同开发了,不断的git pull / add / commit / push,如果遇到了冲突,就使用我们之前介绍过的冲突处理办法把冲突解决掉。

对于你来说:要想看到小伙伴的代码,只需要git pull一下即可,例如:

bash 复制代码
hyb@139-159-150-152:~/git_teaching$ cat file.txt 
hello git
complete the first function!
hyb@139-159-150-152:~/git_teaching$ git pull
Updating 305f78a..72c5345
Fast-forward
 file.txt | 1 +
 1 file changed, 1 insertion(+)
hyb@139-159-150-152:~/git_teaching$ cat file.txt 
hello git
complete the first function!
complete the second function!

2.3 将内容合并到master

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

bash 复制代码
# 切换⾄ master分⽀, pull ⼀下,保证本地的master是最新内容。
# 合并前这么做是⼀个好习惯
hyb@139-159-150-152:~/git_teaching$ git checkout master 
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
hyb@139-159-150-152:~/git_teaching$ git pull
Already up to date.

# 切换⾄ dev 分⽀, 合并 master 分⽀
# 这么做是因为如果有冲突,可以在dev分⽀上进⾏处理,⽽不是在在master上解决冲突。
# 这么做是⼀个好习惯
hyb@139-159-150-152:~/git_teaching$ git checkout dev 
Switched to branch 'dev'
Your branch is up to date with 'origin/dev'.
hyb@139-159-150-152:~/git_teaching$ git merge master 
Already up to date.
# 切换⾄ master 分⽀,合并 dev 分⽀
hyb@139-159-150-152:~/git_teaching$ git checkout master 
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
hyb@139-159-150-152:~/git_teaching$ git merge dev 
Updating 7388a31..72c5345
Fast-forward
 file.txt | 2 ++
 1 file changed, 2 insertions(+)
hyb@139-159-150-152:~/git_teaching$ cat file.txt 
hello git
complete the first function!
complete the second function!
# 将 master 分⽀推送⾄远端
hyb@139-159-150-152:~/git_teaching$ git status
On branch master
Your branch is ahead of 'origin/master' by 4 commits.
 (use "git push" to publish your local commits)
nothing to commit, working tree clean
hyb@139-159-150-152:~/git_teaching$ git push origin master 
Total 0 (delta 0), reused 0 (delta 0)
remote: Powered by GITEE.COM [GNK-6.4]
To gitee.com:hyb91/git_teaching.git
 7388a31..72c5345 master -> master
hyb@139-159-150-152:~/git_teaching$ git status
On branch master
Your branch is up to date with 'origin/master'.
nothing to commit, working tree clean

此时,我们再观察远端窗口,已经是最新的代码了------

此时,dev分支对于我们来说就没用了,那么dev分支就可以被删除掉。

我们可以直接在远程仓库中将dev分支删除掉:

2.4 总结:在同一分支下进行多人协作的工作模式通常的流程

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

首先,可以试图用git push origin branch-name推送自己的修改;

如果推送失败,则因为远程分支比你的本地更新,需要先用gitpull试图合并;

如果合并有冲突,则解决冲突,并在本地提交;

没有冲突或者解决掉冲突后,再用git pushoriginbranch-name推送就能成功!

功能开发完毕,将分支merge进master,最后删除分支。


3 ~> 多人协作二:在不同分支下进行多人协作(通常情况)

3.1 前情提示

一般情况下,如果有多需求需要多人同时进行开发,是不会在一个分支上进行多人开发,而是一个需求或一个功能点就要创建一个feature分支。

现在同时有两个需求需要你和你的小伙伴进行开发,那么你们俩便可以各自创建一个分支来完成各自的工作。在【多人协作一】办法我们已经了解了:可以从码云上直接创建远程分支。其实,在本地创建的分支也可以通过推送的方式发送到远端。

现在我们就来用一下这种方式。

3.2 最佳实践

3.2.1 我的操作

对于你来说,可以进行以下操作:

bash 复制代码
# 新增本地分⽀ feature-1 并切换
hyb@139-159-150-152:~/git_teaching$ git branch 
 dev
* master
hyb@139-159-150-152:~/git_teaching$ git checkout -b feature-1
Switched to a new branch 'feature-1'
# 新增需求内容-创建function1⽂件
hyb@139-159-150-152:~/git_teaching$ vim function1
hyb@139-159-150-152:~/git_teaching$ cat function1 
Done!
# 将 feature-1 分⽀推送到远端
hyb@139-159-150-152:~/git_teaching$ git add function1 
hyb@139-159-150-152:~/git_teaching$ git commit -m"add function1"
[feature-1 12ed0db] add function1
 1 file changed, 1 insertion(+)
 create mode 100644 function1
hyb@139-159-150-152:~/git_teaching$ git push origin feature-1 
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 270 bytes | 270.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0)
remote: Powered by GITEE.COM [GNK-6.4]
remote: Create a pull request for 'feature-1' on Gitee by visiting:
remote: https://gitee.com/hyb91/git_teaching/pull/new/hyb91:feature1...hyb91:master
To
 gitee.com:hyb91/git_teaching.git
 * [new branch] feature-1 -> feature-1

3.2.2 小伙伴的操作

对于小伙伴来说,可以进行以下操作:

3.2.3 在不同分支下进行多人协作

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

我们再来看下此时远端码云上的状态:

你的feature-1分支:

小伙伴的feature-2分支:

正常情况下,你俩就可以在自己的分支上进行专业的开发了!

3.2.4 一个人开发两个分支

但天有不测风云,你的小伙伴突然生病了,但需求还没开发完,需要你帮他继续开发,于是他便把
feature-2分支名告诉你了------这时你就需要在自己的机器上切换到feature-2分支帮忙继续开发,要做的操作如下:

bash 复制代码
# 必须先拉取远端仓库内容
hyb@139-159-150-152:~/git_teaching$ git pull
...
From gitee.com:hyb91/git_teaching
 305f78a..72c5345 dev -> origin/dev
 * [new branch] feature-2 -> origin/feature-2
...

# 可以看到远程已经有了feature-2
hyb@139-159-150-152:~/git_teaching$ git branch -a
 dev
* 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 推送内容会失败
hyb@139-159-150-152:~/git_teaching$ 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'
hyb@139-159-150-152:~/git_teaching$ ls
a.so b.ini file.txt function2 README.en.md README.md

分支切换成功后便可以看见feature-2分支中的function 2文件了,接着就可以帮小伙伴继续开发:

bash 复制代码
# 继续开发
hyb@139-159-150-152:~/git_teaching$ vim function2 
hyb@139-159-150-152:~/git_teaching$ cat function2 
Done!
Help done!
# 推送内容
hyb@139-159-150-152:~/git_teaching$ git add function2 
hyb@139-159-150-152:~/git_teaching$ git commit -m"modify function2"
[feature-2 1079ae7] modify function2
 1 file changed, 2 insertions(+), 1 deletion(-)
hyb@139-159-150-152:~/git_teaching$ git push origin feature-2
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 262 bytes | 262.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0)
remote: Powered by GITEE.COM [GNK-6.4]
To gitee.com:hyb91/git_teaching.git
 e1233f1..1079ae7 feature-2 -> feature-2

查看远程状态,推送成功了------

这时,你的小伙伴身体已经调养的差不多了,可以继续进行自己的开发工作,那么他首先要获取到你帮他开发的内容,然后接着你的代码继续开发。或者你已经帮他开发完了,他也需要在自己的电脑上看看你帮他写的代码------

**Pull无效的原因:**小伙伴没有指定本地feature-2分支与远程origin / feature-2分支的链接

根据PowerShell给出的提示------只要设置一下feature-2和origin / feature-2的链接即可:

目前,小伙伴的本地代码和远端保持严格一致。

你和你的小伙伴可以继续在不同的分支下进行协同开发了。

3.3 将内容合并到master

各自功能开发完毕后,不要忘记我们需要将代码合并到master中才算真正意义上的开发完毕。

由于你的小伙伴率先开发完毕,于是开始merge:

查看一下此时远程仓库的状态------

当小伙伴将其代码merge到master后,此时我也开发完成了,也需要进行merge到master操作------

bash 复制代码
# 切换⾄ master分⽀, pull ⼀下,保证本地的master是最新内容。
# 合并前这么做是⼀个好习惯
hyb@139-159-150-152:~/git_teaching$ git checkout master
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
hyb@139-159-150-152:~/git_teaching$ git pull
From gitee.com:hyb91/git_teaching
 72c5345..29006bd master -> origin/master
Updating 72c5345..29006bd
Fast-forward
 function2 | 2 ++
 1 file changed, 2 insertions(+)
 create mode 100644 function2
 
# 切换⾄ feature-1 分⽀, 合并 master 分⽀
# 这么做是因为如果有冲突,可以在feature-1分⽀上进⾏处理,⽽不是在在master上解决冲突。
# 这么做是⼀个好习惯
hyb@139-159-150-152:~/git_teaching$ git checkout feature-1
Switched to branch 'feature-1'
Your branch is up to date with 'origin/feature-1'.
hyb@139-159-150-152:~/git_teaching$ git merge master 
Merge made by the 'recursive' strategy.
 function2 | 2 ++
 1 file changed, 2 insertions(+)
 create mode 100644 function2
hyb@139-159-150-152:~/git_teaching$ 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!!
hyb@139-159-150-152:~/git_teaching$ git status
On branch feature-1
Your branch is ahead of 'origin/feature-1' by 4 commits.
 (use "git push" to publish your local commits)
nothing to commit, working tree clean
hyb@139-159-150-152:~/git_teaching$ git push origin feature-1
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 299 bytes | 299.00 KiB/s, done.
Total 2 (delta 1), reused 0 (delta 0)
remote: Powered by GITEE.COM [GNK-6.4]
To gitee.com:hyb91/git_teaching.git
 ea75a35..4b4c3d4 feature-1 -> feature-1
 
# 切换⾄ master 分⽀,合并 feature-1 分⽀
hyb@139-159-150-152:~/git_teaching$ git checkout master 
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
hyb@139-159-150-152:~/git_teaching$ git merge feature-1
Updating 29006bd..4b4c3d4
Fast-forward
 function1 | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 function1
hyb@139-159-150-152:~/git_teaching$ ls
a.so b.ini file.txt function1 function2 README.en.md README.md
# 将 master 分⽀推送⾄远端
hyb@139-159-150-152:~/git_teaching$ git status 
On branch master
Your branch is ahead of 'origin/master' by 3 commits.
 (use "git push" to publish your local commits)
nothing to commit, working tree clean
hyb@139-159-150-152:~/git_teaching$ git push origin master 
Total 0 (delta 0), reused 0 (delta 0)
remote: Powered by GITEE.COM [GNK-6.4]
To gitee.com:hyb91/git_teaching.git
 29006bd..4b4c3d4 master -> master
hyb@139-159-150-152:~/git_teaching$ git status
On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean

此时远程仓库的状态:

和前面一样:此时feature-1和feature-2分支对于我们来说就没用了,我们可以直接在远程仓库中将dev分支删除掉------

这就是多人协作的工作模式,一旦熟悉了,就非常简单。


4 ~> 远程分支删除后,本地git branch-a依然能看到的解决办法

4.1 解决办法

当前我们已经删除了远程的几个分支,使用git branch-a命令可以查看所有本地分支和远程分支,但发现很多在远程仓库已经删除的分支在本地依然可以看到。例如:

bash 复制代码
hyb@139-159-150-152:~/git_teaching$ git pull
Already up to date.
hyb@139-159-150-152:~/git_teaching$ git branch -a
 dev
 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地址,远程分支,还有本地分支与之相对应关系等信息。

bash 复制代码
hyb@139-159-150-152:~/git_teaching$ git remote show origin 
* remote origin
 Fetch URL: git@gitee.com:hyb91/git_teaching.git
 Push URL: git@gitee.com:hyb91/git_teaching.git
 HEAD branch: master
 Remote branches:
 master tracked
 refs/remotes/origin/dev stale (use 'git remote prune' to remove)
 refs/remotes/origin/feature-1 stale (use 'git remote prune' to remove)
 refs/remotes/origin/feature-2 stale (use 'git remote prune' to remove)
 Local branches configured for 'git pull':
 dev merges with remote dev
 feature-1 merges with remote feature-1
 feature-2 merges with remote feature-2
 master merges with remote master
 Local ref configured for 'git push':
 master pushes to master (up to date)

此时我们还能看到那些远程仓库已经不存在的分支,根据提示:使用git remote prune origin命令:

bash 复制代码
hyb@139-159-150-152:~/git_teaching$ git remote prune origin 
Pruning origin
URL: git@gitee.com:hyb91/git_teaching.git
 * [pruned] origin/dev
 * [pruned] origin/feature-1
 * [pruned] origin/feature-2
hyb@139-159-150-152:~/git_teaching$ git branch -a
 dev
 feature-1
 feature-2
* master
 remotes/origin/HEAD -> origin/master
 remotes/origin/master

这样就删除了那些远程仓库不存在的分支。

对于本地仓库的删除,之前艾莉丝已经介绍过了,大家可以再看看艾莉丝的博客,自行操作。

4.2 最佳实践


Git:多人协作部分博主手记

多人协作一(在同一分支下进行多人协作)

多人协作二(在不同分支下进行多人协作)

远程分支删除后,本地git branch-a依然能看到的解决办法


结尾

创作过程中难免有所缺漏,如果uu们发现艾莉丝的文章哪里有所疏忽,望不吝赐教!感谢支持!

往期回顾:

【Git:深度解析Git远程操作和标签管理】从克隆到推送:Git 远程操作与标签管理完全指南

结语:都看到这里啦!那请大佬不要忘记给博主来个"一键四连"哦!

🗡博主在这里放了一只小狗,大家看完了摸摸小狗放松一下吧!🗡

૮₍ ˶ ˊ ᴥ ˋ˶₎ა

相关推荐
还是转转1 小时前
AI Code Review 工具
人工智能·代码复审
拓端研究室4 小时前
专题:2025AI产业全景洞察报告:企业应用、技术突破与市场机遇|附920+份报告PDF、数据、可视化模板汇总下载
大数据·人工智能·pdf
lumi.5 小时前
Vue + Element Plus 实现AI文档解析与问答功能(含详细注释+核心逻辑解析)
前端·javascript·vue.js·人工智能
m0_650108246 小时前
InstructBLIP:面向通用视觉语言模型的指令微调技术解析
论文阅读·人工智能·q-former·指令微调的视觉语言大模型·零样本跨任务泛化·通用视觉语言模型
金融小师妹7 小时前
基于NLP语义解析的联储政策信号:强化学习框架下的12月降息概率回升动态建模
大数据·人工智能·深度学习·1024程序员节
AKAMAI8 小时前
提升 EdgeWorker 可观测性:使用 DataStream 设置日志功能
人工智能·云计算
散峰而望8 小时前
C++数组(二)(算法竞赛)
开发语言·c++·算法·github
wanhengidc8 小时前
深度了解云手机是什么
运维·服务器·科技·智能手机·云计算
银空飞羽9 小时前
让Trae CN SOLO自主发挥,看看能做出一个什么样的项目
前端·人工智能·trae