在前面我们介绍 GIT 的功能无非就是围绕版本控制展开的,而分支则是 GIT 另一个功能的体现,就是多人协作。
我们的 GIT 无非就是对版本进行管理,如下所示

这里我更新了四个版本,这四个版本就像一条线一样。
此时我有这样一个需求,我已经更新到版本 4 了,但是我一个人开发实在是太慢了,所以我希望和我的同学协助开发,也就是说我们都基于版本 4 进行开发,我开发功能 A,我的同学开发功能 B,我们都开发完毕之后将我们两个人开发好的地方进行合并,这样就完成了协助开发。使用 GIT 进行协作开发就是这么一个流程。
当我们要使用 GIT 进行写作开发的时候,我肯定要基于某个版本去协作开发,比如我基于版本 4 去协作开发,那和我协作的每一个人都要基于版本 4 去协作开发,相当于就是每个人复制一个版本 4 出来,然后不断进行版本更新,最后实现某个模块,实际上,我们复制出来的这份,就是一个分支。

如图所示,当我想基于版本 4 进行协作开发,我可以基于版本 4 去开发一个版本 5'',我的同事可以基于版本 4 开发一个版本 5',当然他也可以更新到版本 6',最后我们开发完毕之后,合并为一个版本 7,这样就可以进行发布,我和我同事基于版本 4 各自开发的这一条线就是一个分支,这其实就是分支的概念。
每一个分支都要有一个名字,我们的主分支名就叫 master。
我们可以使用 git branch 来列出本地所有分支,使用 git branch [branchName] 来创建一个新分支,创建分支后依旧会停留在当前分支,我们可以使用 git checkout [branchName] 来切换分支,不同的分支可以去做不同的事情,都可以提交到仓库中,不同分支是互相独立互不影响的。
当我们独立开发完毕后,我们使用 git merge [branch],可以将指定的分支合并到当前我所处的分支。
当我们尝试将一个高版本合并到低版本时,会直接指向高版本
当我们执行合并的时候,我们考虑这样一个场景,同一个文件,我和我同事都修改了这个文件,这个时候就有一个问题,当我要合并我同事的文件时,由于这个文件被我和我同事两个人同时修改过,我到底是保留我的还是用我同事的。如果出现了这种情况,就会出现合并冲突的情况,当出现冲突之后,我们可以在冲突文件的内部看到具体的文件,冲突文件内部是包含我们原来的内容和别人的内容的,我们可以都保留,可以选择要我们自己的,也可以选择要他的,这个解决冲突需要我们手动在文本编辑器进行,解决完冲突后,不要忘记重新提交为一个版本。
以上的操作都是基于本地的,也就是说都是基于我们在同一个电脑上进行开发,这显然不对头是吧,我们要协作,肯定是在不同的电脑上进行开发,为了实现这个功能,就要引入远程分支,例如非常出名的 github ,以及国内的 gitee 就是基于 GIT 的远程分支。
我们这里使用 gitee 。
实际上这种 gitee 就是基于 git 的管理项目的软件,这一点区别于我们的本地仓库,在 gitee 上的都是远程仓库,生成本地仓库我们使用 git init,在远程仓库,我们使用可视化操作来完成仓库的创建。
我们有了远程仓库之后,我们就要把这个远程仓库拿到我们的电脑上来,我们使用 git clone [url] 就可以把远程仓库中的代码直接拿下来。这个 url 可以传入 HTTPS 或者 SSH 的链接,这一点在仓库中可以看到

对于 HTTPS,每次上传操作都需要进行用户名和密码的验证,而 SSH 则不需要,更加方便,但是需要进行一些配置。
我们使用 ssh-keygen -t rsa -C "email" 来创建 SSHkey,当然创建 SSHkey 的时候可能会有一些类似于密码配置,我们直接回车不配置也没问题。
在指定位置就会生成两个东西,一个是私钥一个是公钥(以 pub 结尾的是公钥),我们把公钥配置到我们的 gitee 账号中,此时我本地的这个 git 账号就和我 GITEE 上的账号绑定完成了,我们可以通过 ssh -T git@gitee.com 来测试。
当我们创建好一个远程仓库,并且配置好 SSH 之后,我们就和我们的远程仓库建立了连接,也就有权将我们的本地仓库提交到远程仓库了。
实际上,这里的操作和我们前面的本地操作是一样的,不管是添加到暂存区还是提交到仓库,当然这里使用 git commit -m 提交到的依然是本地仓库,我们还需要把本地仓库中的内容放到远程仓库,使用 git push [remote] [branch] 指令,这里的 branch 就是分支,remote 默认实际上输入 origin 即可。即 git push origin master。
注意,我们不能跨分支推,也就是说我们当前分支是谁,推送到远端时就是谁
由于我们使用的远程分支,所以在分支合并的时候,需要使用 git pull [remote] [branch],相当于就是本地的 git merge [branch]。