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

🔥艾莉丝努力练剑:个人主页
❄专栏传送门:《C语言》、《数据结构与算法》、C/C++干货分享&学习过程记录、Linux操作系统编程详解、笔试/面试常见算法:从基础到进阶、测试开发要点全知道
⭐️为天地立心,为生民立命,为往圣继绝学,为万世开太平
🎬艾莉丝的简介:

目录
4 ~> 远程分支删除后,本地git branch-a依然能看到的解决办法
远程分支删除后,本地git branch-a依然能看到的解决办法
艾莉丝的Gitee地址
艾莉丝努力练剑的gitee

1 ~> 多人协作

那么,是时候干最重要的一件事情了——没错!实现多人协作开发!为了做这件事情,我们需要先做一些准备工作。我们之前已经将项目clone到了指定目录,如:
hyb@139-159-150-152:~/git_teaching$ pwd /home/hyb/git_teaching2 ~> 多人协作一:在同一分支下进行多人协作
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 我们的操作

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到远程。例如:
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一下即可,例如:
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上去,让我们的项目运行最新的代码。接下来我们就需要做这件事情了:
# 切换⾄ 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 我的操作
对于你来说,可以进行以下操作:
# 新增本地分⽀ 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-13.2.2 小伙伴的操作
对于小伙伴来说,可以进行以下操作:

3.2.3 在不同分支下进行多人协作
此时,在本地,你看不见他新建的文档,他看不见你新建的文档。并且推送各自的分支时,并没有任何冲突,你俩互不影响,用起来很舒服!!
我们再来看下此时远端码云上的状态:

你的feature-1分支:

小伙伴的feature-2分支:

正常情况下,你俩就可以在自己的分支上进行专业的开发了!
3.2.4 一个人开发两个分支
但天有不测风云,你的小伙伴突然生病了,但需求还没开发完,需要你帮他继续开发,于是他便把
feature-2分支名告诉你了——这时你就需要在自己的机器上切换到feature-2分支帮忙继续开发,要做的操作如下:
# 必须先拉取远端仓库内容 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文件了,接着就可以帮小伙伴继续开发:
# 继续开发 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操作——
# 切换⾄ 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命令可以查看所有本地分支和远程分支,但发现很多在远程仓库已经删除的分支在本地依然可以看到。例如:
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地址,远程分支,还有本地分支与之相对应关系等信息。
hyb@139-159-150-152:~/git_teaching$ git remote show origin * remote origin Fetch URL: [email protected]:hyb91/git_teaching.git Push URL: [email protected]: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命令:
hyb@139-159-150-152:~/git_teaching$ git remote prune origin Pruning origin URL: [email protected]: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 远程操作与标签管理完全指南
结语:都看到这里啦!那请大佬不要忘记给博主来个“一键四连”哦!
🗡博主在这里放了一只小狗,大家看完了摸摸小狗放松一下吧!🗡
૮₍ ˶ ˊ ᴥ ˋ˶₎ა