首页>参考读物>计算机科学与技术>软件与程序设计

Git权威指南
作者 : 蒋鑫 著
出版日期 : 2011-06-10
ISBN : 978-7-111-34967-9
定价 : 89.00元
扩展资源下载
扩展信息
语种 : 简体中文
页数 : 621
开本 : 16
原书名 :
原出版社:
属性分类: 店面
包含CD :
绝版 : 未绝版
图书简介

本书是Git领域的集大成之作,是一本关于Git的百科全书,在广度、深度和实战性上让同类作品望尘莫及。作者是国内顶尖的版本控制专家和咨询顾问之一。全书一共九篇,共41章和4个附录,内容几乎涵盖了Git的所有方面。

图书前言

版本控制是管理数据变更的艺术,无论数据变更是来自同一个人,还是来自不同的人(一个团队)。版本控制系统不但要忠实地记录数据的每一次变更,还要能够帮助还原任何一次历史变更,以及实现团队的协同工作等。Git 就是版本控制系统中的佼佼者。
  我对版本控制系统的兴趣源自于我的个人知识管理实践,其核心就是撰写可维护的文档,并保存于版本控制系统中。可维护文档的格式可以是 DocBook、FreeMind、reStructuredText 等。我甚至还对 FreeMind 加以改造以便让其文档格式更适合于版本控制系统,这就是我的第一个开源实践:托管于 SourceForge 上的 FreeMind-MMX 项目①。文档书写格式的问题解决之后,就是文档的存储问题了。通过版本控制系统,很自然地就可以实现对文档历史版本的保存,但是如何避免因为版本控制系统瘫痪而导致数据丢失呢?Git 用其崭新的分布式的版本控制设计提供了最好的解决方案。使用 Git,我的知识库不再只有唯一的版本库与之对应,而是可以通过克隆操作分发到不同的磁盘或主机上,克隆的版本库之间通过推送(PUSH)和拉回(PULL)等操作进行同步,数据安全得到了极大的提升。在版本控制系统的忠实呵护下,我的知识库中关于Git的 FreeMind 脑图在日积月累中变得越来越翔实,越来越清晰,最终成为本书的雏形。
  版本控制能决定项目的成败,甚至是公司的生死,此言不虚。我在推广开源项目管理工具和为企业提供咨询服务的过程中看到,有很多团队因为版本控制系统管理的混乱导致项目延期、修正的 Bug 重现、客户的问题不能在代码中定位……无论他们使用的是什么版本控制系统(开源的或是商业的)都是如此。这是因为传统的集中式版本控制系统不能有效地管理分支和进行分支间合并。集中管理的版本库只有唯一的分支命名空间,需要专人管理,从而造成分支创建的不自由;分支间的合并要么因为缺乏追踪导致重复合并、引发严重冲突,要么因为版本控制系统本身蹩脚的设计导致分支合并时效率低下和陷阱重重。Git凭借其灵活的设计让项目摆脱分支管理的梦魇。
  我的公司也经历过代码管理的生死考验。因为公司的开发模式主要是基于开源软件的二次开发,所以最早在使用SVN(Subversion)做版本控制时,很自然地使用了SVN卖主分支模型来管理代码。随着增加和修改的代码越来越多,我们开发的软件与开源软件上游的偏离也越来越远,当上游有新版本发布时,最早可能只用几个小时就可以将改动迁移过去,但是如果对上游的改动多达几十甚至上百处时,迁移的过程就会异常痛苦,基本上和重新做一遍差不多。那时似乎只有一种选择:不再与上游合并,不再追踪上游的改动,而这与公司的价值观“发动全球智慧为客户创造价值”相违背。迷茫之中,分布式版本控制系统飘然而至,原来版本控制还可以这么做。
  我最先尝试的分布式版本控制系统是 Hg(Mercurial),当发现Hg和 MQ(Hg 的一个插件)这一对宝贝儿的时候,我如获至宝。逐渐地,公司的版本库都迁移到了Hg上。但随着新的开发人员的加入,问题又出现了,一个人使用Hg和MQ很好,但多个人使用时则会出现难以协同的问题。于是我们大胆地采用了 Git,并在实践中结合 Topgit 等工具进行代码的管理。再一次,也许是最后一次,我们的代码库迁移到了 Git。
  最早认识分布式版本控制,源自于我们看到了众多开源项目的版本控制系统大迁移,这场迁移还在进行中。
   MoinMoin 是我们关注的一个开源的维基软件,2006 年,它的代码库从SVN迁移到了Hg①。
   Mailman 同样是我们关注的一个开源邮件列表软件。2007 年,它的代码库从SVN迁移到了 Bazaar②。
   Linux 采用Git作为版本控制系统(一点都不奇怪,因为Git就是 Linus Torvalds 开发的)。
   Android 是目前最为流行的开源项目之一,因为潜在市场巨大,已经吸引了越来越多的开发者进入这个市场,而Android就是用Git维护的。
  当开源软件纷纷倒向分布式版本控制系统大旗(尤其是Git)的时候,很多商业公司也在行动了,尤其是涉及异地团队协同和Android核心代码定制开发的公司。对于那些因保守而不敢向Git靠拢的公司,Git也可以派上用场,因为Git可以与现在大多数公司部署的SVN很好地协同,即公司的服务器是 SVN,开发者的客户端则使用 Git。相信随着Git的普及,以及公司在代码管理观念上的改进,会有更多的公司拥抱 Git。
