Git的“master”分支并不是一个特殊分支。它就跟其它分支完全没有区别。之所以几乎每一个仓库都有 master 分支,是因为git init命令默认创建它,并且大多数人都懒得去改动它。
6.2 创建分支使用git branch命令可以很简单地创建分支,比如创建一个testing分支。
$ git branch testing这会在当前所在的提交对象上创建一个指针。如下图所示
那么,Git又是怎么知道当前在哪一个分支上呢?很简单,它有一个名为HEAD的特殊指针。这个特殊指针就是用来指定当前所在的分支。
可以使用git log命令查看各个分支当前所指的对象。 $ git log --oneline --decorate -3 #只看倒数3个 ebc9b45 (HEAD -> master, testing) add print(2) into README 326dd0b add print(1) into README b861d60 branch note begin
可以看到testing,master和现在指向master的HEAD都指向最后的提交。
6.3 切换分支创建好了分支,可以用git checkout命令进行切换
$ git checkout testing Switched to branch 'testing' $ git branch #可以使用git branch查看当前分支(前面带*号) master * testing有一个简单的命令可以快速创建新的分支并切换到新的分支:
$ git checkout -b new_branch #等效于 $ git branch new_branch $ git checkout new_branch于是HEAD指针也发生了变化,如下图
在testing分支进行一次提交: $ echo "print("3")" >> README $ git commit -am "add print("3") into README" warning: LF will be replaced by CRLF in README. The file will have its original line endings in your working directory. [testing 8b6bbb7] add print(3) into README 1 file changed, 1 insertion(+)
git的提交记录以及分支指向如下:
可以看到testing和HEAD都移动到前面了,而master没有移动。现在我们切换到master分支,对master进行一次提交。 $ echo "MIT LICENSE" >> LICENSE $ git commit -am "add MIT LICENSE" warning: LF will be replaced by CRLF in LICENSE. The file will have its original line endings in your working directory. [master ce53a90] add MIT LICENSE 1 file changed, 1 insertion(+)
提交后,上图就变成了下图
可以使用git log命令查看提交历史 $ git log --oneline --decorate --graph --all -5 #只看倒数五个 * ce53a90 (HEAD -> master) add MIT LICENSE | * 8b6bbb7 (testing) add print(3) into README |/ * ebc9b45 add print(2) into README * 326dd0b add print(1) into README * b861d60 branch note begin
可以看到图中的看到结构与上图相同。
由于Git的分支实质上仅是包含所指对象校验和(长度为40的SHA-1值字符串)的文件,所以它的创建和销毁都异常高效,也就是添加或者删除41个字节的速度,能做到这一点的原因是因为git是以文件快照的形式保存文件,所以创建分支只需创建一个新的指针指向快照即可,而其他的一些版本管理软件往往需要将整个项目复制到另一个目录,这就比较慢了。
学了上面的东西,可能会想,为什么要使用分支?可以通过现实场景的问题来回答这个问题。
从个人角度,你正在开发一个网站,网站已经处于正常运行状态,我们想在网站中加入新的功能,这时候你有两种选择:一是直接在当前master上进行修改和测试,二是创建一个分支。选择一可能会产生影响正常工作的代码,这是我们不想看到的。而选择二创建分支可以很方便地解决这个问题,分支不会影响当前工作的分支,可以很放心地进行开发和测试,最后对原工作分支进行合并即可。
从多人协作角度上看,这个更加直接,在一条流水线上不仅效率低,而且会产生很多混乱,比如不同人代码水平有限,有的还会编写错误的代码,使用分支可以让软件维护者很方便地查看不同的分支情况,选择合适地分支进行合并。