Git算不算程序员的必备技能?

点击关注异步图书,置顶公众号git

天天与你分享 IT好书 技术干货 职场知识程序员

​​参与文末话题讨论,每日赠送异步图书。web

——异步小编算法

Git的背后有着一个很是精彩的成功故事。2005年4月,Linus Torvalds因不满当时任何一个可用的开源版本控制系统,就亲自着手实现了Gitshell

时至今日,若是咱们在Google中搜索“git version control”这几个关键词,都会看到数以百万计的返回结果。Git已经俨然成为了新型开源项目的一个标准。许多大型的开源项目都已经或正在计划迁移到Git上来。Git算不算程序员的必备技能?答案是确定编程

为何要用Git?

站在巨人的肩膀上,咱们要特别感谢Linus Torvalds、Junio C. Hamano以及Git项目的众多提交者,是他们给开发者社区带来了这个奇妙的工具。安全

  • Git容许咱们利用分支来开展工做:在一个由多个开发者并行协做的项目中,开发者各自会有不少不一样的开发路线。Git的优点在于,它提供了一整套针对开发链的从新整合工具,以便咱们对其进行合并、变基和捡取等操做。
  • 工做流上的灵活性:Git很是灵活。不但单一开发者能够用它,敏捷团队也能够找到使用它工做的合适方法,甚至一个由众多开发者在不一样的工做地点参与的大型国际项目也能够用它开发出一个很好的工做流。
  • 适合奉献合做:大多数开源项目所依靠的都是开发者的无私奉献。所以,让这种无私奉献的方式尽量地简单化是一件很是重要的事。而这在一个集中式的版本控制系统中一般是很难作到的,由于咱们不可能让全部人都有权限去写版本库。但若是咱们使用Git,那么每一个人都先能够克隆一个独立的工做版本库,而后再对其进行后续的改动。
  • 高性能:Git在处理拥有许多文件且历史悠久的项目时速度也依然是很是快的。例如,使用Git将Linux内核源码的当前版本切换到6年前的旧版本时,在一台MacBook Air上所需的时间不到1分钟。考虑这两个版本之间有着超过200000次的提交和40000个更改文件,这已经足以让人印象深入了。
  • 强大的抗故障和抗攻击能力:因为项目历史被分散存储在多个分布式版本库中,所以数据严重流失的可能性不大。再加上版本库中有着巧妙简单的数据结构,这确保了其中的数据即便在遥远的将来也仍然会被正确地解释。并且,它还使用了统一的加密校验,这使得攻击者难以对版本库进行篡改。
  • 离线开发与多点开发:分布式的体系结构可使得离线开发或者边旅行边开发的方式变得很是容易。并且该结构在多点开发模式下,咱们既不须要设置中央服务器,也不须要固定的网络链接。
  • 强大的开源社区:除官方提供的详细文档外,你还能够在该社区找到无数相关的手册、论坛、维基网站等,另外还有各类工具生态系统、托管平台、出版物、服务以及针对各个开发环境的插件,整个社区都正在茁壮成长。
  • 可扩展性:Git为用户提供了许多实用命令,其中包括了能使咱们更便于直接访问其远程版本库的命令。这可让Git变得很是灵活,这种灵活性将容许其各类独立应用提供比默认的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 分布式版本控制

  • 项目版本库(blessed repository):该版本库主要用于存储由“官方”建立并发行的版本。
  • 共享版本库(shared repository):该版本库主要用于开发团队内人员之间的文件交换。在小型项目中,项目版本库自己就能够胜任这一角色了。但在多点开发的条件下,咱们可能就会须要几个这样的专用版本库。
  • 工做流版本库(workflow repository):工做流版本库一般只用于填充那些表明工做流中某种特定进展状态的修改,例如审核经过后的状态等。
  • 派生版本库(fork repository):该版本库主要用于从开发主线分离出某部份内容(例如,分离出那些开发耗时较长,不适合在一个普通发布周期中完成的内容),或者隔离出可能永远不会被包含在主线中的、用于实验的那部分开发进展。