本书的组织
  本书共分为9篇,前8篇是正文,一共41章,第9篇是附录。
  第1篇讲解了Git的相关概念,以及安装和配置的方法,共3章。第1章介绍了版本控制的历史。第2章用十几个小例子介绍了Git的一些闪亮特性,期待这些特性能够让你爱上Git。第3章则介绍了Git在三种主要操作系统平台上的安装和使用。在本书的写作过程中,我70%的时间使用的是Debian Linux操作系统,Linux用户可以毫无障碍地完成本书列举的所有实践操作。在2010年年底,当得知有出版社愿意出版这本书后,我向妻子阿巧预支了未来的部分稿费购买了我的第一台 MacBook Pro,于是本书就有了较为翔实的如何在Mac OS X下安装和使用Git的内容,以及在本书第22章中介绍的关于Topgit在Mac OS X上的部署和改进相关的内容。在本书的编辑和校对过程中因为要使用 Word 格式的文稿,所以本书后期的很多工作是在运行于 VirtualBox 下的 Windows 虚拟机中完成的,即使是使用运行于资源受限的虚拟机中的 Cygwin,Git 依然完美地完成了工作。
  第2篇和第3篇详细讲解了Git的使用方法,是本书的基础和核心,大约占据了全书40%的篇幅。这两篇的内容架构方式是我在进行SVN培训时就已经形成的习惯,即以“独奏”指代一个人的版本控制所要讲述的知识点,以“和声”指代团队版本控制涉及的话题。在第2篇“Git独奏”中,本书将Git的设计原理穿插在各章之中讲解,因为唯有了解真相(Git原理),才有可能自由(掌握Git)。在第3篇“Git和声”中,本书讲解了团队版本控制必须掌握的里程碑和分支等概念,以及如何解决合并中遇到的冲突。
  第4篇细致地讲解了Git在实际工作中的使用模式。除了传统的集中式和分布式使用模式之外,第22章还介绍了 Topgit 在定制开发中的应用,这也是我公司在使用Git时采用的最主要的模式。这一章还讲解了我对 Topgit 所做的部分改进,相关的具体介绍最早出现在我公司的博客上①。第23~25章介绍了多版本库协同的不同方法,其中第25章介绍的一个独辟蹊径的解决方案是由 Android 项目引入的名为repo的工具实现的,我对其进行改造后可以让这个工具脱离Gerrit代码审核服务器,直接操作Git服务器。第26章介绍了git-svn这一工具,该工具不但可以实现从SVN版本库到Git版本库的迁移,还可以实现以Git作为客户端向SVN提交。
  第5篇介绍了Git服务器的架设。本篇是全书最早开始撰写的部分,这是因为我给客户做的Git培训讲义的相关内容不够详细,于是应客户要求针对Gitolite等服务器的架设撰写了详细的管理员手册,即本书的第30章。第32章介绍了Android项目在Git管理上的又一大创造,即Gerrit,它实现了一个独特的集中式Git版本库管理模型。
  第6篇讲解了Git版本库的迁移。其中第34章详细介绍了从CVS版本库到Git版本库的迁移,其迁移过程也可以作为从CVS到SVN迁移的借鉴。本篇还介绍了从SVN和Hg版本库到Git的迁移。对于其他类型的版本库,介绍了一个通用的需要编程来实现的方法。在本篇的最后还介绍了一个Git版本库整理的利器,可以理解为一个Git库转换为另外一个Git库的方法。
  第7篇是关于Git的其他应用,其主要内容介绍了我在etckeeper启发下开发的一款备份工具 Gistore,该工具可以运行于Linux和Mac OS X下。
  第8篇是Git杂谈。其中第40章的内容可供跨平台的项目组借鉴。第41章介绍了一些在前面没有涉及的Git的相关功能和特性。
  第9篇是附录。首先介绍了完整的Git命令索引,然后分别介绍了CVS、SVN、Hg与Git之间的比较和命令对照,对于有其他版本控制系统使用经验的用户而言,这一部分内容颇具参考价值。
