7.Git分支-分支简介、分支创建、分支切换
1.分支简介
几乎所有的版本控制系统都支持某种形式的分支。使用分支意味着可以把你的工作从开发主线上分离开来,以免影响开发主线。Git的分支是其必杀技,它相对于其它版本控制系统来说,具有难以置信的轻量性,创建分支以及切换分支几乎都是瞬间完成。Git鼓励频繁的使用与合并分支。
Git保存的不是文件的变化或者差异,而是一系列不同时刻的文件快照。
在进行commit操作的时候,Git会保存一个提交对象(commit object),该对象包含一个指向暂存内容快照的指针,包含指向父commit对象的指针,以及提交者的名字,提交信息等。首次提交的对象没有父对象,普通提交操作产生的提交对象只有一个父对象,合并操作产生的提交对象有多个父对象。
暂存操作(git add)会计算每一个文件的校验和(也就是一个hash值,Git使用的hash算法是SHA-1),然后将当前版本的文件快照保存在Git仓库中(Git使用blob对象来保存它们),最终将校验和加入到暂存区域等待提交。
当执行git commit操作的时候,Git会计算每一个目录的校验和,然后在Git仓库中将这些校验和保存为树对象。git commit创建的提交对象包含指向树对象(项目根目录对应的树对象)的指针。

如上图所示,一个项目有一个根目录,其对应的tree对象的校验和是y46r5,根目录下面有三个子目录,对应的树对象的校验和分别为t5re4、h65er、hn63u,每个目录下面有一些文件,Git将其保存为blob对象,每个文件对应于一个blob对象,同时也知道每个文件的校验和。这样一来,Git就能够保存项目的树状结构,每一个时刻都有其不同的树状结构,就能够在需要的时候恢复到某一个对应的状态。
如下图,Git的提交对象包含指向内容快照的指针(hash值)以及指向父提交节点的指针(hash值), 每个快照对应于上图中所有的tree对象和blob对象组成的部分。

对于commit对象、tree对象、blob对象包含的详细内容,可以参考下图。 每个commit对象包含所指向的tree对象的hash值,每个tree对象包含所指向的blob对象的hash值。

Git分支的本质实际上只是一个指向提交(commit)对象的可变指针。Git默认分支的名字是master,几乎所有的仓库都有一个master分支,这是由于git init自动创建它,并且大多数人都懒得去修改它。
2.分支创建
分支的创建本质上只是创建了一个指向提交(commit)对象的指针。
使用 git branch <branch name> 创建一个分支。这条命令将创建一个指向当前提交对象的分支。
注意:这条命令不会自动切换到新的分支上去。
那么,Git又是如何知道当前在哪个分支上的呢?Git有一个名为HEAD的指针,它指向当前所在的本地分支(可以将其看作是当前分支的别名)。
如下图,创建一个testing分支,此时master和testing同时指向校验和以f30ab开头的提交对象,但是HEAD还是指向master,并没有指向testing(因为git branch不会自动切换分支)。

可以使用 git log --decorate 命令查看各个分支当前所指的对象。
3.分支切换
使用 git checkout <branch-name> 切换分支,其本质上是将HEAD指针指向branch-name指向的分支。例如 git checkout testing 会产生如下图所示结果:HEAD指向了testing分支。

这时候,在提交(commit)一次,会得到如下图所示的结果:master分支没有向前移动,HEAD所指向的testing分支向前移动了。也就是说当我们执行git commit操作的时候,HEAD指向的分支随着提交操作自动向前移动。

