Git 分支简介
简介
Git分支是在版本控制过程中重要的概念。一般来讲,我们在开发代码时,存在仓库中的有主要的稳定的版本,这个是主线。还有需要开发一些新功能的版本,为了不影响主线的内容, 可以开一个支线。这个支线就是Git中的分支。
Git 的默认分支名字是 master。 在多次提交操作之后,你其实已经有一个指向最后那个提交对象的 master 分支。 master 分支会在每次提交时自动向前移动。 Git 的分支,其实本质上仅仅是指向提交对象的可变指针。
为了形象的说明分支过程, 我们假设现在有一个工作目录,里面包含了三个将要被暂存和提交的文件。Git 仓库中有五个对象:三个 blob 对象(保存着文件快照)、一个 树(tree) 对象 (记录着目录结构和 blob 对象索引)以及一个 提交(commit) 对象(包含着指向前述树对象的指针和所有提交信息)。如下图1所示:
假设你发现代码或者工作目录下的文件还有需要修改的,我们对工作目录下的文件,做些修改后再次提交,那么这次产生的提交对象会包含一个指向上次提交对象(父对象)的指针。 也就是说,每次提交都会创建一个指针,这个指针的结构如1所示。提交的过程连起来的线如图2所示.
设想一下我们需要实现这样的功能:如果我们想把一次修改作为尝试,不准备放到主线上去。因为我们不知道这此修改对于后续是否需要。所以就需要支线,在支线下操作。如果是我们需要的,那就合并到 主线里面去,如果是我们不需要的也许就不合并到主线里面,或者把支线留着后续修改。或者把这条支线删掉。也不会影响主线仓库中的内容。
要实现这样的功能,Git就给我们提供了分支这一功能,就如图三中的V1.0所示。HEAD所指的就是主线。
分支创建
Git 是怎么创建新分支的呢? 很简单,它只是为你创建了一个可以移动的新的指针。 比如,创建一个 testing 分支, 你需要使用 git branch 命令:
$ git branch testing
如下图所示,这会在当前所在的提交对象上创建一个指针。
Git 又是怎么知道当前在哪一个分支上呢? 也很简单,它有一个名为 HEAD 的特殊指针。
因为 git branch 命令仅仅 创建 一个新分支,并不会自动切换到新分支中去。
在git中运行
$ git branch
会列出所有的branch,同时现在HEAD指向的branch前面一般会带*号。如下图所示
切换分支
切换分支的指令如下:
$ git checkout testing
如下图所示,切换分支会让Git的HEAD发生改变。
接下来我们就可以在这个分支戏曲,做想要的修改不影响master分支。这样就实现了一开始提到的功能。
项目分叉
那么,这样的实现方式会给我们带来什么好处呢? 现在不妨再提交一次:
$ vim test.txt # 假设我们修改其中的一个文件test.txt
$ git commit -a -m 'made a change'
如果我们在分支上做了一些修改,需要提交。提交之后就是在支线前进了一个节点。如下图所示
如图所示,你的 testing 分支向前移动了,但是 master 分支却没有,它仍然指向运行 git checkout 时所指的对象。 这就有意思了,现在我们切换回 master 分支看看:
$ git checkout master
如下图所示
master主线是没有移动的,如果我们再切换回master主线,那么master是没有移动的。 也就是说,你现在做修改的话,项目将始于一个较旧的版本。 本质上来讲,这就是忽略 testing 分支所做的修改,以便于向另一个方向进行开发。
我们不妨再稍微做些修改并提交:
$ vim test.rb
$ git commit -a -m 'made other changes'
现在,这个项目的提交历史已经产生了分叉(参见 项目分叉历史)。 因为刚才你创建了一个新分支,并切换过去进行了一些工作,随后又切换回 master 分支进行了另外一些工作。如下图所示:
这对我们的版本管理就非常的方便,条理也清晰。
文档信息
- 本文作者:Kilin
- 本文链接:https://star-twinking.github.io/2021/08/12/Git-%E5%88%86%E6%94%AF/
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)