点击关注异步图书,置顶公众号git
天天与你分享 IT好书 技术干货 职场知识程序员
参与文末话题讨论,每日赠送异步图书。web
——异步小编算法
Git的背后有着一个很是精彩的成功故事。2005年4月,Linus Torvalds因不满当时任何一个可用的开源版本控制系统,就亲自着手实现了Git。shell
时至今日,若是咱们在Google中搜索“git version control”这几个关键词,都会看到数以百万计的返回结果。Git已经俨然成为了新型开源项目的一个标准。许多大型的开源项目都已经或正在计划迁移到Git上来。Git算不算程序员的必备技能?答案是确定的。编程
站在巨人的肩膀上,咱们要特别感谢Linus Torvalds、Junio C. Hamano以及Git项目的众多提交者,是他们给开发者社区带来了这个奇妙的工具。安全
Git很是灵活。可为多种不一样的角色所用,从偶尔须要版本化少许shell脚本的单一系统管理员,到Linux内核项目中的上百个开发人员,一切皆有可能。固然,这种灵活性不是没有代价的。在开始用Git来开展工做以前,你还必需要作一组决定。例如如下几种。服务器
Git中当然已是分布式版本库。但你是真的打算只在本地工做,仍是更愿意创建一个中央版本库?网络
Git支持push和pull两种数据传输类型,但咱们须要同时使用它们吗?若是让你选,你会选哪个?为何不是另外一个?数据结构
分支与合并是Git中两个强大的功能。可是,咱们应该开多少个分支呢?是根据每一个软件功能来开?仍是针对每一个发行版来开?仍是只该有一个分支?
为了便于入门,下面咱们来总结一下工做流及其做用。
一些工做流可能并非目标问题惟一正确的解决方案,但它们是一个很好的起点,咱们能够从中为本身的项目开发出高效的工做流。
咱们之因此会重点介绍商业项目中敏捷开发团队的工做,是由于咱们相信目前许多专业开发者(包括做者)都处于这样的工做环境中。固然,这里并不包括那些具备特殊要求的大型项目,由于这些项目一般有着很夸张的工做流,并且咱们相信这些也不是大多数开发者会感兴趣的项目。另外,这里也不包括那些开源项目的开发,虽然这些项目也能够用Git规划出一个颇有意思的工做流。
在具体探讨分布式版本控制的概念以前,让咱们先来快速回顾一下传统的集中式版本控制架构。
图1.1中所显示的就是一个集中式版本控制系统(例如CVS或Subversion)的典型布局。每一个开发者都在他或她本身的计算机上有一个包含全部项目文件的工做目录(即工做区)。当该开发者在本地作了修改以后,他或她就会按期将修改提交给某台中央服务器。而后,开发者在执行更新操做的同时也会从该服务器上捡取出其余开发者所作的修改。这台中央服务器上存储着这些文件(即版本库)的当前版本和历史版本。所以,这些被并行开发的分支,以及各类被命名(标记)的版本都将会被集中管理。
图1.1 集中式版本控制
而在分布式版本控制系统(见图1.2)中,开发者环境与服务器环境之间是没有分隔的。每个开发者都同时拥有一个用于当前文件操做的工做区与一个用于存储该项目全部版本、分支以及标签的本地版本库(咱们称其为一份克隆)。每一个开发者的修改都会被载入成一次次的新版本提交(commit), 首先提交到其本地版本库中。而后,其余开发者就会当即看到新的版本。经过推送(push)和拉回(pull)命令,咱们能够将这些修改从一个版本库传送到另外一个版本库中。这样一来,从技术上来看,这里全部的版本库在分布式架构上的地位是同等的。所以从理论上来说,咱们再也不须要借助服务器,就能够将某一台开发工做机上所作的全部修改直接传送给另外一开发工做机。固然在具体实践中,Git中的服务器版本库也扮演了重要的角色,例如如下这些特型版本库。
图1.2 分布式版本控制
下面,咱们再来看看分布式系统相对于集中式的优势有哪些。
其实,版本库本质上就是一个高效的数据存储结构而已,由如下部分组成。
文件(即blob):这里既包含了文本也包含了二进制数据,这些数据将不以文件名的形式被保存。
目录(即Tree):目录中保存的是与文件名相关联的内容,其中也会包含其余目录。
版本(即commit):每个版本所定义的都是相应目录的某个可恢复的状态。每当咱们建立一个新的版本时,其做者、时间、注释以及其以前的版本都将会被保存下来。
对于全部的数据,它们都会被计算成一个十六进制散列值(例如像1632acb65b01 c6b621d6e1105205773931bb1a41这样的值)。这个散列值将会被用做相关对象的引用,以及往后恢复数据时所需的键值(见图1.3)。
图1.3 版本库中的对象存储
也就是说,一个提交对象的散列值实际上就是它的“版本号”,若是咱们持有某一提交的散列值,就能够用它来检查对应版本是否存在于某一版本库中。若是存在,咱们就能够将其恢复到当前工做区相应的目录中。若是该版本不存在,咱们也能够从其余版本库中单独导入(拉回)该提交所引用的所有对象。
接下来,咱们来看看采用这种散列值和这种既定的版本库结构究竟有哪些优点。
对于大多数版本控制系统来讲,分支的建立与合并一般会因其特殊性而被认为是高级拓展操做。但因为Git最初就是为了方便那些散落在世界各地的Linux内核开发者而建立的,合并多方努力的结果一直都是其面临的最大挑战之一,因此Git的设计目标之一就是要让分支的建立与合并操做变得尽量地简单且安全。
在下面的图1.4中,咱们向你展现了开发者是如何经过建立分支的方式来进行并行开发的。图中的每个点都表明了该项目的一个版本(即commit)。而因为在Git中,咱们只能对整个项目进行版本化,因此每一个点同时也表明了属于同一版本的各个文件。
图1.4 因开发者的并行开发而出现的分支建立操做
如上所示,图中两位开发者的起点是同一个版本。以后两人各自作了修改,并提交了修改。这时候,对于这两位开发者各自的版本库来讲,该项目已经有了两个不一样的版本。也就是说,他们在这里建立了两个分支。接下来,若是其中一个开发者想要导入另外一我的的修改,他/她就能够用Git来进行版本合并。若是合并成功了,Git就会建立一个合并提交,其中会包含两位开发者所作的修改。这时若是另外一位开发者也取回了这一提交,两位开发者的项目就又回到了同一个版本。
在上面的例子中,分支的建立是非计划性的,其缘由仅仅是两个开发者在并行开发同一个软件罢了。在Git中,咱们固然也能够开启有针对性的分支,即显式地建立一个分支(见图1.5)。显式分支一般主要用于协调某一种功能性的并行开发。
图1.5 针对不一样任务的显式分支
版本库在执行拉回和推送操做时,能够具体指定其针对的是哪一些分支。固然,除了这些简单的分支建立和合并处理外,咱们也能够对分支执行如下动做。
另外,若是你是一个繁忙的项目管理者,还在犹豫不决是否要采用Git
Jakub Narębski 著
点击封面购买纸书
本书面向全部的Git用户,全面细致地向读者介绍有关Git的各项实用技巧,充分发掘它的潜力,更好地实现项目版本管理。学习本书,能够帮助读者更好地运用Git,提高软件开发效率。
本书做者Jakub Narębski自Git诞生之初就参与了Git的开发工做。他是gitweb子系统(Git原始Web界面)的主要贡献者之一,是非官方的gitweb维护者。
【德】René Preißel(普莱贝尔), Bjørn Stachmann(斯拉赫曼) 著
点击封面购买纸书
Git 是当今最流行的版本控制系统。本书并不偏重理论介绍,也不面面俱到,而是一本学习Git的实用指南。本书首先介绍了Git 的基础知识,而后关注于敏捷开发,并给出工做流展现了解决现实问题所需的命令和选项。
【美】Jon Loeliger , Matthew McCullough 著
点击封面购买纸书
市面上绝无仅有的Git图书 全面剖析Git的用法 同时涵盖GitHub
本书可让读者迅速上手Git,用它来跟踪、分支、合并和管理代码变动。本书经过一系列步骤式教程,引导读者迅速掌握从Git基础知识到高级使用技巧在内的全部知识,并提供友好而严谨的建议,以帮助读者熟悉Git的许多功能。
本书在上一版的基础之上进行了全面更新,包含了操做树的技巧,全面覆盖了reflog和stash的用法,还全面介绍了GitHub仓库。一旦你掌握了Git系统的灵活性以后,你能够以近乎无限的各类方式来管理代码开发,而本书则会告诉你怎么来作。
你用过Git吗?截止时间4月29日17时,留言+转发本活动到朋友圈,小编将抽奖选出5名读者 赠送e读版100元异步社区代金券一张,(留言点赞最多的自动得到一张)。
推荐阅读
长按二维码,能够关注咱们哟
天天与你分享IT好文。
在“
点击阅读原文,直接购买《Git高手指南》