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 ...
随机推荐
- 基于ASP.NET MVC 下的Extjs的Combbox加载速率问题,终于解决啦:)
在实际的开发项目中,自己遇到一个让自己苦恼很久的问题,一直也未解决,先简单介绍一下这个问题吧.当在表单里有多个combbox的时候(表单中的combbox是经过封装的控件,从后台请求同一个方法获取数据 ...
- git clean 删除忽略文件 和 未被跟踪文件及文件夹
git clean 删除忽略文件 和 未被跟踪文件及文件夹 概念 首先我们需要认清 忽略的文件 和 未被跟踪的文件 忽略的文件:.gitignore 中忽略的文件 未被跟踪的文件:没有被忽略,但是还没 ...
- 关于<服务器>定义
定义: 服务器,也称伺服器,是提供计算服务的设备.由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力. 服务器的构成:包括处理器.硬盘.内存.系统总线等,和 ...
- Hive的DDL操作
DDL:data definittion language 数据定义语言 主要是定义或改变表的结构.数据类型.表之间的链接和约束等初始化操作 DML:data manipulation languag ...
- 一、OpenStack环境准备及共享组件安装
一.OpenStack部署环境准备: 1.关闭防火墙所有虚拟机都要操作 # setenforce 0 # systemctl stop firewalld 2.域名解析所有虚拟机都要操作 # cat ...
- centos7上PhantomJS 过期之后改用Chrome时填的坑
突然有个自动化需求所以准备使用模拟点击的方法, 在使用之前的PhantomJS时,报错 UserWarning: Selenium support for PhantomJS has been dep ...
- Android中View的绘制流程(专题讲解)
Android中的UI视图有两种方式实现:.xml文件(实现代码和UI的分离)和代码实现. Android的UI框架基本概念: 1. Activity:基本的页面单元,Activity包含一个Wind ...
- hive求TopN语句
ROW_NUMBER,RANK(),DENSE_RANK() 先了解这三个之间的区别: Rank():1,2,2,4,5(一般用这个较多,不会影响总排名) Dense_rank():1,2,2,3,4 ...
- phantomjs api文档
phantomjs实现了一个无界面的webkit浏览器.虽然没有界面,但dom渲染.js运行.网络访问.canvas/svg绘制等功能都很完备,在页面抓取.页面输出.自动化测试等方面有广泛的应用. 详 ...
- LeetCode 字符串专题(一)
目录 LeetCode 字符串专题 <c++> \([5]\) Longest Palindromic Substring \([28]\) Implement strStr() [\(4 ...