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 分支开发规范