适用读者

本书适合所有翻开它的人,因为我知道这本书在书店里一定是放在计算机图书专柜。本书尤其适合以下几类读者阅读。

1.被数据同步困扰的“电脑人”

困扰“电脑人”的一个常见问题是,有太多的数据需要长久保存,有太多的电脑设备需要数据同步。可能有的人会说:“像Dropbox一样的网盘可以帮助我呀”。是的,云存储就是在技术逐渐成熟之后应运而生的产品,但是依然解决不了如下几个问题:多个设备上同时修改造成的冲突;冗余数据传输造成的带宽瓶颈;没有实现真正的、完全的历史变更数据备份。具体请参见本书第7篇第39章的内容。

Git可以在数据同步方面做得更好,甚至只需借助小小的U盘就可以实现多台电脑的数据同步,并且支持自动的冲突解决。只要阅读本书第1篇和第2篇,就能轻易掌握相关的操作,实现数据的版本控制和同步。

2.学习计算机课程的学生

我非常后悔没有在学习编程的第一天就开始使用版本控制,在学校时写的很多小程序和函数库都丢失了。直到使用了CVS和SVN对个人数据进行版本控制之后,才开始把每一天的变更历史都保留了下来。Git在这方面可以比CVS和SVN等做得更好。

在阅读完本书的前3篇掌握了Git的基础知识之后,可以阅读第5篇第33章的内容,通过Github或类似的服务提供商建立自己的版本库托管,为自己的数据找一个安全的家。

3.程序员

使用Git会让程序员有更多的时间休息,因为可以更快地完成工作。分布式版本控制让每一个程序员都能在本地拥有一个完整的版本库,所以几乎所有操作都能够脱离网络执行而不受带宽的限制。加之使用了智能协议,版本库间的同步不但减少了数据传输量,还能显示完成进度。

Git帮助程序员打开了进入开源世界的大门,进而开阔视野,提升水平,增加择业的砝码。看看使用Git作为版本控制的开源软件吧:Linux kernel、Android、Debian、Fedora、GNOME、KDevelop、jQuery、Prototype、PostgreSQL、Ruby on Rails……不胜枚举。还有,不要忘了所有的SVN版本库都可以通过Git方式更好地访问。

作为一个程序员,必须具备团队协同能力,本书第3篇应该作为学习的重点。

4.Android程序员

如果你是谷歌Android项目的参与者,尤其是驱动开发和核心开发的参与者,必然会接触Git、repo和Gerrit。对于只是偶尔参考一下Android核心代码的Android应用开发人员而言,也需要对repo有深入的理解,这样才不至于每次为同步代码而耗费一天的时间。

repo是Android为了解决Git多版本库管理问题而设计的工具,在本书第4篇第25章有详细介绍。

Gerrit是谷歌为了避免因分布式开发造成项目分裂而开发的工具,打造了Android独具一格的集中式管理模式,在本书第5篇第32章有详细介绍。

即使是非Android项目,也可以使用这两款工具为自己的项目服务。我还为repo写了几个新的子命令以实现脱离Gerrit提交,让repo拥有更广泛的应用领域。

5.定制开发程序员

当一个公司的软件产品需要针对不同的用户进行定制开发时,就需要在一个版本库中建立大量的特性分支,使用SVN的分支管理远不如使用Git的分支管理那么自然和方便。还有一个应用领域就是对第三方代码进行维护。当使用SVN进行版本控制时,最自然的选择是卖主分支,但随着定制开发的逐渐深入,与上游的偏离也会越大,于是与上游代码的合并也将越来越令人痛苦。

第4篇第22章介绍Topgit这一杀手级的工具,这是这个领域最佳的解决方案。

6.SVN用户

商业软件的研发团队因为需要精细的代码授权,所以不会轻易更换现有的SVN版本控制系统,这种情况下Git依然大有作为。无论是出差在外,或是在家办公,或是开发团队分处异地,都会遇到SVN版本控制服务器无法访问或速度较慢的情况。这时git-svn这一工具会将Git和SVN完美地结合在一起,既严格遵守SVN的授权规定,又可以自如地进行本地提交,当能够连接到SVN服务器时,可以在悠闲地喝着绿茶的同时,等待一次性批量提交的完成。

我有几个项目(pySvnManager、Freemind-MMX)托管在SourceForge的SVN服务器上,现在都是先通过git-svn将其转化为本地的Git库,然后再使用的。以这样的方式访问历史数据、比较代码或提交代码,再也不会因为网速太慢而望眼欲穿了。

本书第4篇第26章详细介绍了Git和SVN的互操作。

7.管理员

Git在很大程度上减轻了管理员的负担:分支的创建和删除不再需要管理员统一管理,因为作为分布式版本控制系统,每一个克隆就是一个分支,每一个克隆都拥有独立的分支命名空间;管理员也不再需要为版本库的备份操心,因为每一个项目成员都拥有一个备份;管理员也不必担心有人在服务器上篡改版本库,因为Git版本库的每一个对象(提交和文件等)都使用SHA1哈希值进行完整性校验,任何对历史数据的篡改都会因为对后续提交产生的连锁反应而原形毕露。

本书第7篇第37章介绍了一款我开发的基于Git的备份工具,它使得Linux系统的数据备份易如反掌。本书第5篇介绍的Git服务器搭建,以及第6篇介绍的版本库迁移方面的知识会为版本控制管理员的日常维护工作提供指引。

8.开发经理

作为开发经理,你一定要对代码分支有深刻的理解,不知本书第18章中的“代码管理之殇”是否能引起你的共鸣。为了能在各种情况下恰当地管理开发团队,第4篇“Git协同模型”是项目经理应该关注的重点。你的团队是否存在着跨平台开发,或者潜在着跨平台开发的可能?本书第8篇第40章也是开发经理应当关注的内容。