2011-02-24
2011/2/22,当我把第8篇文稿发给编辑后,长长的舒了一口气,这真是一个漫长的旅程。
写一本关于Git的书的想法始于2010年9月,在给客户做了Git培训后,发现还有很多想法难以浓缩在区区几百页的PPT中,为什么不把它扩展成一本书呢?
如果当初知道写一本书需要花这么久,真不知道能不能够坚持下来。感谢家人的支持,感谢华章出版社编辑们的鼓励和辛苦的工作,感谢我的朋友们和客户为本书初稿提出宝贵的修改意见。
关于这本书的名字,我很长时间决定不下来,曾经一度把本书的名字叫做《Got Git》,因为这样我就不用太费力的校正很多人对 Git 错误的发音。不过出版社从商业角度上决定采用《Git权威指南》这个让我倍感压力的名字。不管怎样,名字只是名字,重要的还是内容本身。
把全书的目录(不包含前言和附录)摘录如下,目录中的页码来自Word稿件,正式排版后会压缩至80%。
目录
第 1 篇: 初识Git
第1章 版本控制的前世和今生.... 1
1.1 黑暗的史前时代... 1
1.2 CVS —— 开启版本控制大爆发... 4
1.3 SVN —— 集中式版本控制集大成者... 6
1.4 Git —— Linus 的第二个伟大作品... 9
第2章 爱上 Git 的理由.... 11
2.1 每日的工作备份... 11
2.2 异地协同工作... 12
2.3 现场版本控制... 13
2.4 避免引入辅助目录... 15
2.5 重写提交说明... 16
2.6 想吃后悔药... 16
2.7 更好用的提交列表... 17
2.8 更好的差异比较... 18
2.9 工作进度保存... 19
2.10 代理SVN提交实现移动式办公... 20
2.11 无处不在的分页器... 20
2.12 快... 21
第3章 安装Git.. 23
3.1 Linux 下安装和使用 Git.. 23
3.1.1 包管理器方式安装... 23
3.1.2 从源代码开始安装... 24
3.1.3 从Git版本库进行安装... 25
3.1.4 命令补齐... 26
3.1.5 中文支持... 26
3.2 Mac OS X 下安装和使用 Git.. 28
3.2.1 以二进制发布包的形式安装... 28
3.2.2 安装 Xcode. 29
3.2.3 使用 Homebrew 安装 Git 30
3.2.4 从Git源码进行安装... 31
3.2.5 命令自动补齐... 32
3.2.6 其他辅助工具的安装... 32
3.2.7 中文支持... 33
3.3 Windows 下安装和使用 Git(Cygwin篇)... 33
3.3.1 安装 Cygwin. 34
3.3.2 安装 Git 40
3.3.3 Cygwin 的配置和使用... 42
3.3.4 Cygwin 下 Git 的中文支持... 44
3.3.5 Cygwin 下 Git 访问 SSH 服务... 45
3.4 Windows 下安装和使用 Git(msysGit篇)... 51
3.4.1 安装 msysGit 51
3.4.2 msysGit 的配置和使用... 54
3.4.3 msysGit shell 环境的中文支持... 55
3.4.4 msysGit 中 Git 的中文支持... 57
3.4.5 使用 SSH 协议... 58
3.4.6 TortoiseGit 的安装和使用... 58
3.4.7 TortoiseGit 的中文支持... 62
第 2 篇:Git独奏
第4章 Git 初始化.... 63
4.1 创建版本库及第一次提交... 63
4.2 思考:为什么工作区下有一个 .git 目录?... 66
4.3 思考:git config 命令参数的区别?... 69
4.4 思考:是谁完成的提交?... 71
4.5 思考:随意设置提交者姓名,是否太不安全?... 73
4.6 思考:命令别名是干什么的?... 75
4.7 备份本章的工作成果... 76
第5章 Git 暂存区.... 77
5.1 修改不能直接提交?... 77
5.2 理解 Git 暂存区(stage)... 83
5.3 Git Diff 魔法... 86
5.4 不要使用 git commit -a.. 90
5.5 搁置问题,暂存状态... 90
第6章 Git对象.... 92
6.1 Git对象库探秘... 92
6.2 问题:SHA1 哈希值到底是什么,如何生成的?... 98
6.3 问题:为什么不用顺序的数字来表示提交?... 100
第7章 Git 重置.... 103
7.1 分支游标 master 的探秘... 103
7.2 用 reflog 挽救错误的重置... 105
7.3 深入了解 git reset 命令... 107
第8章 Git 检出.... 110
8.1 HEAD 的重置即检出... 110
8.2 挽救分离头指针... 113
8.3 深入了解 git checkout 命令... 114
第9章 恢复进度.... 117
9.1 继续暂存区未完成的实践... 117
9.2 使用 git stash.. 120
9.3 探秘 git stash.. 121
第10章 Git 基本操作.... 128
10.1 先来合个影... 128
10.2 删除文件... 128
10.2.1 本地删除不是真的删除... 129
10.2.2 执行 git rm 命令删除文件... 130
10.2.3 命令 git add -u 快速标记删除... 131
10.3 恢复删除的文件... 132
10.4 移动文件... 133
10.5 一个显示版本号的 Hello World.. 135
10.6 使用 git add -i 选择性添加... 137
10.7 Hello world 引发的新问题... 140
10.8 文件忽略... 141
第11章 历史穿梭.... 146
11.1 图形工具:gitk.. 146
11.2 图形工具:gitg. 147
11.3 图形工具:qgit.. 153
11.4 命令行工具... 158
11.4.1 版本表示法:git rev-parse. 160
11.4.2 版本范围表示法:git rev-list 163
11.4.3 浏览日志:git log. 166
11.4.4 差异比较:git diff 170
11.4.5 文件追溯:git blame. 171
11.4.6 二分查找:git bisect 172
11.4.7 获取历史版本... 177
第12章 改变历史.... 178
12.1 悔棋... 178
12.2 多步悔棋... 181
12.3 回到未来... 182
12.3.1 时间旅行一... 184
12.3.2 时间旅行二... 189
12.3.3 时间旅行三... 194
12.4 丢弃历史... 198
12.5 反转提交... 200
第13章 Git 克隆.... 203
13.1 鸡蛋不装在一个篮子里... 203
13.2 对等工作区... 204
13.3 克隆生成裸版本库... 208
13.4 创建生成裸版本库... 209
第14章 Git库管理.... 213
14.1 对象和引用哪里去了?... 213
14.2 暂存区操作引入的临时对象... 215
14.3 重置操作引入的对象... 217
14.4 Git管家:git-gc. 219
14.5 Git管家的自动执行... 223
第 3 篇:Git和声
第15章 Git协议与工作协同.... 225
15.1 Git 支持的协议... 225
15.2 多用户协同的本地模拟... 227
15.3 强制非快进式推送... 229
15.4 合并后推送... 233
15.5 禁止非快进式推送... 234
第16章 冲突解决.... 236
16.1 拉回操作中的合并... 236
16.2 合并一:自动合并... 238
16.2.1 修改不同的文件... 238
16.2.2 修改相同文件的不同区域... 241
16.2.3 同时更改文件名和文件内容... 242
16.3 合并二:逻辑冲突... 244
16.4 合并三:冲突解决... 245
16.4.1 手工编辑完成冲突解决... 248
16.4.2 图形工具完成冲突解决... 249
16.5 合并四:树冲突... 254
16.5.1 手工操作解决树冲突... 256
16.5.2 交互式解决树冲突... 257
16.6 合并策略... 259
16.7 合并相关的设置... 260
第17章 Git 里程碑.... 263
17.1 显示里程碑... 264
17.2 创建里程碑... 266
17.2.1 轻量级里程碑... 267
17.2.2 带说明的里程碑... 268
17.2.3 带签名的里程碑... 270
17.3 删除里程碑... 273
17.4 不要随意更改里程碑... 274
17.5 共享里程碑... 274
17.6 删除远程版本库的里程碑... 278
17.7 里程碑命名规范... 278
第18章 Git 分支.... 285
18.1 代码管理之殇... 285
18.1.1 发布分支... 286
18.1.2 特性分支... 288
18.1.3 卖主分支... 290
18.2 分支命令概述... 291
18.3 Hello World 开发计划... 291
18.4 基于特性分支的开发... 293
18.4.1 创建分支 user1/getopt 293
18.4.2 创建分支 user2/i18n. 295
18.4.3 开发者 user1 完成功能开发... 296
18.4.4 将 user1/getopt 分支合并到主线... 298
18.5 基于发布分支的开发... 299
18.5.1 创建发布分支... 299
18.5.2 开发者 user1 工作在发布分支... 301
18.5.3 开发者 user2 工作在发布分支... 302
18.5.4 开发者 user2 合并推送... 303
18.5.5 发布分支的提交合并到主线... 305
18.6 分支变基... 309
18.6.1 完成 user2/i18n 特性分支的开发... 309
18.6.2 分支 user2/i18n 变基... 311
第19章 远程版本库.... 320
19.1 远程分支... 320
19.2 分支追踪... 323
19.3 远程版本库... 326
19.4 PUSH 和 PULL 操作与远程版本库... 329
19.5 里程碑和远程版本库... 331
19.6 分支和里程碑的安全性... 331
第20章 补丁文件交互.... 333
20.1 创建补丁... 333
20.2 应用补丁... 335
20.3 StGit 和 Quilt.. 337
20.3.1 StGit 337
20.3.2 Quilt 341
第 4 篇:Git协同模型
第21章 经典Git协同模型.... 343
21.1 集中式协同模型... 343
21.1.1 使用集中式协同模型... 345
21.1.2 Gerrit 特殊的集中式协同模型... 346
21.2 金字塔式协同模型... 347
21.2.1 贡献者开放只读版本库... 348
21.2.2 以补丁方式贡献代码... 349
第22章 Topgit 协同模型.... 351
22.1 作者版本控制系统的三个里程碑... 351
22.2 Topgit 原理... 353
22.3 Topgit 的安装... 354
22.4 Topgit 的使用... 355
22.4.1 tg help 命令... 355
22.4.2 tg create 命令... 355
22.4.3 tg info 命令... 357
22.4.4 tg update 命令... 358
22.4.5 tg summary 命令... 360
22.4.6 tg remote 命令... 362
22.4.7 tg push 命令... 364
22.4.8 tg depend 命令... 364
22.4.9 tg base 命令... 365
22.4.10 tg delete 命令... 365
22.4.11 tg patch 命令... 365
22.4.12 tg export 命令... 365
22.4.13 tg import 命令... 366
22.4.14 tg log 命令... 366
22.4.15 tg mail 命令... 366
22.4.16 tg graph 命令... 367
22.5 Topgit hacks. 367
22.6 Topgit 使用中的注意事项... 372
第23章 子模组协同模型.... 374
23.1 创建子模组... 374
23.2 克隆带子模组的版本库... 377
23.3 在子模组中修改和子模组的更新... 378
23.4 隐性子模组... 381
23.5 子模组的管理问题... 384
第24章 子树合并.... 386
24.1 引入外部版本库... 386
24.2 子目录方式合并外部版本库... 388
24.3 利用子树合并跟踪上游改动... 391
24.4 子树拆分... 392
24.5 git subtree 插件... 392
24.5.1 git subtree add. 393
24.5.2 git subtree merge. 393
24.5.3 git subtree pull 393
24.5.4 git subtree split 394
24.5.5 git subtree push. 394
第25章 Android 式多版本库协同.... 395
25.1 关于 repo.. 396
25.2 安装 repo.. 397
25.3 repo 和清单库的初始化... 398
25.4 清单库和清单文件... 400
25.5 同步项目... 401
25.6 建立 android 代码库本地镜像... 402
25.7 Repo 的命令集... 405
25.7.1 repo init 命令... 405
25.7.2 repo sync 命令... 406
25.7.3 repo start 命令... 406
25.7.4 repo status 命令... 406
25.7.5 repo checkout 命令... 407
25.7.6 repo branches 命令... 407
25.7.7 repo diff 命令... 408
25.7.8 repo stage 命令... 408
25.7.9 repo upload 命令... 409
25.7.10 repo download 命令... 410
25.7.11 repo rebase 命令... 410
25.7.12 repo prune 命令... 411
25.7.13 repo abandon 命令... 411
25.7.14 其他命令... 411
25.8 Repo 命令的工作流... 412
25.9 好东西不能 android 独享... 412
25.9.1 Repo + Gerrit 模式... 412
25.9.2 Repo 无审核模式... 413
25.9.3 改进的 Repo 无审核模式... 414
第26章 Git 和 SVN 协同模型.... 421
26.1 使用 git-svn 的一般流程... 423
26.2 git-svn 的奥秘... 430
26.2.1 Git 库配置文件的扩展及分支映射... 430
26.2.2 Git 工作分支和 Subversion 如何对应?... 432
26.2.3 其他辅助文件... 434
26.3 多样的 git-svn 克隆模式... 434
26.4 共享 git-svn 的克隆库... 437
26.5 git-svn 的局限... 439
第 5 篇:搭建Git服务器
第27章 使用 HTTP 协议.... 440
27.1 哑传输协议... 440
27.2 智能 HTTP 协议... 443
27.3 Gitweb 服务器... 445
27.3.1 Gitweb 安装... 445
27.3.2 Gitweb 配置... 446
27.3.3 版本库的 Gitweb 相关设置... 447
第28章 使用 Git 协议.... 449
28.1 Git 协议语法格式... 449
28.2 Git 服务软件... 449
28.3 以 inetd 方式配置运行... 449
28.4 以 runit 方式配置运行... 450
第29章 使用 SSH 协议.... 452
29.1 SSH 协议语法格式... 452
29.2 服务架设方式比较... 452
29.3 关于 SSH 公钥认证... 454
29.4 关于 SSH 主机别名... 455
第30章 Gitolite 服务架设.... 457
30.1 安装 Gitolite. 458
30.1.1 服务器端创建专用帐号... 458
30.1.2 Gitolite 的安装/升级... 459
30.1.3 关于 SSH 主机别名... 462
30.1.4 其他的安装方法... 463
30.2 管理 Gitolite. 464
30.2.1 管理员克隆 gitolite-admin 管理库... 464
30.2.2 增加新用户... 465
30.2.3 更改授权... 467
30.3 Gitolite 授权详解... 468
30.3.1 授权文件的基本语法... 468
30.3.2 定义用户组和版本库组... 469
30.3.3 版本库ACL. 470
30.3.4 Gitolite 授权机制... 472
30.4 版本库授权案例... 473
30.4.1 对整个版本库进行授权... 473
30.4.2 通配符版本库的授权... 474
30.4.3 用户自己的版本库空间... 475
30.4.4 对引用的授权:传统模式... 476
30.4.5 对引用的授权:扩展模式... 477
30.4.6 对引用的授权:禁用规则的使用... 478
30.4.7 用户分支... 478
30.4.8 对路径的写授权... 479
30.5 创建新版本库... 479
30.5.1 在配置文件中出现的版本库,即时生成... 480
30.5.2 通配符版本库,管理员通过推送创建... 481
30.5.3 直接在服务器端创建... 482
30.6 对 Gitolite 的改进... 483
30.7 Gitolite 功能拓展... 483
30.7.1 版本库镜像... 483
30.7.2 Gitweb 和 Git daemon 支持... 486
30.7.3 其他功能拓展和参考... 487
第31章 Gitosis 服务架设.... 489
31.1 安装 Gitosis. 490
31.1.1 Gitosis 的安装... 490
31.1.2 服务器端创建专用帐号... 491
31.1.3 Gitosis 服务初始化... 491
31.2 管理 Gitosis. 492
31.2.1 管理员克隆 gitolit-admin 管理库... 492
31.2.2 增加新用户... 493
31.2.3 更改授权... 494
31.3 Gitosis 授权详解... 495
31.3.1 Gitosis 默认设置... 495
31.3.2 管理版本库 gitosis-admin. 496
31.3.3 定义用户组和授权... 496
31.3.4 Gitweb 整合... 498
31.4 创建新版本库... 498
31.5 轻量级管理的 Git 服务... 499
第32章 Gerrit 代码审核服务器.... 501
32.1 Gerrit 的实现原理... 502
32.2 架设 Gerrit 的服务器... 506
32.3 Gerrit 的配置文件... 512
32.4 Gerrit 的数据库访问... 513
32.5 立即注册为 Gerrit 管理员... 515
32.6 管理员访问 SSH 的管理接口... 518
32.7 创建新项目... 520
32.8 从已有的 Git 库创建项目... 524
32.9 定义评审工作流... 526
32.10 Gerrit 评审工作流实战... 529
32.10.1 开发者在本地版本库中工作... 530
32.10.2 开发者向审核服务器提交... 531
32.10.3 审核评审任务... 531
32.10.4 评审任务没有通过测试... 534
32.10.5 重新提交新的补丁集... 536
32.10.6 新修订集通过评审... 537
32.10.7 从远程版本库更新... 539
32.11 更多 Gerrit 参考... 540
第33章 Git 版本库托管.... 541
33.1 Github. 541
33.2 Gitorious. 543
第 6 篇:迁移到Git
第34章 CVS版本库到Git的迁移.... 545
34.1 安装 cvs2svn(含 cvs2git)... 546
34.1.1 Linux下cvs2svn的安装... 546
34.1.2 Mac OS X 下 cvs2svn 的安装... 547
34.2 版本库转换的准备工作... 547
34.2.1 版本库转换注意事项... 547
34.2.2 文件名乱码问题... 548
34.2.3 提交说明乱码问题... 548
34.3 版本库转换... 550
34.3.1 配置文件解说... 550
34.3.2 运行cvs2git完成转换... 554
34.4 迁移后的版本库检查... 555
第35章 更多版本控制系统的迁移.... 557
35.1 SVN版本库到Git的迁移... 557
35.2 Hg 版本库到Git的迁移... 558
35.3 通用版本库迁移... 561
35.4 Git 版本库整理... 567
35.4.1 环境变量过滤器... 569
35.4.2 树过滤器... 570
35.4.3 暂存区过滤器... 570
35.4.4 父节点过滤器... 570
35.4.5 提交说明过滤器... 571
35.4.6 提交过滤器... 571
35.4.7 里程碑名字过滤器... 573
35.4.8 子目录过滤器... 573
第 7 篇:Git的其他应用
第36章 etckeeper.. 574
36.2 安装 etckeeper. 575
36.3 配置 etckeeper. 575
36.4 使用 etckeeper. 576
第37章 Gistore. 577
37.1 Gistore 的安装... 577
37.1.1 从源码安装 Gistore. 577
37.1.2 用 easy_install 安装... 578
37.2 Gistore 的使用... 579
37.2.1 创建并初始化备份库... 580
37.2.2 Gistore 的配置文件... 580
37.2.3 Gistore 的备份项管理... 582
37.2.4 执行备份任务... 583
37.2.5 查看备份日志及数据... 583
37.2.6 查看及恢复备份数据... 585
37.2.7 备份回滚及设置... 586
37.2.8 注册备份任务别名... 588
37.2.9 自动备份:crontab. 588
37.3 Gistore 双机备份... 589
第38章 补丁中的二进制文件.... 590
38.1 Git 版本库中二进制文件变更的支持... 590
38.2 对非 Git 版本库中二进制文件变更的支持... 594
38.3 其他工具对 Git 扩展补丁文件的支持... 596
第39章 云存储.... 598
39.1 现有云存储的问题... 598
39.2 Git 式云存储畅想... 599
第 8 篇:Git杂谈
第40章 跨平台操作 Git.. 601
40.1 字符集问题... 602
40.2 文件名大小写问题... 603
40.3 换行符问题... 604
第41章 Git 的其他特性.... 609
41.1 属性... 609
41.1.1 属性定义... 609
41.1.2 属性文件及优先级... 610
41.1.3 常用属性介绍... 612
41.2 钩子和模板... 619
41.2.1 Git 钩子... 619
41.2.2 Git 模板... 625
41.3 稀疏检出和浅克隆... 626
41.3.1 稀疏检出... 626
41.3.2 浅克隆... 629
41.4 嫁接和替换... 631
41.4.1 提交嫁接... 631
41.4.2 提交替换... 632
41.5 Git 评注... 633
41.5.1 评注的奥秘... 634
41.5.2 评注相关命令... 637
41.5.3 评注相关配置... 638