如果执行git checkout master,这时候Git会做两件事情:1.将HEAD指针指向master;2.将工作区的内容恢复成master所指向的快照内容(也就是master所指向的commit对象所指向的文件快照)。
注意:分支切换会改变你本地的工作区域的内容。会将本地工作区域的内容恢复到被切换到的分支上最后一个提交时候的样子。
分支的本质实际上仅是包含所指提交对象的校验和的文件(文件中存储的是所指提交对象的校验和,长度为40的hash字符串)。创建一个分支相当于给文件中写入一个hash字符串,所以创建Git分支相当的高效。
其它的版本控制系统,在创建分支的时候,会将所有的项目文件都复制一遍,并保存到特定的目录。这会导致其它的版本控制系统的效率非常低效。
7.Git分支-分支简介、分支创建、分支切换的更多相关文章
- 分享如何将git项目导入GitHub(附创建分支)
前言:我们应该很多都会有自己的私有项目,大多情况都是存放在自己的硬盘中,今天我分享一下怎么讲自己的私有项目更新到GitHub上,这样再也不用担心项目丢失了. 一:下载git 下载链接git链接,根据自 ...
- [原创]gerrit上分支操作记录(创建分支、删除分支)
Git分支对于一个项目的代码管理而言,是十分重要的! 许多久用git的朋友可能已经掌握的很牢固了,但对于一些初涉git的童鞋来说,可能还不是很熟悉. 在此,我将自己的一些操作经历做一梳理,希望能帮助到 ...
- Gerrit上分支操作记录(创建分支、删除分支)
Git分支对于一个项目的代码管理而言,是十分重要的!许多久用git的朋友可能已经掌握的很牢固了,但对于一些初涉git的童鞋来说,可能还不是很熟悉.在此,我将自己的一些操作经历做一梳理,希望能帮助到有用 ...
- git 本地给远程仓库创建分支 三步法
命令如下: 1:本地创建分支dev Peg@PEG-PC /D/home/myself/Symfony (master) $ git branch dev 2:下面是把本地分支提交到远程仓库 Peg@ ...
- 1. git 本地给远程仓库创建分支 三步法
命令如下: 1:本地创建分支dev 1 2 Peg@PEG-PC /D/home/myself/Symfony (master) $ git branch dev 2:下面是把本地分支提交到远程仓库 ...
- git与eclipse集成之创建及切换个人本地分支
创建个人本地特性分支,并进行编码 弹出选择分支的窗口,选择要切换的个人特性分支(备注:根据远程个人特性分支创建本地个人特性分支) 点击OK,Branch name:分支名称与远程分支名称相同,不需要修 ...
- SourceTree 如何下载git 管理的代码-如何创建分支,删除分支,提交代码,回退代码
把用户给的链接拿过来,然后输入浏览器,然后在左侧会有Actions 中有个Clone;点击Clone之后,有个 Clone in Source Tree 点击,打开你的本地Source Tree,然后 ...
- git从指定的commit创建分支
How do I create a new git branch from an old commit? git checkout -b justin a9c146a09505837ec03b Thi ...
- git 创建分支并切换
git checkout -b fix/base //创建分支 git branch -av 查看所有分支 git checkout master //切换分支
- 如何使用git创建项目,创建分支
git config -global user.name "Your name" git config -global user.email "you@example.c ...
随机推荐
- Javascript数据结构与算法--队列(顺序队列、优先队列、循环队列)的实现与用法
前言 队列和栈非常类似,前面已经讲过了栈的实现与用法,现在我们来说说队列. 队列介绍 队列遵循FIFO(First In First Out,先进先出)原则的一组有序的项. 队列是一种特殊的线性表,特 ...
- 小程序app.onLaunch中获取用户信息,index.onLoad初次载入时取不到值的问题
问题描述: //app.js App({ globalData:{ nickname:'' }, onLaunch: function () { let that=this; //假设已经授权成功 w ...
- 【QT】QApplication简介
1.QApplication QApplication类管理GUI程序的控制流和主要设置,是基于QWidget的,为此特化了QGuiApplication的一些功能,处理QWidget特有的初始化和结 ...
- 安装es6编译babel
1.它的安装命令如下. 全局安装 :$ npm install --global babel-cli项目下安装: $ npm install -g babel-cli --save-dev 2.配置. ...
- BZOJ.4145.[AMPPZ2014]The Prices(状压DP)
BZOJ 比较裸的状压DP. 刚开始写麻烦惹... \(f[i][s]\)表示考虑了前\(i\)家商店,所买物品状态为\(s\)的最小花费. 可以写求一遍一定去\(i\)商店的\(f[i]\)(\(f ...
- Numpy 基础运算2
# -*- encoding:utf-8 -*- # Copyright (c) 2015 Shiye Inc. # All rights reserved. # # Author: ldq < ...
- (转)CentOS7中防火墙的基本操作
目录 1.firewalld简介 2.安装firewalld 3.运行.停止.禁用firewalld 4.配置firewalld 5 打开端口 学习apache安装的时候需要打开80端口,由于cent ...
- 将JSON格式数据转换为javascript对象 JSON.parse()
<html><body><h2>通过 JSON 字符串来创建对象</h3><p>First Name: <span id=" ...
- Rest API 操作List Items
获取所有的List Itemsfunction getItems(url) { $.ajax({ url: url, type: "GET", headers: { "a ...
- VS2017 生成事件去除未修改项目
1.右键“解决方案”→“配置管理器” 2.列“生成”,反勾选无需编译的项目 3.点击“确定”,重新编译即可跳过未勾选的项目.