文章目录
- [1. 多人协作](#1. 多人协作)
- [2. 创建分支](#2. 创建分支)
-
- [2.1 开发者 Tom](#2.1 开发者 Tom)
- [2.2 开发者 Harry](#2.2 开发者 Harry)
- [2.3 查看分支](#2.3 查看分支)
- [3. 开发者 Tom 在 feature-2 分支下开发](#3. 开发者 Tom 在 feature-2 分支下开发)
- [4. 开发者 Harry 在 feature-2 分支下开发](#4. 开发者 Harry 在 feature-2 分支下开发)
- [5. 将各自开发的内容合并到 main 分支](#5. 将各自开发的内容合并到 main 分支)
-
- [5.1 开发者 Harry 进行 merge](#5.1 开发者 Harry 进行 merge)
- [5.2 开发者 Tom 进行 merge(需要解决冲突)](#5.2 开发者 Tom 进行 merge(需要解决冲突))
- [6. 远程分支删除后,本地 gitbranch -a 依然能看到的解决办法](#6. 远程分支删除后,本地 gitbranch -a 依然能看到的解决办法)
- [7. 总结](#7. 总结)
1. 多人协作
一般情况下,如果有多需求需要多人同时进行开发,是不会在一个分支上进行多人开发,而是一个需求或一个功能点就要创建一个 feature 分支。
现在同时有两个需求需要你和你的小伙伴进行开发,那么你们俩便可以各自创建一个分支来完成自己的工作。在【多人协作(一)】中,我们已经了解了可以从远端仓库上直接创建远程分支,其实在本地创建的分支也可以通过推送的方式发送到远端。在这个部分我们就来用一下这种方式。
本次实验内容如下:
- 目标:远程
main分支下新增function1和function2文件。 - 实现:由开发者 Tom 新增
function1文件,由开发者 Harry 新增function2文件。 - 条件:在不同分支下协作完成,各自让某一个功能私有某一个分支。
2. 创建分支
2.1 开发者 Tom
对于开发者 Tom 来说,可以进行以下操作:
bash
# 查看当前所在分支
git branch -a
# 新增本地分支 feature-1 并切换
git checkout -b feature-1
# 新增需求内容 - 创建 function1 文件
vim function1
cat function1
# 将 feature-1 分支推送到远端
git add function1
git commit -m "add function1"
git push origin feature-1
结果如下:

2.2 开发者 Harry
我们在上一篇文章中,Harry 用户下的 main 分支不是最新的代码,所以我们要先切换到 main 分支下,然后拉取最新的代码。
bash
# 查看当前所在分支
git branch -a
# 切换到 main 分支
git checkout main
# 拉取最新的代码
git pull
结果如下:

对于开发者 Harry 来说,可以进行以下操作:
bash
# 新增本地分支 feature-2 并切换
git checkout -b feature-2
# 新增需求内容 - 创建 function2 文件
vim function2
cat function2
# 将 feature-2 分支推送到远端
git add function2
git commit -m "add function2"
git push origin feature-2
结果如下:

2.3 查看分支
此时,在本地,你看不见他新建的文档,他看不见你新建的文档。并且推送各自的分支时,并没有任何冲突,你俩互不影响,用起来很舒服!!
再来看下远端仓库上此时的状态:

对于 Tom 用户的 feature-1 分支:

对于 Harry 用户的 feature-2 分支:

正常情况下,你俩就可以在自己的分支上进行专业的开发了!
3. 开发者 Tom 在 feature-2 分支下开发
但天有不测风云,你的小伙伴 Harry 突然生病了,但需求还没开发完,需要你帮他继续开发,于是他便把 feature-2 分支名告诉你了。这时你就需要在自己的机器上切换到 feature-2 分支帮忙继续开发,要做的操作如下:
bash
# 必须先拉取远端仓库内容
git pull
# 可以看到远程已经有了 feature-2 分支了
git branch -a
# 切换到 feature-2 分支上,可以和远程的 feature-2 分支关联起来
# 如果不关联的话,将来使用 git push 推送内容会失败
git checkout -b feature-2 origin/feature-2
结果如下:

切换成功后,便可以看见 feature-2 分支中的 function2 文件了,接着就可以帮小伙伴进行开发:
bash
# 继续开发
vim function2
cat function2
# 推送内容
git add function2
git commit -m "modify function2"
git push
结果如下:

查看远程仓库状态,推送成功了:

4. 开发者 Harry 在 feature-2 分支下开发
这时,你的小伙伴 Harry 已经修养的差不多,可以继续进行自己的开发工作,那么他首先要获取到你帮他开发的内容,然后接着你的代码继续开发。或者你已经帮他开发完了,那他也需要在自己的电脑上看看你帮他写的代码:
bash
# 拉取最新的代码
git pull
结果如下:此时,我们发现代码竟然没有拉取成功?

Pull 无效的原因是 Harry 没有指定本地 feature-2 分支与远程 origin/feature-2 分支的链接,根据提示,设置 feature-2 和 origin/feature-2 的链接即可:
bash
# 建立链接
git branch --set-upstream-to=origin/feature-2 feature-2
# 重新拉取最新的代码
git pull
结果如下:

目前,Harry 的本地代码和远端保持严格一致,接着 Harry 用户可以继续在该分支下进行开发了。
bash
# 继续开发
vim function2
cat function2
# 推送内容
git add function2
git commit -m "function2 finish"
git push
结果如下:

查看远程仓库状态,推送成功了:

5. 将各自开发的内容合并到 main 分支
各自功能开发完毕后,不要忘记我们需要将代码合并到 main 中才算真正意义上的开发完毕。
5.1 开发者 Harry 进行 merge
由于 Harry 用户率先开发完毕,于是开始 merge。
1️⃣ 切换至 main 分支,然后 pull 一下,保证本地的 main 是最新内容
bash
git checkout main
git pull
结果如下:

2️⃣ 切换至 feature-2 分支,然后合并 main 分支
bash
git checkout feature-2
git merge main
结果如下:

3️⃣ 切换至 main 分支,然后合并 feature-2 分支
bash
git checkout main
git merge feature-2
结果如下:

4️⃣ 将 main 分支推送到远端
bash
git push
git status
结果如下:

此时远程仓库的状态:

5.2 开发者 Tom 进行 merge(需要解决冲突)
1️⃣ 切换至 main 分支,然后 pull 一下,保证本地的 main 是最新内容(合并前这么做是一个好习惯)
bash
git checkout main
git pull
结果如下:因为 Harry 用户已经把 feature-2 的内容合并到 main 分支上了,所以此时 main 分支是有更新的。

2️⃣ 切换至 feature-1 分支,然后合并 main 分支(这么做是因为此时有冲突,那么可以在 feature-1 分支上进行处理,而不是在 main 上解决冲突。)
bash
git checkout feature-1
git merge main
结果如下:

3️⃣ 由于本地 feature-1 分支已经 merge 进来了新内容,为了保证远程 feature-1 分支最新,所以最好先 push 一下。
- 要 push 的另一个原因是因为在实际的开发中,main 的 merge 操作一般不是由我们自己在本地行操作,其他人员或某些平台 merge 时,操作的肯定是远程分支,所以就要保证远程分支的最新。
- 如果 merge 出现冲突,此时需要 commit 才可以 push 成功(下面 merge 操作并没有出现冲突)
bash
# 查看链接状态
git branch -vv
# 由于我们并没有把本地的feature-1分支和远程的feature-1建立链接,
# 所以需要使用长命令来推送
git push origin feature-1
结果如下:

此时,在远程仓库的 feature-1 分支也更新了内容:

4️⃣ 切换至 main 分支,然后合并 feature-1 分支
bash
git checkout main
git merge feature-1
结果如下:

5️⃣ 将 main 分支推送到远端
bash
git push origin main
结果如下:

此时远程仓库的状态:

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

这就是多人协作的工作模式,一旦熟悉了,就非常简单。
6. 远程分支删除后,本地 gitbranch -a 依然能看到的解决办法
当前我们已经删除了远程的几个分支,使用 git branch -a 命令可以查看所有本地分支和远程分支,但发现很多在远程仓库已经删除的分支在本地依然可以看到。例如:
bash
# 查看
git branch -a
结果如下:

使用命令 git remote show origin,可以查看 remote 地址、远程分支,还有本地分支与之相对应关系等信息。
bash
git remote show origin
结果如下:

此时我们可以看到那些远程仓库已经不存在的分支,根据提示,使用 git remote prune origin 命令:
bash
# 修剪分支
git remote prune origin
# 查看本地分支
git branch -a
结果如下:可以看到,此时就删除了那些远程仓库不存在的分支。

但是本地仓库的分支还在,对于本地仓库的删除,直接使用 git branch -d [分支名] 即可:
bash
git branch -d dev feature-1 feature-2
结果如下:

同样,在 Harry 用户下也进行一样的操作:

7. 总结
协同开发完成后,在进行合并操作时,为了不让 main 分支出错,我们可以进行下面的操作。
如下图所示:
