Git 分支简介

2021/08/12 Git 学习记录 共 1613 字,约 5 分钟

Git 分支简介

  1. Git 分支简介
    1. 简介
    2. 分支创建
    3. 切换分支
    4. 项目分叉

简介

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发生改变。

head-to-testing

接下来我们就可以在这个分支戏曲,做想要的修改不影响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 分支进行了另外一些工作。如下图所示:

这对我们的版本管理就非常的方便,条理也清晰。

文档信息

Search

    Table of Contents