适用读者
  本书适合所有翻开它的人,因为我知道这本书在书店里一定是放在计算机图书专柜。本书尤其适合以下几类读者阅读。
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章也是开发经理应当关注的内容。
排版约定
  本书使用的排版格式约定如下:
1. 命令输出及示例代码
  执行一条Git命令及其输出的示例如下:
  $ git --version
  git version 1.7.4
2. 提示符($)
  命令前面的 $ 符号代表命令提示符。
3. 等宽字体(Constant width)
  用于标示屏幕输出的字符 、示例代码,以及正文中出现的命令、参数、文件名和函数名等。
4. 等宽粗体(Constant width bold)
  用于表示由用户手工输入的内容。
5. 占位符(
  用尖括号扩起来的内容,表示命令中或代码中的占位符,读者应当用实际值将其替换。
在线资源
   官方网站:http://www.ossxp.com/doc/gotgit/
在本书的官方网站上,大家可以了解到与本书相关的最新信息,查看本书的勘误,以及下载与本书相关的资源。官网是以Git方式维护的,人人都可以参与其中。
   新浪微博:http://weibo.com/GotGit
  欢迎大家通过新浪微博与作者交流,也欢迎大家通过新浪微博将你们的宝贵意见和建议反馈给作者。
致谢
  感谢 Linus Torvalds、Junio C Hamano 和Git项目的所有贡献者,是他们带给我们崭新的版本控制体验。
  本书能够出版要感谢机械工业出版社华章分社,华章分社对中文原创计算机图书的信任让中国的每一个计算机从业者都有可能圆自己出书的梦想。作为一个新人,拿着一个新的选题,遇到同样充满激情的编辑,我无疑是幸运的。这个充满激情的编辑,就是机械工业出版社华章分社的杨福川编辑。甚至没有向我索要样章,在看过目录之后就“冒险”和我签约,他的激情让我不敢懈怠。同样要感谢王晓菲编辑,她的耐心和细致让我吃惊,也正是因为她的工作本书的行文才能更加流畅,本书也才能够更快问世。还有张少波编辑,感谢她在接到我的电话后帮我分析选题并推荐给杨福川编辑。
  本书的部分内容是由我的Git培训讲义扩展而来的,在此感谢朝歌数码的蒋宗贵,是他的鼓励和鞭策让我完善了本书中的与服务器架设的相关章节。还要感谢王彦宁,正是通过她的团队我才认识了 Android,才有了本书关于 repo 和 Gerrit 的相关章节。
  感谢群英汇的同事们,尤其要感谢王胜,正是因为我们在使用 Topgit 0.7 版本时遇到了严重的冲突,才使我下定决心研究 Git。
  感谢上海爱立信研发中心的高级技术专家蔡煜,他对全书尤其是git-svn和Gitolite相关章节做了重点评审,他的意见和建议修正了本书的很多不当之处。因为时间的关系,他的一些非常好的观点没有机会在这一版中体现,争取在改版时弥补遗憾。
  中国科学院软件研究所的张先轶、比蒙科技的宋伯润和杨致伟、摩博科技的熊军、共致开源的秦红胜,以及王胜等人为本书的技术审校提供了帮助,感谢他们的宝贵意见和建议。来自中国台湾的PyLabs 团队纠正了本书在对Hg的认识上的偏颇,让本书附录中的相关内容更加准确和客观,在此向他们表示感谢。
  因为写书亏欠家人很多,直到最近才发现女儿小雪是多么希望拥有一台儿童自行车。感谢妻子阿巧对我的耐心和为家庭的付出。感谢岳父、岳母这几年来对小雪和我们整个家庭的照顾,让我没有后顾之忧。还要感谢我的父母和妹妹,他们对我事业的支持和鼓励是我前进的动力。在我写作本书的同时,老爸正在富春江畔代表哈尔滨电机厂监督发电机组的制造,而且也在写一本监造手册方面的书,抱歉老爸,我先完成了。 :)

