Git笔记(11) 分支简介

  • 1. Git 分支
  • 2. 简介
  • 3. 创建
  • 4. 查看当前分支
  • 5. 切换
  • 6. 分叉

1. Git 分支

使用分支可以把工作 从开发主线上分离 开来,以免影响开发主线
在很多版本控制系统中,依靠完全创建副本,但这是一个略微低效的过程

而 Git 处理分支的方式超级轻量
创建新分支可瞬间完成,并且在不同分支之间的切换操作也便捷

与许多其它版本控制系统不同
Git 鼓励在工作流程中频繁地使用分支与合并


2. 简介

介绍分支需要从 Git 是如何保存数据的开始说起
在 Git学习笔记(1) 版本控制 中提到 Git 保存的不是文件的变化或者差异
而是一系列不同时刻的 文件快照

在进行提交操作时,Git 会保存一个提交对象(commit object
可以很自然的想到——该 提交对象会包含一个指向暂存内容快照的指针

该提交对象还包含了作者的姓名和邮箱、提交时输入的信息以及指向它的父对象的指针
首次提交产生的提交对象没有父对象,普通提交操作产生的提交对象有一个父对象
而由多个分支合并产生的提交对象有多个父对象

为了更加形象地说明
假设现在有一个工作目录,里面包含了3个将要被暂存和提交的文件
暂存操作会为每一个文件计算校验和
然后会把当前版本的文件快照保存到 Git 仓库中(Git 使用 blob 对象来保存它们)
最终将校验和加入到暂存区域等待提交:

$ git add README test.rb LICENSE
$ git commit -m 'The initial commit of my project'

当使用 git commit 进行提交操作时
Git 会先计算每一个子目录(本例中只有项目根目录)的校验和
然后在 Git 仓库中这些校验和保存为 树对象

随后,Git 便会创建一个提交对象
它除了包含上面提到的那些信息外,还包含指向这个树对象(项目根目录)的指针
如此一来,Git 就可以在需要的时候重现此次保存的快照

现在,Git 仓库中有五个对象:

  • 一个提交对象(包含着指向前述树对象的指针和所有提交信息)
  • 一个树对象(记录着目录结构和 blob 对象索引)
  • 三个 blob 对象(保存着文件快照)

做些修改后再次提交
那么这次产生的提交对象会包含一个指向上次提交对象(父对象)的指针

Git 的分支,其实本质上仅仅是 指向提交对象的可变指针
即仅是包含所指对象校验和的文件
创建一个新分支就相当于往一个文件中写入 41 个字节(40 个字符和 1 个换行符)
所以它的创建和销毁都异常高效

Git 的默认分支名字是 master
在多次提交操作之后,其实已经有一个指向最后那个提交对象的 master 分支
它会在每次的提交操作中自动向前移动

master 分支不是一个特殊分支,只是因为默认创建,跟其它分支完全没有区别


3. 创建

创建分支很简单,它只是创建了一个可以移动的新的指针
比如,创建一个 testing 分支, 你需要使用 git branch 命令:

$ git branch testing

这会在当前所在的提交对象上创建一个指针


4. 查看当前分支

有一个名为 HEAD 的特殊指针,指向当前所在的本地分支
HEAD 想象为当前分支的别名

在上面的例中,创建 一个新分支,并不会自动切换到新分支中去

可以简单地使用 git log 命令查看:各个分支当前所指的对象
提供这一功能的参数是 --decorate

$ git log --oneline --decorate
f30ab (HEAD, master, testing) add feature #32 - ability to add new
34ac2 fixed bug #1328 - stack overflow under certain conditions
98ca9 initial commit of my project

当前 “master” 和 “testing” 分支均指向校验和以 f30ab 开头的提交对象


5. 切换

在 Git学习笔记(9) 打标签 中提及到使用 git checkout 命令查看某个标签所指向的文件版本
同时也提及到这个命令使仓库处于“分离头指针(detacthed HEAD)”状态
很明显,就是改变了 HEAD 特殊指针
那么利用 git checkout 切换到一个已存在的分支

例如,现在切换到新创建的 testing 分支去:

$ git checkout testing

这样 HEAD 就指向 testing 分支了

现在不妨进行修改文件,然后再提交一次:

$ vim test.rb
$ git commit -a -m 'made other changes'


testing 分支向前移动了
但是 master 分支却没有,它仍然指向运行 git checkout 时所指的对象

现在切换回 master 分支:

$ git checkout master

这条命令做了两件事:

  1. 使 HEAD 指回 master 分支
  2. 将工作目录恢复成 master 分支所指向的快照内容

现在做修改的话,项目将始于一个较旧的版本
本质上来讲,这就是忽略 testing 分支所做的修改,以便于向另一个方向进行开发


6. 分叉

不妨再稍微做些修改并提交:

$ vim test.rb
$ git commit -a -m 'made other changes'

现在,这个项目的提交历史已经产生了分叉

上述两次改动针对的是不同分支:
可以在不同分支间不断地来回切换和工作,并在时机成熟时将它们合并起来

运行 git log --oneline --decorate --graph --all 命令查看分叉历史
它会输出你的提交历史、各个分支的指向以及项目的分支分叉情况

$ git log --oneline --decorate --graph --all
* c2b9e (HEAD, master) made other changes
| * 87ab2 (testing) made a change
|/
* f30ab add feature #32 - ability to add new formats to the
* 34ac2 fixed bug #1328 - stack overflow under certain conditions
* 98ca9 initial commit of my project

参考: git
以上内容,均根据git官网介绍删减、添加和修改组成


相关推荐:

Git笔记(10) 别名
Git笔记(9) 打标签
Git笔记(8) 远程仓库的使用
Git笔记(7) 撤消操作
Git笔记(6) 查看提交历史


谢谢

Git笔记(11) 分支简介相关推荐

  1. Git 笔记——如何处理分支合并冲突

    1.前言 学习使用 Git 也有一段时间,但一直都是把 Git 当作一个代码仓库,使用的命令无非就是 clone, add, commit ,往往课程作业也没有过多人合作开发,没有体验过 Git 的分 ...

  2. ASP.NET学习笔记(11)--ASP简介

    一般来说,ASP包括5个对象:Request,Response,,Server,Session,Application.在html代码中,[%...%]表明这是ASP代码. 1,Request对象: ...

  3. Git笔记(14) 分支开发工作流

    Git笔记(14) 分支开发工作流 1. 长期分支 2. 特性分支 1. 长期分支 因为 Git 使用简单的三方合并 所以就算在一段较长的时间内,也可反复把一个分支合并入另一个分支 也就是说,在整个项 ...

  4. Git笔记(13) 分支管理

    Git笔记(13) 分支管理 1. 分支管理工具 2. 查看分支列表 3. 查看分支最后一次提交 3. 查看已合并分支列表 4. 查看未合并分支列表 1. 分支管理工具 在 Git学习笔记(12) 分 ...

  5. Git学习笔记:分支管理3

    前言 在补习python的时候主要参考的是廖雪峰的教程Python教程,在学习完后准备完成期末作业时,遇到了一个技术难题,需要初步掌握git,因此开始了git的学习. 本教程参考廖雪峰的Git教程 G ...

  6. Git学习笔记:分支管理(2)

    前言 在补习python的时候主要参考的是廖雪峰的教程Python教程,在学习完后准备完成期末作业时,遇到了一个技术难题,需要初步掌握git,因此开始了git的学习. 本教程参考廖雪峰的Git教程 G ...

  7. Git学习笔记:分支管理(1)

    前言 在补习python的时候主要参考的是廖雪峰的教程Python教程,在学习完后准备完成期末作业时,遇到了一个技术难题,需要初步掌握git,因此开始了git的学习. 本教程参考廖雪峰的Git教程 G ...

  8. Git 分支 - 分支简介

    几乎所有的版本控制系统都以某种形式支持分支.使用分支意味着你可以把你的工作从开发主线上分离开来,以免影响开发主线.在很多版本控制系统中,这是一个略微低效的过程--常常需要完全创建一个源代码目录的副本. ...

  9. Git超详细学习笔记 手把手带你一步一步操作 -- 详细分析git 对象-域-分支以及github使用

    Git 使用笔记 详细的说明文档: 请参考安装目录下的doc文档 D:\Program Files\Git\mingw64\share\doc\git-doc\git-stash.html git 版 ...

最新文章

  1. Linux修改文件权限为777
  2. DB2中导出数据库的所有DDL脚本
  3. 【基础算法】 GBDT/XGBoost 常见问题
  4. 牛客多校3 - Operation Love(几何+叉积确定三点顺逆)
  5. 为啥浏览器中的对象和w3c不一样??
  6. Protocol handler start failedCaused by: java.net.SocketException: Permission denied
  7. flask 模板 php,Flask 模板系统
  8. 公司行政的未来在哪里?要不要转行?
  9. 语言编程思维陈萌_这本书告诉你,计算机为何能读懂人类语言,编程思维让你更聪明...
  10. java代码输出我喜欢你_程序员七夕如何表白:朕只爱一个皇后!(单例模式)...
  11. react routers路由地址 F5刷新白屏
  12. 扒一扒最近很火的被马云强东联手封杀性感女黑帽
  13. python画卡通兔子_用Illustrator绘制一只可爱的卡通小兔子
  14. 重新定义物流快递如何实现跨行业连接
  15. Java工程师培训课(十七【新的领域】)
  16. Table '表名' doesn't exist
  17. 大话电脑(转自知乎Jeffersli)
  18. 基于希克斯需求价格弹性计算_西方经济学(微观部分)计算题
  19. Java 后端工程师 2018 书单推荐
  20. RK3399平台开发系列讲解(中断篇)13.13、中断下半部WorkQueue实现原理

热门文章

  1. ionic cordova 常用命令
  2. Redis源码阅读-Adlist双向链表
  3. 软链接文件和硬链接文件
  4. 动态链接库实现COM(COM技术内幕笔记之二)
  5. 面向对象的接口思想与函数式编程
  6. icon-font-generator 的使用
  7. jQuery中的选择器引擎Sizzle
  8. [开发笔记]-判断当前是否联网
  9. Batch Normailzation
  10. s:property=a value=/取的s:debug/s:debug中的value stack中的属性值