[git]分支

 
Git 的分支模型称为“必杀技特性”,而正是因为它,将 Git 从版本控制系统家族里区分出来。
Git 有何特别之处呢?Git 的分支可谓是难以置信的轻量级,它的新建操作几乎可以在瞬间完成,并且在不同分支间切换起来也差不多一样快。
和许多其他版本控制系统不同,Git 鼓励在工作流程中频繁使用分支与合并,哪怕一天之内进行许多次都没有关系。
理解分支的概念并熟练运用后,你才会意识到为什么 Git 是一个如此强大而独特的工具,并从此真正改变你的开发方式。
 
Question1 :Git 是如何储存数据的?
Git 保存的不是文件差异或者变化量,而只是一系列文件快照。
Git 中的分支,其实本质上仅仅是个指向 commit 对象的可变指针。Git会使用 master 作为分支的默认名字。
在若干次提交后,你其实已经有了一个指向最后一次提交对象的 master 分支,它在每次提交的时候都会自动向前移动。
 
Question2 :Git 又是如何创建一个新的分支的呢?
##创建一个新的分支指针。
$ git branch testing
 
Question3 :Git 是如何知道你当前在哪个分支上工作的呢?

它保存着一个名为 HEAD 的特别指针。请注意它和你熟知的许多其他版本控制系统里的 HEAD 概念大不相同。在 Git 中,它是一个指向你正在工作中的本地分支的
指针。运行 git branch 命令,仅仅是建立了一个新的分支,但不会自动切换到这个分支中去,所以在这个例子中,我们依然还在 master 分支里工作(参考图 3.5)。

 
要切换到其他分支,可以执行 git checkout 命令
 
$ git checkout testing
这时操作的文件就是testing branch里面的啦,可以在随意在testing 与master里面随意切换,改来改去。
然后你的结构就会分2个支:这叫分支简直太贴切啦:
 
 
由于 Git 中的分支实际上仅是一个包含所指对象校验和(40 个字符长度 SHA-1 字串)的文件,
所以创建和销毁一个分支就变得非常廉价。说白了,新建一个分支就是向一个文件写入 41 个字节(外加一个换行符)那么简单,当然也就很快了。
 
接下来看看,我们为什么应该频繁使用分支?
 
实际工作中大体也会用到这样的工作流程:
. 开发某个网站。
. 为实现某个新的需求,创建一个分支。
. 在这个分支上开展工作。
假设此时,你突然接到一个电话说有个很严重的问题需要紧急修补,那么可以按照下面的方式处理:
. 返回到原先已经发布到生产服务器上的分支。
. 为这次紧急修补建立一个新分支。
. 测试通过后,将此修补分支合并,再推送到生产服务器上。
. 切换到之前实现新需求的分支,继续工作。
中心思想就是:你可以随意在branchs上切换,所以一个branch就干一件事(修复一个bug)
各个branch之间独立开,互不影响,这样就会是非常清晰的workflow啦.
 
PS:每个新的branch都是出自当前指针指向的
 
$ git checkout -b iss53
Switched to a new branch "iss53"
##相当于:
$ git branch iss53
$ git checkout iss53
测试确定bug修复后,把它合并到 master 分支并发布到生产服务

器。用 git merge 命令来进行合并:

$ git checkout master
$ git merge hotfix
合并后的hotfix没有用了,使用
$ git branch -d hotfix
Deleted branch hotfix (3a0874c).
 
如果合并发生了冲突:
$ git merge iss53
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.

Git 作了合并,但没有提交,它会停下来等你解决冲突。要看看哪些文件在合并时发生冲突,可以用 git status 查阅

 
确认所有冲突都已解决,也就是进入了缓存区,就可以用 git commit 来完成这次合并提交。提交的记录差不多是这样:

Merge branch 'iss53'
Conflicts:
index.html
#
# It looks like you may be committing a MERGE.
# If this is not correct, please remove the file
# .git/MERGE_HEAD
# and try again.
#

如果想给将来看这次合并的人一些方便,可以修改该信息,提供更多合并细节。比如你都作了哪些改动,以及这么做的原因。

有时候裁决冲突的理由并不直接或明显,有必要略加注解。
 
分支管理:
 
查看branch状态
$git branch
issue53
*master
testing
注意看 master 分支前的 * 字符:它表示当前所在的分支。也就是说,如果现在提交更新,master 分支将随着开发进度前移。若要查看各个分支最后一次 commit 信息,运行
$ git branch -v:
要从该清单中筛选出你已经(或尚未)与当前分支合并的分支,可以用 --merge 和 --no-merged 选项(Git 1.5.6 以上版本)。比如 git branch -merge 查看哪些分支已被并入当前分支:
 
一般来说,列表中没有 * 的分支通常都可以用 git branch -d 来删掉。原因很简单,既然已经把它们所包含的工作整合到了其他分支,删掉也不会损失什么。
 
另外可以用 git branch --no-merged 查看尚未合并的工作:

$ git branch --no-merged
testing
我们会看到其余还未合并的分支。因为其中还包含未合并的工作,用 git branch -d 删
除该分支会导致失败:

$ git branch -d testing
error: The branch 'testing' is not an ancestor of your current HEAD.

不过,如果你坚信你要删除它,可以用大写的删除选项 -D 强制执行,例如

$ git branch -D testing

