文章目录
- 前言
- 一、多人协作一
- 开发目标
- 将dev分支内容合并至master分支
- 二、多人协作二
- 开发者1操作
- 开发者2操作
- 突发情况
- 内容合并至master分支
- 三、解决git branch -a打印已被删除的远程分支的方法
- 总结
前言
目前,我们所完成的工作如下 :
- 基本完成Git的所有本地库的相关操作,git基本操作,分支理解,版本回退,冲突解决等等
- 申请码云账号,将远端信息clone到本地,以及推送和拉取
正文开始!!!
一、多人协作一
是时候干最重要的一件事情了,实现多人协作开发!为了这件事情,我们需要先做一些准备工作.我们之前已经将项目clone到了指定目录,如 :
接下来在windows环境下,再clone同一个项目仓库,来模拟和你一起协作开发的另一名小伙伴 :
注意,这里我们模拟了两个用户,实际开发中,每个用户都有自己的Gitee/GitHub账号,如果要多人进行协同开发,必须要将用户添加进开发者,用户才有权限进行代码提交 :
至此,相当于两个用户,分别在linux和windows上针对同项目进行协作开发,我们的准备工作到此结束.
目前,我们的仓库只有一个master主分支,但在实际的项目开发中,在任何情况下其实都是不允许直接在master分支上修改代码的,这是为了保证主分支的稳定.所以在开发新功能时,常常会新建其他分支,供开发时进行迭代使用.
那么接下来,就让我们在Gitee上新建dev远程分支供我们使用 :
创建成功的远程分支是可以通过Git拉取到本地来,以实现完成本地的开发工作.
接下来让我们和另一名开发的小伙伴都将远程仓库进行一次拉取操作,并观察结果 :
- 对于开发者1要操作的是 :
拉取后可以看到远程的dev分支,接着切换到dev分支供我们进行本地开发. - 对于开发者2要操作的是 :
首先我们在本地创建dev分支,将本地dev分支和远端dev分支进行关联
- 开发者1
- 开发者2
现在,你和小伙伴就可以在dev
上完成开发.
开发目标
首先,我在dev
分支上进行一次开发,并push
到远程.例如 :
再来看看码云上目标仓库的状态 :
至此,开发者1已经将代码成功推送至码云,接下来加入你的小伙伴要和你协同开发,碰巧也要对file.txt文件作修改,并试图推送,例如 :
这时推送失败,因为你的小伙伴的最新提交和你推送的提交有冲突,解决办法也很简单,Git已经提示我们,先用git pull
把最新提交从origin/dev
抓下来,然后在本地进行合并,并解决冲突,在推送.操作如下 :
解决冲突,重新推送 :
此时,我们看到远端的码云已经能看到我们的新提交了!
由此,两名开发者已经开始可以进行协同开发了,不断的git pull/add/commit/push
,遇到了冲突,就解决冲突即可.
对于你来说,想要看到小伙伴提交的代码,只需要git pull
一下即可.
将dev分支内容合并至master分支
虽然是在分支上进行多人协作开发,但最终的目的是要将开发后的代码合并到master上去,让我们的项目运行最新的代码.操作如下 :
切换到master分支,pull一下,保证本地的master是最新内容,合并前这么做是一个好习惯.
切换⾄ dev 分⽀, 合并 master 分⽀这么做是因为如果有冲突,可以在dev分⽀上进⾏处理,⽽不是在在master上解决冲突。这么做是⼀个好习惯.
切换至master分支,合并dev分支.
此时,查看远端仓库,master已经是最新代码了 :
此时,dev分支对于我们来说就没有用了,那么dev分支就可以被删除掉,我们直接可以在远程仓库中将dev分支删除掉 :
总结:在同一分支下进行多人写作的工作模式通常是这样的 :
- 首先,可以试图用git push origin branch-name推送自己的修改;
- 如果推送失败,是因为远程分支比你的本地更新,需要先用git pull试图合并;
- 如果合并有冲突,则解决冲突,并在本地提交;
- 没有冲突或者解决掉冲突后,再用git push origin branc-name推送就能成功!
- 功能开发完毕,将分支merge进master,最后删除分支.
二、多人协作二
一般情况下,如果有多需求需要多人同时进行开发,是不会在一个分支上进行多人开发的而是一个需要或一个功能点就要创建一个feature
分支.
现在同时有两个需求需要你和你的小伙伴进行开发,那么你们俩便可以各自创建一个分支来完成自己的工作.在上个部分我们已经了解了可以从码云直接创建远程分支,其实在本地创建的分支也可以通过推送的方式发送到远端.在这里我就采用这种方式.
开发者1操作
新增本地分支 feature-1 并切换
新增需求内容-创建func1文件
将 feature-1 推送至远端
开发者2操作
创建并切换到 feature-2 分支
在分支下为需求新增func2文件
将 feature-2 分支推送至远端
此时,在本地你看不见他新建的文档,他看不见你新建的文档.并且推送各自的分支时,并没有任何冲突,你俩互补影响,用起来很舒服!
此时来查看码云上面的状态 :
对于开发者1的 feature-1 分支 :
对于开发者2的 feature-2 分支 :
正常情况下,你俩就可以在⾃⼰的分⽀上进⾏专业的开发了!
突发情况
但天有不测风云,你的小伙伴突然生病了,但需求还没开发完,需要你帮他继续开发,于是他便把 feature-2 分支名告诉你了.这是你就需要在自己的机器上切换到 feature-2分支帮忙继续开发,要做的操作如下 :
先拉去远端仓库的内容
可以看到远程已经有了 feature-2
切换到 feature-2分支上,可以和远程的 feature-2 分支关联起来,否则将来只用git push推送内容会失败
切换成功后,便可以看见 feature-2 分支中的func2文件了,接着就可以帮小伙伴进行开发 :
推送内容
查看远程状态,推送成功了 :
这时,你的小伙伴已经修养的差不多,可以继续进行自己的开发工作,那么首先他要获取到你帮他开发的内容,然后接着你的代码继续开发.或者你已经帮他开发完了,那他也需要在自己的电脑上看看你帮他写的代码 :
pull无效的原因是小伙伴没有指定本地 feature-2分支 与远程origin/feature-2分支的链接,根据提示,设置 feature和origin/feature-2的链接即可 :
目前,小伙伴的本地代码和远端保持严格一致.你和你的小伙伴可以继续在不同的分支下进行协同开发了.
各自功能开发完毕后,不要忘记我们需要将代码合并到master中才算真正意义上的开发完毕.
内容合并至master分支
由于你的小伙伴率先开发完毕,于是开始merge
至此,就合并完成了!
当你的小伙伴将其代码merge
到master
后,这时你也开发完成了,也需要进行merge
到master
操作,于是你 :(在本地实现合并)
切换至master分支,pull一下,保证本地的master是最新内容,这是一个好习惯!
# 切换至 feature-1分支合并master分支,这么做是因为如果用冲突,可以在 feature-1 分支上进行处理,而不是在master分支上解决冲突.
[huluwa@centos7 ~/remote-gitcode]$ git checkout feature-1
Switched to branch 'feature-1'
[huluwa@centos7 ~/remote-gitcode]$ git merge master
Merge made by the 'recursive' strategy.
func2 | 2 ++
1 file changed, 2 insertions(+)
create mode 100644 func2
[huluwa@centos7 ~/remote-gitcode]$ ls
a.so b.ini file.txt func1 func2 README.en.md README.md
由于 feature-1 分支已经merge进来了新内容,为了保证远程分支最新,最好push一下.
要push的另一个原因是因为在实际开发中,master的merge操作一般不是由我们自己在本地完成.
如果merge出现冲突,不要忘记需要commit才可以push.
切换至 master分支,合并 feature-1分支
将 master分支推送至远端
此时远程仓库的状态 :
此时,feature-1
和feature-2
分支对于我们来说就没用了,那么我们可以直接在远程仓库中将分支删掉 :
这就是多⼈协作的⼯作模式,⼀旦熟悉了,就⾮常简单.
三、解决git branch -a打印已被删除的远程分支的方法
当前我们已经删除了远程的几个分支,使用git branch -a
命令可以查看所有本地分支和远程分支,但发现很多在远程仓库已经删除的分支在本地依然可以看到.例如 :
使用命令git remote show origin
,可以查看remote地址,远程分支,还有本地分支与之相对于关系等信息.
此时我们可以看到远程仓库已经不存在的分支,根据提示,使用git remote prune origin
命令 :
这样就删除了那些远程仓库不存在的分⽀。对于本地仓库的删除,之前的课程已经学过了,⼤家可以⾃⾏从操作。
总结
(本章完!!!)