Why

熟练使用 Git **分支(branch)**操作是 Git 必备技能之一,尤其是多人合作的项目,分支的管理和操作尤为重要。

为什么需要分支 ?假设在已有项目的基础上开发了功能 1(feature/1),且已经完成了一半;但是线上发现了 Bug(hotfix/1) 或是产品经理临时需要加个小功能2(feature/2),如何能在不加入 Func_1 的代码上进行开发呢?Git 的分支为我们提供了解决方案,做法可参考如下:

从线上代码拉取分支 feature/1,开始功能1的开发;

从线上代码拉取分支 hotfix/1,开始 Fix;

从线上代码拉取分支feature/2,开始功能2的开发 …

可看出,分支是各自独立的,当然也就可以交予多人完成,并且 Git 对分支数量没有限制。

Git 鼓励多次使用分支完成某个任务,合并后再删掉分支的做法。

如果还是不明白分支的意义,可参考阅读以下,摘自 廖雪峰-Git 教程-分支管理

分支就是科幻电影里面的平行宇宙,当你正在电脑前努力学习Git的时候,另一个你正在另一个平行宇宙里努力学习SVN。

如果两个平行宇宙互不干扰,那对现在的你也没啥影响。不过,在某个时间点,两个平行宇宙合并了,结果,你既学会了Git又学会了SVN。

分支在实际中有什么用呢?假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。

现在有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。

其他版本控制系统如SVN等都有分支管理,但是用过之后你会发现,这些版本控制系统创建和切换分支比蜗牛还慢,简直让人无法忍受,结果分支功能成了摆设,大家都不去用。

但Git的分支是与众不同的,无论创建、切换和删除分支,Git在1秒钟之内就能完成!无论你的版本库是1个文件还是1万个文件。

What

在介绍 Git 分支操作之前,可先了解几个概念:

master 分支: 即主分支,初始化 GIt 仓库时会自动创建主分支。通常用于部署生产环境,需保证其稳定性。

完成支线分支上的开发后,我们还需要做什么?这里就提出了另一个概念,即 合并(merge) ,简单理解就是把分支的代码加入到已有分支中,但其中可能会产生 冲突(conflict),冲突需要手动解决后再提交。

另外,同仓库一样,分支也存在 本地分支远程分支 的概念,简单理解就是本地分支仅自己可见,远程分支可被 拉取(pull)克隆(clone),我们需要 **推送(push)**至远程分支,才被别人可见。

How

有关 Git 分支管理的文档可参考:官方文档

查看分支

$ git branch     # 查看所有本地分支
$ git branch -a  # 查看所有分支(本地 + 远程)
$ git branch -r  # 查看所有远程分支

当前分支前面会标一个 *

创建 & 切换分支

$ git branch <newbranch>        # 新建分支,并留在当前分支
$ git checkout <oldbranch>      # 切换分支(分支需存在)
$ git checkout -b <newbranch>   # 新建分支,并切换到新分支
$ git fetch origin <branchname>:<branchname>  # 从远程分支拉取至本地

新的 swtich 命令,参考如下(摘自 廖雪峰——Git 教程 ,本人未曾尝试)

我们注意到切换分支使用git checkout <branch>,而前面讲过的撤销修改则是git checkout -- <file>,同一个命令,有两种作用,确实有点令人迷惑。

实际上,切换分支这个动作,用switch更科学。因此,最新版本的Git提供了新的git switch命令来切换分支:

创建并切换到新的dev分支,可以使用:

$ git switch -c dev

直接切换到已有的master分支,可以使用:

$ git switch master

使用新的git switch命令,比git checkout要更容易理解。

注意:创建本地分支后,如需 push 至远程,需建立与远程上游的跟踪,命令参考如下:

$ git push --set-upstream origin <branchname> 	# 推送当前分支并建立与远程上游的跟踪

合并分支

$ git merge <branchname>	# 合并某分支到当前分支

合并分支可能产生冲突,此项不在本文讨论范围,可参考:廖雪峰 Git 教程——解决冲突

删除分支

$ git branch -d <branchname>    # 删除本地分支(需切出)
$ git push origin --delete <branchname>  # 删除远程分支

Summary

总结常用分支操作命令如下:

$ git branch -a            # 查看所有分支(本地 + 远程)
$ git branch <newbranch>   # 新建分支,并留在当前分支
$ git checkout <oldbranch> # 切换分支(分支需存在)
$ git fetch origin <branchname>:<branchname>  # 从远程分支拉取至本地
$ git push --set-upstream origin <branchname> # 推送当前分支并建立与远程上游的跟踪
$ git merge <branchname>   # 合并某分支到当前分支
$ git branch -d <branchname>            # 删除本地分支(需切出)
$ git push origin --delete <branchname> # 删除远程分支

P.S. 有关分支管理及提交的规范可参考 【转】您必须知道的 Git 分支开发规范