一、多人协作(1)
⽬前,我们所完成的工作如下:
-
基本完成 Git 的所有本地库的相关操作,git 基本操作,分支理解,版本回退,冲突解决等等。
-
申请码云账号,将远端信息 clone 到本地,以及推送和拉取。
是时候做最重要的一件事情了,实现多人协作开发。
为了做这件事情,需要先做一些准备工作。我们之前已经将项目 clone 到了指定目录,如:
![](https://img-blog.csdnimg.cn/direct/0e7aa3cdb9724a16ac7423103e109ade.png)
完成任务:
![](https://img-blog.csdnimg.cn/direct/799c8b53d11a479db571f922bde76356.png)
在 Windows 环境下,再 clone 同一个项目仓库,来模拟和我们⼀起协作开发的另一名小伙伴:
![](https://img-blog.csdnimg.cn/direct/17d74894830b4a0f8f9c91d41d21b1dc.png)
![](https://img-blog.csdnimg.cn/direct/90af54546fa84257b01c3ad2ec9b176f.png)
找一个新的文件夹,进入文件夹后右键:
![](https://img-blog.csdnimg.cn/direct/cfebaa706bc04fd08dac0ee796a177bd.png)
![](https://img-blog.csdnimg.cn/direct/bdebf4180f334f0b9455715c103efb92.png)
![](https://img-blog.csdnimg.cn/direct/27958bb537fb4ceb8e38a9768a982353.png)
clone 成功:
![](https://img-blog.csdnimg.cn/direct/67e9a2896e7448cab2cd8f5e4b70c3f6.png)
注意:这里是模拟了两个用户。但在实际开发中,每个用户都有属于自己的 gitee/github 账号,如果要多人进行协同开发,必须要将用户添加进开发者,用户才有权限进行代码提交:
![](https://img-blog.csdnimg.cn/direct/11c7672d40f54c4196c651ce6562cdeb.png)
邀请用户:
![](https://img-blog.csdnimg.cn/direct/08126637c4774ede96d31b479be073f7.png)
到此,相当于有了两个用户,分别在 Linux 和 Windows 上针对于同个项目进行协作开发,我们的准备工作到此结束。
目前,我们的仓库中只有一个 master 主分支,但在实际的项目开发中,在任何情况下其实都是不允许直接在 master 分支上修改代码的,这是为了保证主分支的稳定。所以在开发新功能时,常常会新建其他分支,供开发时进行迭代使用。那么接下来,就让我们在 gitee 上新建 dev 远程分支供我们使用:
创建成功:
创建成功的远程分支是可以通过 Git 拉取到本地来,以实现完成本地开发工作。接下来让我们和另一名开发的小伙伴都将远程仓库进行一次拉取操作。
对于我们要操作的是:
![](https://img-blog.csdnimg.cn/direct/243142f776a84500acfd9ddb1119b29f.png)
注意 :之前讲的 git branch 只能查看本地分支,要查看远程分⽀需要加上 -r 选项。但前提是要 pull ⼀下拉取最新的远端仓库,才能看到最新的内容。
![](https://img-blog.csdnimg.cn/direct/600a93760c964830bd7a672057f3cda9.png)
![](https://img-blog.csdnimg.cn/direct/6d0dbb2ab70442dab4000417de7fd713.png)
![](https://img-blog.csdnimg.cn/direct/dd522c8d734f484eba69724291670cc1.png)
![](https://img-blog.csdnimg.cn/direct/cd8913a88a90458f9936562383febcf3.png)
拉取后便可以看到远程的 dev 分支,接着切换到 dev 分支供我们进行本地开发。要说明的是,我们切换到的是本地的 dev 分支,根据示例中的操作,会将本地分支和远程分支的进行关系链接。
对于另一名小伙伴要操作的是:
![](https://img-blog.csdnimg.cn/direct/fdabc678160441e3a09e86fa5aeee100.png)
现在,我们就可以和小伙伴在 dev 上完成开发。
首先,让我们在 dev 分支上进行一次开发,并 push 到远程:
![](https://img-blog.csdnimg.cn/direct/a0b63a11ecf4463da6a265774d5b0cde.png)
来看看码云上目前仓库的状态:
至此,我们已经将代码成功推送至码云,接下来假如小伙伴要和我们协同开发,碰巧也要对 file.txt 文件做修改,并试图推送:
![](https://img-blog.csdnimg.cn/direct/2ede01e9b4254a83a988a8b09a7a7ff3.png)
![](https://img-blog.csdnimg.cn/direct/9f0e1ee8475945aba2e6469b13385e52.png)
![](https://img-blog.csdnimg.cn/direct/bcfbd49e5388484b8c4d6bad88a262db.png)
这时推送失败,因为小伙伴的最新提交和你推送的提交有冲突,解决办法也很简单,Git 已经给出了提示,先用 git pull 把最新的提交从 origin/dev 抓下来,然后再在本地进行合并,并解决冲突,再推送。操作如下:
![](https://img-blog.csdnimg.cn/direct/950aa923422f4596bc43eb0449ba07d9.png)
解决冲突,重新推送:
![](https://img-blog.csdnimg.cn/direct/2168e1b34a4148cfa163766baad6c403.png)
此时,在远端的码云就能够看到我们的新提交了:
![](https://img-blog.csdnimg.cn/direct/afac6191657f4c658d40f831c41a5c79.png)
![](https://img-blog.csdnimg.cn/direct/3a601c7463e741518c3c9d98a9f3b59a.png)
由此,两名开发者已经开始可以进行协同开发了,不断的 git pull/add/commit/push,遇到冲突就使用之前讲的冲突处理解决掉冲突。
对于我们来说,要想看到小伙伴的代码,只需要 pull 一下即可:
![](https://img-blog.csdnimg.cn/direct/8dbd4629add64ac299d16627d7c78326.png)
最后不要忘记,虽然我们是在分支上进行多人协作开发,但最终的目的是要将开发后的代码合并到 master 上去,让我们的项目运行最新的代码。接下来我们就需要做这件事情了:
切换至 master 分支,pull 一下,保证本地的 master 是最新内容,合并前这么做是一个好习惯。
![](https://img-blog.csdnimg.cn/direct/27028c4a036a422192cebbd3609b109a.png)
切换至 dev 分支,合并 master 分⽀,这么做是因为如果有冲突的话,可以在 dev 分支上进行处理,而不是在 master 上解决冲突,这么做也是一个好习惯。
![](https://img-blog.csdnimg.cn/direct/bcb13b8986fe40e09ff3887e28df7c3b.png)
切换至 master 分支,合并 dev:
![](https://img-blog.csdnimg.cn/direct/b50b9d1c44ac455e96a8543fb1a37ac2.png)
将 master 分支推送到远端:
![](https://img-blog.csdnimg.cn/direct/7bc7aa739ceb4bf8880ea47eab3c051c.png)
此时再查看远端仓库,master 已经是最新代码了:
此时,dev 分支对于我们来说就没用了, 那么 dev 分支就可以被删除掉。我们可以直接在远程仓库中将 dev 分支删除掉:
![](https://img-blog.csdnimg.cn/direct/3800300987e04c00a6468a64a8a2eead.png)
![](https://img-blog.csdnimg.cn/direct/369883e059644d93b75f805155b2c2f2.png)
总结一下,在同一分支下进行多人协作的工作模式通常是这样:
- 首先,可以试图用 git push origin branch-name 推送自己的修改。
- 如果推送失败,是因为远程分支比我们的本地更新,需要先用 git pull 试图合并。
- 如果合并有冲突,就解决冲突,并在本地提交。(解决冲突是一件很麻烦的事情)
- 没有冲突或者解决掉冲突后,再用 git push origin branch-name 推送就能成功。
- 功能开发完毕,将分支 merge 进 master,最后删除分支。
二、多人协作(2)
完成任务:
![](https://img-blog.csdnimg.cn/direct/b84a614f76254439bf0e9c88ff862477.png)
一般情况下,如果有多需求需要多人同时进行开发,是不会在一个分支上进行多人开发,而是一个需求或一个功能点就要创建一个 feature 分支。现在同时有两个需求需要我们和小伙伴进行开发,那么我俩便可以各自创建一个分支来完成自己的工作。前面我们已经了解了可以从码云上直接创建远程分支,其实在本地创建的分子也可以通过推送的方式发送到远端。在这个部分我们就来用一下这种方式。
对于我而言,可以进行以下操作:
- 新增本地分支 feature-1 并切换
![](https://img-blog.csdnimg.cn/direct/27206a98b3fb455388c888f4bc8bda0c.png)
- 新增需求内容 ------ 创建 feature1 文件
![](https://img-blog.csdnimg.cn/direct/4c2cdc48895742bd9e1050510bda1a2e.png)
- 将 feature-1 分支推送到远端
![](https://img-blog.csdnimg.cn/direct/26559aa9078b466dbcd4835c8a166e04.png)
![](https://img-blog.csdnimg.cn/direct/495990b469b9487c96c6df7f42b79830.png)
![](https://img-blog.csdnimg.cn/direct/9861cc942f694fd2ad642aba36f54e80.png)
对于小伙伴来说,可以进行以下操作:
- 创建并切换到 feature-2 分支
![](https://img-blog.csdnimg.cn/direct/e5aa3f0062d44cc298dbe188d29528a8.png)
- 在分支下为需求新增 function2 文档
![](https://img-blog.csdnimg.cn/direct/022493fd628e4ef89d6022cd5e1c42bf.png)
- 将 feature-2 分支推送至远端
![](https://img-blog.csdnimg.cn/direct/d41aea891efc4ef58f823ee9bbf6addd.png)
此时在本地看不见伙伴新建的文档,他也看不见我们新建的文档,并且推送各自的分支时,并没有任何冲突,我俩不受对方的影响,用起来就很舒服。
再来看下远端码云上此时的状态:
![](https://img-blog.csdnimg.cn/direct/ab1abf95145f432bbdbd2f5adc37c596.png)
对于我们的 feature-1 分支:
![](https://img-blog.csdnimg.cn/direct/540aa14fc3ec46dca5619c8228c5525e.png)
![](https://img-blog.csdnimg.cn/direct/f23454a9d82747d0b9c5afe42d892316.png)
对于小伙伴的 feature-2 分支:
正常情况下,我俩就可以在自己的分支上进行专业的开发了。但万一有天小伙伴突然生病了,但需求还没开发完,需要我帮他继续开发,于是他就把 feature-2 分支名告诉我。这时我就需要在自己的机器上切换到 feature-2 分支帮忙继续开发,要做的操作如下:
- 必须先拉取远端仓库内容
![](https://img-blog.csdnimg.cn/direct/c956422508764e55a6f8a143187d8ca6.png)
- 可以看到远程已经有了 feature-2
![](https://img-blog.csdnimg.cn/direct/734022d8d3c4465a9df14ab8c9800652.png)
- 切换到 feature-2 分支上,可以和远程的 feature-2 分支关联起来,否则将来只使用 git push 推送内容会失败
![](https://img-blog.csdnimg.cn/direct/b75200262e134808971895b1c42c39c2.png)
切换成功后,便可以看见 feature-2 分支中的 function2 文件了,接着就可以帮小伙伴进行开发:
- 继续开发
![](https://img-blog.csdnimg.cn/direct/583fb4d5567a42f88d71d9189843d744.png)
- 推送内容
![](https://img-blog.csdnimg.cn/direct/7ab2eef81f6345f09eb86aefa3fdef3e.png)
查看远程状态,推送成功了:
![](https://img-blog.csdnimg.cn/direct/3c7cabf776e84a26b507a4729c547e8b.png)
这时小伙伴已经修养的差不多,可以继续进行自己的开发工作,那么他首先要获取到我们帮他开发的内容,然后接着我们的代码继续开发。或者我们已经帮他开发完了,那他也需要在自己的电脑上看看我们帮他写的代码:
![](https://img-blog.csdnimg.cn/direct/675cb3dc439c402fbfdae962601a2bbc.png)
![](https://img-blog.csdnimg.cn/direct/2171d636406c44d5ac072813fa402d24.png)
可以发现代码没有 pull 下来。
Pull 无效的原因是:小伙伴没有指定本地 feature-2 分支与远程 origin/feature-2 分支的链接。
根据提示,设置 feature-2 和 origin/feature-2 的链接即可:
![](https://img-blog.csdnimg.cn/direct/df0c1086a9fd472fb654a74dfb4aa5a9.png)
目前,小伙伴的本地代码和远端保持严格一直。我和小伙伴可以继续在不同的分支下进行协同开发了。
各自功能开发完毕后,我们需要将代码合并到 master 中才算真正意义上的开发完毕。
新建一个 Pull Request,让 feature-2 分支合并到 master 分支上:
![](https://img-blog.csdnimg.cn/direct/3c7b7d78f66349618aa5be95fe801e71.png)
![](https://img-blog.csdnimg.cn/direct/8a69c8cdea214ebbaab740080014d994.png)
![](https://img-blog.csdnimg.cn/direct/f353eb8d2d864e919c9a694d773471df.png)
![](https://img-blog.csdnimg.cn/direct/aac436fb90ac45659686d0bb5274d12c.png)
![](https://img-blog.csdnimg.cn/direct/45735940d60d45f38fdc9cc322ebd7f8.png)
![](https://img-blog.csdnimg.cn/direct/da64ad76257c4af7bb9debda529fac5a.png)
![](https://img-blog.csdnimg.cn/direct/777b31c8ef0f4660a94f5172d10ada6c.png)
![](https://img-blog.csdnimg.cn/direct/77d4253a3fda4da1ae209d4ca23e71d8.png)
![](https://img-blog.csdnimg.cn/direct/9a1e690a17ce48499ec56f8b4b3ce8fe.png)
让 feature-1 分支合并到 master 分支上:
- 切换至 master 分支,pull 一下,保证本地的 master 是最新内容,合并前这么做是⼀个好习惯
![](https://img-blog.csdnimg.cn/direct/51990c66b4f9466ab709ada154a71f6f.png)
- 切换至 feature-1 分支,合并 master 分支。这么做是因为如果有冲突,可以在 feature-1 分支上进行处理,而不是在 master 上解决冲突,这么做也是⼀个好习惯
![](https://img-blog.csdnimg.cn/direct/510e4d5da6c6414d94086285e254aa70.png)
![](https://img-blog.csdnimg.cn/direct/99c6b782d03840a3b09d4a12987a9974.png)
![](https://img-blog.csdnimg.cn/direct/48fa7609ba374b1e8fe619f44a984a0a.png)
- (1)由于 feature-1 分支已经 merge 进来了新内容,为了保证远程分支最新,所以最好 push ⼀下。
- (2)要 push 的另⼀个原因是因为在实际的开发中,master 的 merge 操作一般不是由我们自己在本地进行操作,其他⼈员或某些平台 merge 时,操作的肯定是远程分支,所以就要保证远程分支的最新。
- (3)如果 merge 出现冲突,不要忘记需要 commit 才可以 push。
![](https://img-blog.csdnimg.cn/direct/ae5c4eaddf8947679ce31689b34981ac.png)
![](https://img-blog.csdnimg.cn/direct/545ef9ce7d934156a09d59ae53184eae.png)
![](https://img-blog.csdnimg.cn/direct/725ad1c1df3c41309e05cb7cee1cd5be.png)
![](https://img-blog.csdnimg.cn/direct/d5ad7fd1a5f64616b37894fbc7f70f34.png)
![](https://img-blog.csdnimg.cn/direct/3d149509257342ce98d017a2963cfa9e.png)
此时远程仓库的状态:
![](https://img-blog.csdnimg.cn/direct/db683fb95ae54fa19253c7a8b717691c.png)
此时, feature-1 和 feature-2 分支对于我们来说就没用了, 那么我们可以直接在远程仓库中将 dev 分支删除掉:
![](https://img-blog.csdnimg.cn/direct/e33a6c387f314b94891bd3e86dd74869.png)
以上就是多人协作的工作模式。
三、远程分支删除后,本地 git branch -a 依然能看到的解决办法
当前我们已经删除了远程的几个分支,使用 git branch -a 命令可以查看所有本地分支和远程分支,但发现很多在远程仓库已经删除的分支在本地依然可以看到。
![](https://img-blog.csdnimg.cn/direct/7a0a0fe820f34e589570a908cb6bfed9.png)
使用命令 git remote show origin 可以查看 remote 地址,远程分支,还有本地分支与之相对应关系等信息。
![](https://img-blog.csdnimg.cn/direct/ba751c5b33dc48a2a139a8465bd364e7.png)
此时我们可以看到那些远程仓库已经不存在的分支,根据提示,使用命令:git remote prune origin
这样就删除了那些远程仓库不存在的分支。而对于本地仓库的删除,前面我们已经学过了,这里就不再赘述了。