下一节:再来看基本的git 工作流程有哪几种,详细做法和优缺点 :)


 
太!可!爱!了!你挪动的时候居然还转头看了看旁边有没有空地么!!
 
 
 
 
 
 
 
 
 
 
 
 
 

[Git01]Pro Git 第三章 分支 读书笔记的更多相关文章

  1. 《TCP/IP详解卷1:协议》第1章 概述-读书笔记

    章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP ...

  2. 《Effective C++》第5章 实现-读书笔记

    章节回顾: <Effective C++>第1章 让自己习惯C++-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(1)-读书笔记 <Effecti ...

  3. Pro Git 第一章 起步 读书笔记

    Pro Git 笔记 第1章 起步 1.文件的三种状态. 已提交:文件已经保存在本地数据库中了.(commit) 已修改:修改了某个文件,但还没有提交保存.(vim) 已暂存:已经把已修改的文件放在下 ...

  4. 《C++Primer》第五版习题答案--第三章【学习笔记】

    [C++Primer]第五版[学习笔记]习题解答第三章 ps:答案是个人在学习过程中书写,可能存在错漏之处,仅作参考. 作者:cosefy Date: 2020/1/10 第三章:字符串,向量和数组 ...

  5. 转:Git 求生手册 - 第三章分支工作

    from:http://newbranch.cn/zhi-zuo-fen-zhi-lai-gong-zuo-git-gh-pages-branching/ 来自:片段 实战 说了这么一大堆分支的东西. ...

  6. Java核心技术卷一基础知识-第5章-继承-读书笔记

    第5章 继承 本章内容: * 类.超类和子类 * Object:所有类的超类 * 泛型数组列表 * 对象包装器和自动装箱 * 参数数量可变的方法 * 枚举类 * 反射 * 继承设计的技巧 利用继承,人 ...

  7. 《CSS3秘籍》(第三版)-读书笔记

    第3章 选择器:明确设置哪些样式 每个样式(或者规则)由两个主要部分组成:选择器是告诉浏览器要格式化什么内容:声明块则列出浏览器用来给选择器定义样式的格式化指令. 1.标签选择器:整体控制 标签选择器 ...

  8. unix network programming(3rd)Vol.1 [第2~5章]《读书笔记系列》

    13~22章 重要 第2章 传输层: TCP/ UDP / STCP (Stream Control Transmission Protocol) TCP 可靠,有重传机制,SYN队列号 UDP 不可 ...

  9. unix network programming(3rd)Vol.1 [第13~15章]《读书笔记系列》

    第13章 守护进程和inetd 超级服务器 syslog() daemon_init() setuid() setgid() 第14章 高级IO 标准I/O函数库,支持3种缓冲 缓冲(读写存储设备(硬 ...

随机推荐

  1. Controlling DNS prefetching

    Controlling DNS prefetching IN THIS ARTICLE Background Configuring prefetching in the browser Contro ...

  2. Gitlab 社区版安装部署和维护指南

    因为我的个人网站 restran.net 已经启用,博客园的内容已经不再更新.这篇文章是在 Gitlab 7.4 的环境下配置的,相关内容可能已经过时. 后续做了一次迁移,将 Gitlab 升级到了 ...

  3. mybatis 需要注意的点 MyBatis 插入空值时,需要指定JdbcType (201

    转自:https://blog.csdn.net/snakemoving/article/details/76052875 前天遇到一个问题 异常显示如下: 引用 Exception in threa ...

  4. delphi 实体类 JSON 数组

    delphi 实体类 与JSON转换,序列化 TJson REST.JSON.pas   TJson.JsonToObjectTJson.ObjectToJsonString JsonEncode O ...

  5. ATL控件签名之后页面还提示“在此页面上的Activex控件和本页上的其他部分及交互可能不安全”

    ATL控件正常签名打包,然后安装之后还是会提示: 没理由啊,签名是花钱搞得正当的签名.后来查了资料才知道这还不够,需要在创建ATL控件的时候继承一个IObjectSafetyImpl 类 知道了原因, ...

  6. (转 留存)Windows环境下的NodeJS+NPM+GIT+Bower安装配置步骤

    Windows环境下的NodeJS+NPM+GIT+Bower安装配置步骤 标签: NodeJSnpmbower 2015-07-17 16:38 3016人阅读 评论(0) 收藏 举报  分类: G ...

  7. U3D SCENEMANAGER.LOADSCENE是半异步的

    作地图加载优化时用到了SceneManager.LoadScene,发现它执行后立即执行了后面的语句,查文档才知道 它是 semi-asyncronize的,即半异步的. 说它是半异步,是因为,它本身 ...

  8. redis客户端执行命令没反应

    问题:redis-cli连接客户端后,执行命令没有反应   解决方法:通过指定一个开启守护进程的配置文件来启动服务,redis-server ../redis.conf 说明:redis.conf是我 ...

  9. js小例子之二级联动

    联动原理 当用户点击省级的下拉选项,选择所在省,下一个下拉选项里的选项,则变成用户选择省下的所有市的信息,不会出现其它省市的信息. 省市数据 把省市数据,保存在js文件中,以json形式保存,以便读取 ...

  10. 南京大学发布无序列限制的DNA编辑新工具(转自生物通)

    编辑推荐: 内切酶经过改造可以成为强大的DNA编辑工具,比如ZFN.TALEN.风头正劲的CRISPR–Cas系统和充满争议的NgAgo技术.不过这些技术都是通过序列识别来实现靶向切割的,会受到序列偏 ...