笔者使用 Subversion (SVN) 已经将近 10 年,从来都不觉得有任何必要转换至其他版本控管平台,直到前几年因应云端化的改变,慢慢导入 TFS 版本控管 (TFS Service),转换的过程还算顺利,只因为 SVN 与 TFS 的版本控管概念相近,都属于集中式版本控管系统。这类集中式版本控管系统,使用上简单、直觉且容易进行权限控管,说真的,在大部分的开发情境下,Subversion 或 TFS 已经相当足够,那又是甚麽契机或是需求,迫使我们一定要转换到 Git 版本控管呢?我相信,不同人採用 Git 一定有他的理由,有些人觉得好玩、有些人觉得新鲜、有些人觉得功能强大,无论如何,只要这个理由能够支持你去主动认识一个陌生技术,都是好的,本篇文章除了带大家认识 Git 版本控管机制外,也会说说我想转换到 Git 的理由。
在软体开发领域,对原始码进行版本控管是非常重要的一件事,有别于 Subversion 或 TFVC (Team Foundation Version Control) 这类集中式版本控管系统,Git 是一套分散式版本控管系统(DVCS; Distributed Version Control System),并带来许多版本控管上的各种优势与解决传统集中式版本控管的缺失,例如支援本地操作、备份容易、功能强大且弹性的分支与合併等等。不过,由于 Git 版本控管无论在版控观念与工具使用上,都与传统集中式版控工具差异甚大,因此造成了不小的学习门槛。
虽然说本次文章的主题是「30 天精通 Git 版本控管」,不过,说实在的,还真有点言过其实了,因为 Git 博大精深,有非常多细节可以探究,如果真的要应用在工作上,学几天可以真正上手呢?每天学一点,连续学习 30 天,似乎是个合理的数字 (或太多?),如果有一个工具大家都要用,而且要立刻上手的工具,如果学 30 天都还不知道怎麽活用,那这学习门槛也太高了些。因此我想,这个系列的文章,主要还是专注于「如何在 30 天内学会 Git 版本控管,而且必须要能熟练的应用在实务开发工作上」,这才是本系列的真正目的,那些繁琐的细节,我不会特别强调,但总是有些重要的概念与细节还是不能错过,我会尝试在每一个主题中提到一部份,一有机会就会深入探讨,希望大家可以透过做中学,深刻体会 Git 版本控管的强大魅力。
这几个月,公司因为有个大型专案,参与开发人数超过 12 人,最后大家决议採用 Git 作为本次专案的版本控管机制,与其说我们採用了 Git 版本控管,其实真正採用的原因是「我们选择使用 GitHub 当成我们的版控平台」,原因就是 GitHub 平台实在整合得太好,完整的 Git 版控支援、议题追踪与管理、线上 Wiki 文件管理、友善的原始码审核(Code Review)介面。这些特性,都能有效协助我们在多人协同开发的过程中,减少团队沟通的问题。
刚开始接触 Git 说实在挺辛苦的,因为 Git 版本控管的观念,实在与 Subversion 差太多,没有办法很直觉的去体会其差异,就算给了你 GUI 图形化工具介面,你也不见得就会使用。你知道的,一个强大又好用的工具在你手上,「错误的使用方式」比「不会用」还可怕!说穿了,就是你必须先建立一套思维模式(Mindset),了解 Git 的运作原理,然后再上手使用 Git 相关工具 (无论是指令列工具或图形化介面工具),才是正途!
我在刚学习 Git 的时候,看了好几本书 (其实是挑重点看),也看了许多线上的文章与简报,甚至还看了好几部教学影片,看著看著,确实可以学会如何使用 Git 工具,我觉得并不会太过艰深。不过,Git 的指令与参数非常多,完全超出大脑能记忆的范围,除非每天使用,否则哪有可能一天到晚打指令进行版控,如果每次要使用 Git 指令都要查书的话,那这也太没效率了点,当下的我就直觉地认为,学习 Git 最终还是要回归到好用的 GUI 工具,否则这东西在团队中可能不容易推广。
再者,因为 Git 是属于「分散式版本控管」机制,当开发人数开始变多,版本库又开始变成一人一份时,在第一次进行多人分支与合併的过程时,大家都饱受煎熬,而且持续一段不短的时间。虽然公司内部有先进行技术分享,不过由于大家都是第一次学,那些 Git 的抽象概念,还没办法深植人心,只能基于 Git 的使用方法进行分享,例如工具怎麽用、有哪些常用的指令、甚麽特殊的情况下应该下甚麽指令,诸如此类的。过程中就算说出了複杂的原理,由于大家对于 Git 的认知还很模糊,不同人对 Git 版控方式的理解也不尽相同,所吸收到的知识与概念,也不一定一致。所以,虽然上完课了,大家还是需要好几天的时间不断磨合,相互讨论,互相解决问题,如果你只有一人使用 Git 的话,确实不容易感受 Git 带来的好处,也恐怕不容易坚持下去。
所以,我认为,要学好 Git 版本控管,若先知道以下几点,也许比较容易学会:
Git 的出现,来自于 Linux 之父 "Linus Torvalds" 开发 Linux kernel 的时候,因为早期的版本控制方法非常没有效率,属集中式控管,当 Linux kernel 这类複杂又庞大的专案在进行版本控管时,出现了许多问题。最早期 Linux kernel 採用 BitKeeper 进行版本控管,但后来 Linus Torvalds 基于 BitKeeper 与 Monotone 的使用经验,设计出更棒的 Git 版控系统。原先 Git 只被设计成一个低阶的版控工具,用来当做其他版控系统(SCM)的操作工具,后来才渐渐演变成一套完整的版本控制系统。
有趣的是,Linus Torvalds 改採 Git 进行版本控管初期,由于 Git 太过複杂,许多版控观念跟以往差异太大,也受到世界各地开放原始码社群的反对,但经过几年的努力与发展,操作 Git 的相关工具也越来越成熟,才渐渐平抚反对的压力,从 2013 年的市场调查看来,全世界已有 30% 的开放原始码专案改採 Git 进行版本控管,这是个非常惊人的市占率,意谓著 Git 绝对有其惊豔之处,不好好研究一番还不行呢!
讲到 Git 的架构,完全是基于 Linus Torvalds 在维护 Linux kernel 这个大型专案时得到的经验,以及他本身在档案系统优化方面的丰富经验进行设计,也因为这样,Git 包含了以下几个重要的设计:
关于 Git 的分散式版控系统,我再重申几件事:
今天这篇只是个大致介绍,若看不太懂 Git 的设计理念没关系,你可以用一段时间之后再回来看这篇文章,或许会有更深一层的体会。
我觉得要写「认识 Git 版本控管」比教大家怎麽用还难许多,以下我在列出一些 Git 相关链接,供大家进一步学习。