蒋鑫(http://www.ossxp.com/)
2011年4月

上架指导

计算机\程序设计

封底文字

2009年9月,我出版了一本针对日本读者的Git专著,当Linus收到我赠送的签名本时,他对我说:“除了截图和命令行示例外,其他我什么也看不懂”(Linus不懂日文)。因为同样的原因,虽然我不能了解蒋鑫这本书的全部内容,但是我可以看出这本书涵盖了非常广泛的主题,并且可以看出蒋鑫对这本书的用心。我非常高兴能够看到这本书的出版,感谢向世界传播Git。
——Junio C Hamano Git维护者(2005年7月至今)
仔细拜读了本书前三篇共20章的内容,感觉这本书极好。作者在软件版本控制系统方面有超过10年的经验,对版本控制系统有非常深入的认识。尤为难得的是,本书文笔很流畅,虽然是技术书籍,但是作者娓娓道来,阅读体验很好。Git的学习门槛较高,包括我们公司在内的很多企业都将版本控制系统转向了Git,强烈推荐大家看一看。
——范凯(Robbin) CSDN平台开发总监/ITeye(www.iteye.com)创始人
这是我读过的最好的关于Git的书。将复杂的Git解释得清晰而透彻绝非易事,蒋鑫做到了,更让人惊喜的是,他还分享了大量的经验总结。我几年来累积下来的诸多疑惑都在读罢该书后一一得以解开。如果你正在使用,或者打算使用Git,本书当然是必备的。你也可以抱着Subversion或CVS不放,不过,如果哪一天有人拿起这本书敲你的头时可别怪我没提醒过你。
——许晓斌(Juven Xu) 资深Maven专家/著有畅销书《Maven实战》
Git是当前开源社区最流行的版本控制系统,代表了版本控制的未来。每一位有志于从事软件开发的学习者都应该学习和掌握这一工具,它不但可用于追踪编程者的思考过程,还是打开开源软件世界的金钥匙,更可以通过版本控制掌握与他人协同工作的技能。本书是一本耐读的原创著作,因为其涵盖的内容之广足以让每一位程序员在成长的不同阶段都可以从中汲取丰富营养。
—— 冯铃 清华大学计算机科学与技术系“长江学者”兼特聘教授
目前市面上关于Git的书不在少数,但迄今为止,国内外还没有一本书能在广度和深度上达到本书的水平,也许在今后相当长的一段时间内也不会有。如果你是一位软件开发者,强烈建议你学习并使用Git;如果你要学习Git,本书无疑是你最佳的选择。
——徐继哲 哲思社区(http://www.zeuux.org/)创始人

作者简介

蒋鑫 著:暂无简介

图书目录

前 言
第1篇 初识Git
第1章 版本控制的前世和今生/ 2
1.1 黑暗的史前时代/ 2
1.2 CVS—开启版本控制大爆发/ 5
1.3 SVN—集中式版本控制集大成者/ 7
1.4 Git—Linus 的第二个伟大作品/ 9
第2章 爱上 Git 的理由/ 11
2.1 每日工作备份/ 11
2.2 异地协同工作/ 12
2.3 现场版本控制/ 13
2.4 避免引入辅助目录/ 15
2.5 重写提交说明/ 15
2.6 想吃后悔药/ 16
2.7 更好用的提交列表/ 17
2.8 更好的差异比较/ 18
2.9 工作进度保存/ 18
2.10 代理SVN提交实现移动式办公/ 19
2.11 无处不在的分页器/ 20
2.12 快/ 21
第3章 Git的安装和使用/ 22
3.1 在Linux 下安装和使用 Git/ 22
3.1.1 包管理器方式安装/ 22
3.1.2 从源代码进行安装/ 23
3.1.3 从Git版本库进行安装/ 23
3.1.4 命令补齐/ 25
3.1.5 中文支持/ 25
3.2 在Mac OS X 下安装和使用 Git/ 26
3.2.1 以二进制发布包的方式安装/ 26
3.2.2 安装 Xcode/ 27
3.2.3 使用 Homebrew 安装 Git/ 29
3.2.4 从Git源码进行安装/ 29
3.2.5 命令补齐/ 30
3.2.6 其他辅助工具的安装/ 30
3.2.7 中文支持/ 31
3.3 在Windows 下安装和使用 Git(Cygwin篇)/ 31
3.3.1 安装 Cygwin/ 32
3.3.2 安装 Git/ 36
3.3.3 Cygwin 的配置和使用/ 37
3.3.4 Cygwin 下 Git 的中文支持/ 40
3.3.5 Cygwin 下 Git 访问 SSH 服务/ 41
3.4 Windows 下安装和使用 Git(msysGit篇)/ 45
3.4.1 安装 msysGit/ 46
3.4.2 msysGit 的配置和使用/ 48
3.4.3 msysGit中shell环境的中文支持/ 49
3.4.4 msysGit中Git的中文支持/ 50
3.4.5 使用 SSH 协议/ 51
3.4.6 TortoiseGit 的安装和使用/ 52
3.4.7 TortoiseGit 的中文支持/ 55
第2篇 Git独奏
第4章 Git 初始化/ 58
4.1 创建版本库及第一次提交/ 58
4.2 思考:为什么工作区根目录下有一个 .git 目录/ 60
4.3 思考:git config 命令的各参数有何区别/ 63
4.4 思考:是谁完成的提交/ 65
4.5 思考:随意设置提交者姓名,是否太不安全/ 67
4.6 思考:命令别名是干什么的/ 68
4.7 备份本章的工作成果/ 69
第5章 Git 暂存区/ 70
5.1 修改不能直接提交吗/ 70
5.2 理解 Git 暂存区(stage)/ 76
5.3 Git Diff 魔法/ 78
5.4 不要使用 git commit -a/ 81
5.5 搁置问题,暂存状态/ 82
第6章 Git对象/ 83
6.1 Git对象库探秘/ 83
6.2 思考:SHA1 哈希值到底是什么,是如何生成的/ 88
6.3 思考:为什么不用顺序的数字来表示提交/ 90
第7章 Git 重置/ 93
7.1 分支游标master探秘/ 93
7.2 用 reflog 挽救错误的重置/ 95
7.3 深入了解git reset命令/ 96
第8章 Git 检出/ 99
8.1 HEAD 的重置即检出/ 99
8.2 挽救分离头指针/ 102
8.3 深入了解 git checkout 命令/ 103
第9章 恢复进度/ 105
9.1 继续暂存区未完成的实践/ 105
9.2 使用 git stash/ 108
9.3 探秘 git stash/ 109
第10章 Git 基本操作/ 114
10.1 先来合个影/ 114
10.2 删除文件/ 114
10.2.1 本地删除不是真的删除/ 115
10.2.2 执行 git rm 命令删除文件/ 116
10.2.3 命令git add -u快速标记删除/ 117
10.3 恢复删除的文件/ 118
10.4 移动文件/ 119
10.5 一个显示版本号的 Hello World/ 120
10.6 使用 git add -i 选择性添加/ 122
10.7 Hello World 引发的新问题/ 124
10.8 文件忽略/ 125
10.9 文件归档/ 129
第11章 历史穿梭/ 130
11.1 图形工具:gitk/ 130
11.2 图形工具:gitg/ 131
11.3 图形工具:qgit/ 135
11.4 命令行工具/ 140
11.4.1 版本表示法:git rev-parse/ 141
11.4.2 版本范围表示法:git rev-list/ 144
11.4.3 浏览日志:git log/ 146
11.4.4 差异比较:git diff/ 150
11.4.5 文件追溯:git blame/ 151
11.4.6 二分查找:git bisect/ 152
11.4.7 获取历史版本/ 156
第12章 改变历史/ 157
12.1 悔棋/ 157
12.2 多步悔棋/ 159
12.3 回到未来/ 161
12.3.1 时间旅行一/ 162
12.3.2 时间旅行二/ 167
12.3.3 时间旅行三/ 171
12.4 丢弃历史/ 174
12.5 反转提交/ 177
第13章 Git 克隆/ 179
13.1 鸡蛋不装在一个篮子里/ 179
13.2 对等工作区/ 180
13.3 克隆生成裸版本库/ 183
13.4 创建生成裸版本库/ 184
第14章 Git库管理/ 187
14.1 对象和引用哪里去了/ 187
14.2 暂存区操作引入的临时对象/ 189
14.3 重置操作引入的对象/ 191
14.4 Git管家:git-gc/ 193
14.5 Git管家的自动执行/ 196
第3篇 Git和声
第15章 Git协议与工作协同/ 200
15.1 Git 支持的协议/ 200
15.2 多用户协同的本地模拟/ 202
15.3 强制非快进式推送/ 203
15.4 合并后推送/ 207
15.5 禁止非快进式推送/ 208
第16章 冲突解决/ 210
16.1 拉回操作中的合并/ 210
16.2 合并一:自动合并/ 212
16.2.1 修改不同的文件/ 212
16.2.2 修改相同文件的不同区域/ 214
16.2.3 同时更改文件名和文件内容/ 215
16.3 合并二:逻辑冲突/ 217
16.4 合并三:冲突解决/ 218
16.4.1 手工编辑完成冲突解决/ 221
16.4.2 图形工具完成冲突解决/ 221
16.5 合并四:树冲突/ 225
16.5.1 手工操作解决树冲突/ 227
16.5.2 交互式解决树冲突/ 228
16.6 合并策略/ 230
16.7 合并相关的设置/ 231
第17章 Git 里程碑/ 233
17.1 显示里程碑/ 234
17.2 创建里程碑/ 236
17.2.1 轻量级里程碑/ 237
17.2.2 带说明的里程碑/ 238
17.2.3 带签名的里程碑/ 239
17.3 删除里程碑/ 242
17.4 不要随意更改里程碑/ 243
17.5 共享里程碑/ 243
17.6 删除远程版本库的里程碑/ 246
17.7 里程碑命名规范/ 247
第18章 Git 分支/ 253
18.1 代码管理之殇/ 253
18.1.1 发布分支/ 253
18.1.2 特性分支/ 256
18.1.3 卖主分支/ 257
18.2 分支命令概述/ 258
18.3 “Hello World”开发计划/ 259
18.4 基于特性分支的开发/ 260
18.4.1 创建分支 user1/getopt/ 261
18.4.2 创建分支 user2/i18n/ 262
18.4.3 开发者 user1 完成功能开发/ 263
18.4.4 将 user1/getopt 分支合并到主线/ 264
18.5 基于发布分支的开发/ 265
18.5.1 创建发布分支/ 266
18.5.2 开发者 user1 工作在发布分支/ 267
18.5.3 开发者 user2 工作在发布分支/ 268
18.5.4 开发者 user2 合并推送/ 270
18.5.5 发布分支的提交合并到主线/ 271
18.6 分支变基/ 275
18.6.1 完成 user2/i18n 特性分支的开发/ 275
18.6.2 分支 user2/i18n 变基/ 277
第19章  远程版本库/ 284
19.1 远程分支/ 284
19.2 分支追踪/ 287
19.3 远程版本库/ 290
19.4 PUSH 和 PULL 操作与远程版本库/ 292
19.5 里程碑和远程版本库/ 294
19.6 分支和里程碑的安全性/ 294
第20章 补丁文件交互/ 296
20.1 创建补丁/ 296
20.2 应用补丁/ 297
20.3 StGit 和 Quilt/ 300
20.3.1 StGit/ 300
20.3.2 Quilt/ 304
第4篇 Git协同模型
第21章 经典Git协同模型/ 308
21.1 集中式协同模型/ 308
21.1.1 传统集中式协同模型/ 309
21.1.2 Gerrit 特殊的集中式协同模型/ 310
21.2 金字塔式协同模型/ 311
21.2.1 贡献者开放只读版本库/ 312
21.2.2 以补丁方式贡献代码/ 313
第22章 Topgit 协同模型/ 314
22.1 作者版本控制系统的三个里程碑/ 314
22.2 Topgit 原理/ 316
22.3 Topgit 的安装/ 317
22.4 Topgit 的使用/ 319
22.5 用Topgit方式改造Topgit/ 330
22.6 Topgit 使用中的注意事项/ 334
第23章 子模组协同模型/ 336
23.1 创建子模组/ 336
23.2 克隆带子模组的版本库/ 339
23.3 在子模组中修改和子模组的更新/ 340
23.4 隐性子模组/ 343
23.5 子模组的管理问题/ 345
第24章 子树合并/ 347
24.1 引入外部版本库/ 347
24.2 子目录方式合并外部版本库/ 349
24.3 利用子树合并跟踪上游改动/ 351
24.4 子树拆分/ 353
24.5 git-subtree 插件/ 353
第25章 Android 式多版本库协同/ 356
25.1 关于 repo/ 357
25.2 安装 repo/ 357
25.3 repo和清单库的初始化/ 359
25.4 清单库和清单文件/ 360
25.5 同步项目/ 361
25.6 建立 Android 代码库本地镜像/ 363
25.7 repo 的命令集/ 365
25.8 repo 命令的工作流/ 370
25.9 好东西不能 Android 独享/ 371
25.9.1 repo+Gerrit 模式/ 371
25.9.2 repo 无审核模式/ 371
25.9.3 改进的 repo 无审核模式/ 372
第26章 Git 和 SVN 协同模型/ 378
26.1 使用 git-svn 的一般流程/ 380
26.2 git-svn 的奥秘/ 386
26.2.1 Git 库配置文件的扩展及分支映射/ 387
26.2.2 Git工作分支和 Subversion 如何对应/ 388
26.2.3 其他辅助文件/ 390
26.3 多样的 git-svn 克隆模式/ 390
26.4 共享 git-svn 的克隆库/ 393
26.5 git-svn 的局限/ 394
第5篇 搭建Git服务器
第27章 使用 HTTP 协议/ 398
27.1 哑传输协议/ 398
27.2 智能 HTTP 协议/ 400
27.3 Gitweb 服务器/ 401
27.3.1 Gitweb的安装/ 402
27.3.2 Gitweb的配置/ 403
27.3.3 版本库的 Gitweb 相关设置/ 404
27.3.4 即时Gitweb服务/ 405
第28章 使用 Git 协议/ 406
28.1 Git 协议语法格式/ 406
28.2 Git 服务软件/ 406
28.3 以 inetd 方式配置运行/ 406
28.4 以 runit 方式配置运行/ 407
第29章 使用 SSH 协议/ 409
29.1 SSH 协议语法格式/ 409
29.2 服务架设方式比较/ 409
29.3 关于 SSH 公钥认证/ 411
29.4 关于 SSH 主机别名/ 411
第30章 Gitolite 服务架设/ 413
30.1 安装Gitolite/ 414
30.1.1 服务器端创建专用账号/ 414
30.1.2 Gitolite 的安装/升级/ 415
30.1.3 关于 SSH 主机别名/ 417
30.1.4 其他的安装方法/ 418
30.2 管理 Gitolite/ 419
30.2.1 管理员克隆 gitolite-admin 管理库/ 419
30.2.2 增加新用户/ 420
30.2.3 更改授权/ 422
30.3 Gitolite 授权详解/ 423
30.3.1 授权文件的基本语法/ 423
30.3.2 定义用户组和版本库组/ 424
30.3.3 版本库ACL/ 424
30.3.4 Gitolite 授权机制/ 426
30.4 版本库授权案例/ 427
30.4.1 对整个版本库进行授权/ 427
30.4.2 通配符版本库的授权/ 428
30.4.3 用户自己的版本库空间/ 429
30.4.4 对引用的授权:传统模式/ 430
30.4.5 对引用的授权:扩展模式/ 430
30.4.6 对引用的授权:禁用规则的使用/ 431
30.4.7 用户分支/ 431
30.4.8 对路径的写授权/ 432
30.5 创建新版本库/ 432
30.5.1 在配置文件中出现的版本库,即时生成/ 433
30.5.2 通配符版本库,管理员通过推送创建/ 434
30.5.3 直接在服务器端创建/ 435
30.6 对 Gitolite 的改进/ 435
30.7 Gitolite 功能拓展/ 436
30.7.1 版本库镜像/ 436
30.7.2 Gitweb 和 Git daemon 支持/ 438
30.7.3 其他功能拓展和参考/ 439
第31章 Gitosis 服务架设/ 441
31.1 安装 Gitosis/ 442
31.1.1 Gitosis 的安装/ 442
31.1.2 服务器端创建专用账号/ 442
31.1.3 Gitosis 服务初始化/ 443
31.2 管理 Gitosis/ 443
31.2.1 管理员克隆 gitolit-admin 管理库/ 443
31.2.2 增加新用户/ 444
31.2.3 更改授权/ 446
31.3 Gitosis 授权详解/ 447
31.3.1 Gitosis 默认设置/ 447
31.3.2 管理版本库 gitosis-admin/ 447
31.3.3 定义用户组和授权/ 448
31.3.4 Gitweb 整合/ 449
31.4 创建新版本库/ 449
31.5 轻量级管理的 Git 服务/ 450
第32章 Gerrit 代码审核服务器/ 452
32.1 Gerrit 的实现原理/ 452
32.2 架设 Gerrit 的服务器/ 456
32.3 Gerrit 的配置文件/ 461
32.4 Gerrit 的数据库访问/ 462
32.5 立即注册为 Gerrit 管理员/ 464
32.6 管理员访问 SSH 的管理接口/ 467
32.7 创建新项目/ 468
32.8 从已有的 Git 库创建项目/ 472
32.9 定义评审工作流/ 473
32.10 Gerrit 评审工作流实战/ 477
32.10.1 开发者在本地版本库中工作/ 477
32.10.2 开发者向审核服务器提交/ 478
32.10.3 审核评审任务/ 478
32.10.4 评审任务没有通过测试/ 480
32.10.5 重新提交新的补丁集/ 482
32.10.6 新修订集通过评审/ 483
32.10.7 从远程版本库更新/ 485
32.11 更多 Gerrit 参考/ 486
第33章 Git 版本库托管/ 487
33.1 Github/ 487
33.2 Gitorious/ 489
第6篇 迁移到Git
第34章 CVS版本库到Git的迁移/ 492
34.1 安装cvs2svn(含 cvs2git)/ 492
34.1.1 Linux下cvs2svn的安装/ 492
34.1.2 Mac OS X 下 cvs2svn 的安装/ 493
34.2 版本库转换的准备工作/ 494
34.2.1 版本库转换注意事项/ 494
34.2.2 文件名乱码问题/ 494
34.2.3 提交说明乱码问题/ 494
34.3 版本库转换/ 496
34.3.1 配置文件解说/ 496
34.3.2 运行cvs2git完成转换/ 500
34.4 迁移后的版本库检查/ 501
第35章 更多版本控制系统的迁移/ 502
35.1 SVN版本库到Git的迁移/ 502
35.2 Hg 版本库到Git的迁移/ 503
35.3 通用版本库迁移/ 505
35.4 Git 版本库整理/ 511
35.4.1 环境变量过滤器/ 513
35.4.2 树过滤器/ 513
35.4.3 暂存区过滤器/ 513
35.4.4 父节点过滤器/ 514
35.4.5 提交说明过滤器/ 514
35.4.6 提交过滤器/ 515
35.4.7 里程碑名字过滤器/ 516
35.4.8 子目录过滤器/ 516
第7篇 Git的其他应用
第36章 etckeeper/ 518
36.1 安装 etckeeper/ 518
36.2 配置 etckeeper/ 519
36.3 使用 etckeeper/ 519
第37章 Gistore/ 520
37.1 Gistore 的安装/ 520
37.1.1 软件依赖/ 520
37.1.2 从源码安装 Gistore/ 521
37.1.3 用 easy_install 安装/ 521
37.2 Gistore 的使用/ 522
37.2.1 创建并初始化备份库/ 522
37.2.2 Gistore 的配置文件/ 523
37.2.3 Gistore 的备份项管理/ 524
37.2.4 执行备份任务/ 525
37.2.5 查看备份日志/ 525
37.2.6 查看及恢复备份数据/ 527
37.2.7 备份回滚及设置/ 528
37.2.8 注册备份任务别名/ 529
37.2.9 自动备份:crontab/ 529
37.3 Gistore 双机备份/ 529
第38章 补丁中的二进制文件/ 531
38.1 Git 版本库中二进制文件变更的支持/ 531
38.2 对非 Git 版本库中二进制文件变更的支持/ 535
38.3 其他工具对 Git 扩展补丁文件的支持/ 536
第39章 云存储/ 538
39.1 现有云存储的问题/ 538
39.2 Git 式云存储畅想/ 539
第8篇 Git杂谈
第40章 跨平台操作 Git/ 542
40.1 字符集问题/ 542
40.2 文件名大小写问题/ 543
40.3 换行符问题/ 545
第41章 Git 的其他特性/ 549
41.1 属性/ 549
41.1.1 属性定义/ 549
41.1.2 属性文件及优先级/ 550
41.1.3 常用属性介绍/ 552
41.2 钩子和模板/ 557
41.2.1 Git 钩子/ 557
41.2.2 Git 模板/ 562
41.3 稀疏检出和浅克隆/ 563
41.3.1 稀疏检出/ 563
41.3.2 浅克隆/ 566
41.4 嫁接和替换/ 568
41.4.1 提交嫁接/ 568
41.4.2 提交替换/ 568
41.5 Git 评注/ 570
41.5.1 评注的奥秘/ 570
41.5.2 评注相关命令/ 573
41.5.3 评注相关配置/ 574
第9篇 附录
附录A  Git 命令索引/ 576
A.1 常用的Git命令/ 576
A.2 对象库操作相关命令/ 578
A.3 引用操作相关命令/ 578
A.4 版本库管理相关命令/ 579
A.5 数据传输相关命令/ 579
A.6 邮件相关命令/ 580
A.7 协议相关命令/ 580
A.8 版本库转换和交互相关命令/ 581
A.9 合并相关的辅助命令/ 581
A.10 杂项/ 582
附录B Git 与 CVS 面对面/ 583
B.1 面对面访谈录/ 583
B.2 Git 和CVS 命令对照/ 585
附录C Git 与 SVN 面对面/ 587
C.1 面对面访谈录/ 587
C.2  Git 和SVN 命令对照/ 589
附录D Git 与 Hg 面对面/ 592
D.1 面对面访谈录/ 592
D.2 Git和Hg 命令对照/ 593

教学资源推荐
作者: (美)Martin Kalin
作者: 骆斌 主编 邵栋 任桐炜 编著
作者: [美] 约翰·戴维·斯通(John David Stone) 著
作者: 凌云 谢满德 陈志贤 吴海燕 编著
参考读物推荐
作者: 黄灯桥 徐会生 著
作者: (美)Xavier Pacheco
作者: 王亚刚 编著
作者: Charles Thomas Arrington, Syed H.Rayhan