2011-02-24

《Got Git》完稿

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
blog comments powered by Disqus