下面,咱们再来看看分布式系统相对于集中式的优势有哪些。

  • 高性能:几乎全部的操做都无需进行网络访问,都可直接在本地执行。
  • 高效的工做方式:开发者可经过多个本地分支在不一样任务之间进行快速切换。
  • 离线功能:开发者能够在没有服务器链接的状况下执行提交、建立分支、版本标签等操做。以后再将其上传服务器。
  • 灵活的开发进程:咱们能够在团队和公司中为其余部门创建专用的版本库,例如为方便与测试人员交流而建的版本库。这样相关修改就很容易发布,由于只是特定版本库上的一次推送。
  • 备份做用:因为每一个开发者都持有一份拥有完整历史版本的版本库副本,因此因服务器故障而致使数据丢失的可能性是微乎其微的。
  • 可维护性:对于那些难以对付的重构工做,咱们能够在将成功传送给其原始版本库以前,先在该版本库的副本上尝试一下。

版本库,分布式的基础所在

其实,版本库本质上就是一个高效的数据存储结构而已,由如下部分组成。

文件(即blob):这里既包含了文本也包含了二进制数据,这些数据将不以文件名的形式被保存。

目录(即Tree):目录中保存的是与文件名相关联的内容,其中也会包含其余目录。

版本(即commit):每个版本所定义的都是相应目录的某个可恢复的状态。每当咱们建立一个新的版本时,其做者、时间、注释以及其以前的版本都将会被保存下来。

对于全部的数据,它们都会被计算成一个十六进制散列值(例如像1632acb65b01 c6b621d6e1105205773931bb1a41这样的值)。这个散列值将会被用做相关对象的引用,以及往后恢复数据时所需的键值(见图1.3)。

​图1.3 版本库中的对象存储


也就是说,一个提交对象的散列值实际上就是它的“版本号”,若是咱们持有某一提交的散列值,就能够用它来检查对应版本是否存在于某一版本库中。若是存在,咱们就能够将其恢复到当前工做区相应的目录中。若是该版本不存在,咱们也能够从其余版本库中单独导入(拉回)该提交所引用的所有对象。

接下来,咱们来看看采用这种散列值和这种既定的版本库结构究竟有哪些优点。

  • 高性能:经过散列值来访问数据是很是快的。
  • 冗余度——释放存储空间:相同的文件内容只需存储一次便可。
  • 分布式版本号:因为相关散列值是根据文件,做者和日期来计算的,因此版本也能够“离线”产生,不用担忧未来会所以而发生版本冲突。
  • 版本库间的高效同步:当咱们将某一提交从一个版本库传递给另外一个版本库时,只须要传送那些目标版本库中不存在的对象便可。而正是由于有了散列值的帮助,咱们才能很快地判断相关对象是否已经存在。
  • 数据完整性:因为散列值是根据数据的内容来计算的,因此咱们能够随时经过Git来查看某一散列值是否与相关数据匹配。以检测该数据上可能的意外变化或恶意操做。
  • 自动重命名检测:被重命名的文件能够被自动检测到,由于根据该文件内容计算出的散列值并无发生变化。也正由于如此,Git中并无专用的重命名命令,只需移动命令便可。

分支的建立与合并很简单

对于大多数版本控制系统来讲,分支的建立与合并一般会因其特殊性而被认为是高级拓展操做。但因为Git最初就是为了方便那些散落在世界各地的Linux内核开发者而建立的,合并多方努力的结果一直都是其面临的最大挑战之一,因此Git的设计目标之一就是要让分支的建立与合并操做变得尽量地简单且安全。

在下面的图1.4中,咱们向你展现了开发者是如何经过建立分支的方式来进行并行开发的。图中的每个点都表明了该项目的一个版本(即commit)。而因为在Git中,咱们只能对整个项目进行版本化,因此每一个点同时也表明了属于同一版本的各个文件。

​图1.4 因开发者的并行开发而出现的分支建立操做

如上所示,图中两位开发者的起点是同一个版本。以后两人各自作了修改,并提交了修改。这时候,对于这两位开发者各自的版本库来讲,该项目已经有了两个不一样的版本。也就是说,他们在这里建立了两个分支。接下来,若是其中一个开发者想要导入另外一我的的修改,他/她就能够用Git来进行版本合并。若是合并成功了,Git就会建立一个合并提交,其中会包含两位开发者所作的修改。这时若是另外一位开发者也取回了这一提交,两位开发者的项目就又回到了同一个版本。

在上面的例子中,分支的建立是非计划性的,其缘由仅仅是两个开发者在并行开发同一个软件罢了。在Git中,咱们固然也能够开启有针对性的分支,即显式地建立一个分支(见图1.5)。显式分支一般主要用于协调某一种功能性的并行开发。

​图1.5 针对不一样任务的显式分支

版本库在执行拉回和推送操做时,能够具体指定其针对的是哪一些分支。固然,除了这些简单的分支建立和合并处理外,咱们也能够对分支执行如下动做。

  • 移植分支:咱们能够直接将某一分支中的提交转移到另外一个版本库中。
  • 只传送特定修改:咱们能够将某一分支中的某一次或某几回提交直接复制到另外一个分支中。这就是所谓的捡取处理。
  • 清理历史:咱们能够对分支历史进行改造、排序和删除。这有利于为该项目创建更好的历史文档。咱们称这种处理为交互式重订(interactive rebasing)。

另外,若是你是一个繁忙的项目管理者,还在犹豫不决是否要采用Git

该读什么书?

​《Git高手之路》

Jakub Narębski 著

点击封面购买纸书


本书面向全部的Git用户,全面细致地向读者介绍有关Git的各项实用技巧,充分发掘它的潜力,更好地实现项目版本管理。学习本书,能够帮助读者更好地运用Git,提高软件开发效率。

本书做者Jakub Narębski自Git诞生之初就参与了Git的开发工做。他是gitweb子系统(Git原始Web界面)的主要贡献者之一,是非官方的gitweb维护者。

《Git学习指南》

【德】René Preißel(普莱贝尔), Bjørn Stachmann(斯拉赫曼) 著

点击封面购买纸书


Git 是当今最流行的版本控制系统。本书并不偏重理论介绍,也不面面俱到,而是一本学习Git的实用指南。本书首先介绍了Git 的基础知识,而后关注于敏捷开发,并给出工做流展现了解决现实问题所需的命令和选项。

​《Git版本控制管理(第2版)》

【美】Jon Loeliger , Matthew McCullough 著

点击封面购买纸书

市面上绝无仅有的Git图书 全面剖析Git的用法 同时涵盖GitHub

本书可让读者迅速上手Git,用它来跟踪、分支、合并和管理代码变动。本书经过一系列步骤式教程,引导读者迅速掌握从Git基础知识到高级使用技巧在内的全部知识,并提供友好而严谨的建议,以帮助读者熟悉Git的许多功能。

本书在上一版的基础之上进行了全面更新,包含了操做树的技巧,全面覆盖了reflog和stash的用法,还全面介绍了GitHub仓库。一旦你掌握了Git系统的灵活性以后,你能够以近乎无限的各类方式来管理代码开发,而本书则会告诉你怎么来作。

今日互动

你用过Git吗?截止时间4月29日17时,留言+转发本活动到朋友圈,小编将抽奖选出5名读者 赠送e读版100元异步社区代金券一张,(留言点赞最多的自动得到一张)。

推荐阅读

2018年4月新书书单

异步图书最全Python书单

一份程序员必备的算法书单

第一本Python神经网络编程图书

​长按二维码,能够关注咱们哟

天天与你分享IT好文。


在“

异步图书
”后台回复“
关注
”,便可免费得到
2000门在线视频课程
;推荐朋友关注根据提示获取赠书连接,免费得异步e读版图书一本。赶忙来参加哦!

扫一扫上方二维码,回复“关注”参与活动!

点击阅读原文,直接购买《Git高手指南》

阅读原文​

相关文章
相关标签/搜索