
蒋鑫,国内顶尖的版本控制专家和咨询顾问之一,对Subversion和Git等版本控制工具有十分深入的研究,参与了Git以及Gitosis、Gitolite、Repo、Topgit、Gistore等与Git相关的开源软件的开发或创建,在大量实践中积累了丰富的经验。此外,他还是一位开源软件实践者,作为北京群英汇信息技术有限公司的创始人兼高级顾问,一直从事开源软件的定制以及面向研发团队的项目管理软件的推广和顾问咨询工作,致力于推动开源软件在中国的发展。本书官网:http://www.ossxp.com/doc/gotgit/作者博客:http://blog.ossxp.com/作者微博:http://weibo.com/gotgit/本书微群:http://q.weibo.com/567527本书豆瓣小组:http://www.douban.com/group/gotgit/
《Git权威指南》是Git领域的集大成之作,是一本关于Git的百科全书,在广度、深度和实战性上让同类作品望尘莫及。作者是国内顶尖的版本控制专家和咨询顾问之一,本书得到了Git官方维护者Junio C Hamano和ITeye创始人范凯(Robbin)先生等数位专家的高度认可和极力推荐,权威性毋庸置疑。全书一共9篇,共41章和4个附录,内容几乎涵盖了Git的所有方面。第1篇介绍了版本控制工具的演变历史、Git的各种优点,以及它在3种主流操作系统中的安装与配置。第2篇和第3篇既是本书的基础,又是本书的核心,不仅介绍了Git的操作和使用,而且还讲解了Git的原理。第2篇详细讲解了个人用户如何使用Git,包括Git初始化、日常操作、暂存区、对象、重置、检出、恢复进度、历史变更、克隆、库管理等;第3篇详细讲解了Git协议和团队如何使用Git,包括Git支持的协议、冲突解决、里程碑、分支、远程版本库和补丁文件交互等。第4篇全面介绍了Git的协同模型,即它在实际工作中的使用模式,包括各种经典的Git协同模型、Topgit协同模型、子模组协同模型、子树合并、Android多版本库协同、Git与SVN协同模型等。第5篇介绍了Git服务器的架设,首先讲解了HTTP协议、Git协议、SSH协议的使用,然后讲解了Gitolite、Gitosis、Gerrit等服务器的架设方法,最后还讲解了Git版本库的托管。第6篇介绍了版本库的迁移,包括如何从CVS、SVN、Hg等版本库迁移到Git,以及Git版本库整理等方面的内容。第7篇讲解了Git的其他应用,包括etckeeper、Gistore等的安装、配置和使用,以及补丁中的二进制文件和云存储等内容。第8篇介绍了Git的跨平台操作,以及它的钩子和模板、稀疏检出和浅克隆、嫁接和替换等重要特性。第9篇是附录,详细给出了Git的命令索引,以及CVS、SVN和Hg与Git的比较与命令对照,方便读者查阅。
前 言第1篇 初识Git第1章 版本控制的前世和今生/ 21.1 黑暗的史前时代/ 21.2 CVS—开启版本控制大爆发/ 51.3 SVN—集中式版本控制集大成者/ 71.4 Git—Linus 的第二个伟大作品/ 9第2章 爱上 Git 的理由/ 112.1 每日工作备份/ 112.2 异地协同工作/ 122.3 现场版本控制/ 132.4 避免引入辅助目录/ 152.5 重写提交说明/ 152.6 想吃后悔药/ 162.7 更好用的提交列表/ 172.8 更好的差异比较/ 182.9 工作进度保存/ 182.10 代理SVN提交实现移动式办公/ 192.11 无处不在的分页器/ 202.12 快/ 21第3章 Git的安装和使用/ 223.1 在Linux 下安装和使用 Git/ 223.1.1 包管理器方式安装/ 223.1.2 从源代码进行安装/ 233.1.3 从Git版本库进行安装/ 233.1.4 命令补齐/ 253.1.5 中文支持/ 253.2 在Mac OS X 下安装和使用 Git/ 263.2.1 以二进制发布包的方式安装/ 263.2.2 安装 Xcode/ 273.2.3 使用 Homebrew 安装 Git/ 293.2.4 从Git源码进行安装/ 293.2.5 命令补齐/ 303.2.6 其他辅助工具的安装/ 303.2.7 中文支持/ 313.3 在Windows 下安装和使用 Git(Cygwin篇)/ 313.3.1 安装 Cygwin/ 323.3.2 安装 Git/ 363.3.3 Cygwin 的配置和使用/ 373.3.4 Cygwin 下 Git 的中文支持/ 403.3.5 Cygwin 下 Git 访问 SSH 服务/ 413.4 Windows 下安装和使用 Git(msysGit篇)/ 453.4.1 安装 msysGit/ 463.4.2 msysGit 的配置和使用/ 483.4.3 msysGit中shell环境的中文支持/ 493.4.4 msysGit中Git的中文支持/ 503.4.5 使用 SSH 协议/ 513.4.6 TortoiseGit 的安装和使用/ 523.4.7 TortoiseGit 的中文支持/ 55第2篇 Git独奏第4章 Git 初始化/ 584.1 创建版本库及第一次提交/ 584.2 思考:为什么工作区根目录下有一个 .git 目录/ 604.3 思考:git config 命令的各参数有何区别/ 634.4 思考:是谁完成的提交/ 654.5 思考:随意设置提交者姓名,是否太不安全/ 674.6 思考:命令别名是干什么的/ 684.7 备份本章的工作成果/ 69第5章 Git 暂存区/ 705.1 修改不能直接提交吗/ 705.2 理解 Git 暂存区(stage)/ 765.3 Git Diff 魔法/ 785.4 不要使用 git commit -a/ 815.5 搁置问题,暂存状态/ 82第6章 Git对象/ 836.1 Git对象库探秘/ 836.2 思考:SHA1 哈希值到底是什么,是如何生成的/ 886.3 思考:为什么不用顺序的数字来表示提交/ 90第7章 Git 重置/ 937.1 分支游标master探秘/ 937.2 用 reflog 挽救错误的重置/ 957.3 深入了解git reset命令/ 96第8章 Git 检出/ 998.1 HEAD 的重置即检出/ 998.2 挽救分离头指针/ 1028.3 深入了解 git checkout 命令/ 103第9章 恢复进度/ 1059.1 继续暂存区未完成的实践/ 1059.2 使用 git stash/ 1089.3 探秘 git stash/ 109第10章 Git 基本操作/ 11410.1 先来合个影/ 11410.2 删除文件/ 11410.2.1 本地删除不是真的删除/ 11510.2.2 执行 git rm 命令删除文件/ 11610.2.3 命令git add -u快速标记删除/ 11710.3 恢复删除的文件/ 11810.4 移动文件/ 11910.5 一个显示版本号的 Hello World/ 12010.6 使用 git add -i 选择性添加/ 12210.7 Hello World 引发的新问题/ 12410.8 文件忽略/ 12510.9 文件归档/ 129第11章 历史穿梭/ 13011.1 图形工具:gitk/ 13011.2 图形工具:gitg/ 13111.3 图形工具:qgit/ 13511.4 命令行工具/ 14011.4.1 版本表示法:git rev-parse/ 14111.4.2 版本范围表示法:git rev-list/ 14411.4.3 浏览日志:git log/ 14611.4.4 差异比较:git diff/ 15011.4.5 文件追溯:git blame/ 15111.4.6 二分查找:git bisect/ 15211.4.7 获取历史版本/ 156第12章 改变历史/ 15712.1 悔棋/ 15712.2 多步悔棋/ 15912.3 回到未来/ 16112.3.1 时间旅行一/ 16212.3.2 时间旅行二/ 16712.3.3 时间旅行三/ 17112.4 丢弃历史/ 17412.5 反转提交/ 177第13章 Git 克隆/ 17913.1 鸡蛋不装在一个篮子里/ 17913.2 对等工作区/ 18013.3 克隆生成裸版本库/ 18313.4 创建生成裸版本库/ 184第14章 Git库管理/ 18714.1 对象和引用哪里去了/ 18714.2 暂存区操作引入的临时对象/ 18914.3 重置操作引入的对象/ 19114.4 Git管家:git-gc/ 19314.5 Git管家的自动执行/ 196第3篇 Git和声第15章 Git协议与工作协同/ 20015.1 Git 支持的协议/ 20015.2 多用户协同的本地模拟/ 20215.3 强制非快进式推送/ 20315.4 合并后推送/ 20715.5 禁止非快进式推送/ 208第16章 冲突解决/ 21016.1 拉回操作中的合并/ 21016.2 合并一:自动合并/ 21216.2.1 修改不同的文件/ 21216.2.2 修改相同文件的不同区域/ 21416.2.3 同时更改文件名和文件内容/ 21516.3 合并二:逻辑冲突/ 21716.4 合并三:冲突解决/ 21816.4.1 手工编辑完成冲突解决/ 22116.4.2 图形工具完成冲突解决/ 22116.5 合并四:树冲突/ 22516.5.1 手工操作解决树冲突/ 22716.5.2 交互式解决树冲突/ 22816.6 合并策略/ 23016.7 合并相关的设置/ 231第17章 Git 里程碑/ 23317.1 显示里程碑/ 23417.2 创建里程碑/ 23617.2.1 轻量级里程碑/ 23717.2.2 带说明的里程碑/ 23817.2.3 带签名的里程碑/ 23917.3 删除里程碑/ 24217.4 不要随意更改里程碑/ 24317.5 共享里程碑/ 24317.6 删除远程版本库的里程碑/ 24617.7 里程碑命名规范/ 247第18章 Git 分支/ 25318.1 代码管理之殇/ 25318.1.1 发布分支/ 25318.1.2 特性分支/ 25618.1.3 卖主分支/ 25718.2 分支命令概述/ 25818.3 “Hello World”开发计划/ 25918.4 基于特性分支的开发/ 26018.4.1 创建分支 user1/getopt/ 26118.4.2 创建分支 user2/i18n/ 26218.4.3 开发者 user1 完成功能开发/ 26318.4.4 将 user1/getopt 分支合并到主线/ 26418.5 基于发布分支的开发/ 26518.5.1 创建发布分支/ 26618.5.2 开发者 user1 工作在发布分支/ 26718.5.3 开发者 user2 工作在发布分支/ 26818.5.4 开发者 user2 合并推送/ 27018.5.5 发布分支的提交合并到主线/ 27118.6 分支变基/ 27518.6.1 完成 user2/i18n 特性分支的开发/ 27518.6.2 分支 user2/i18n 变基/ 277第19章 远程版本库/ 28419.1 远程分支/ 28419.2 分支追踪/ 28719.3 远程版本库/ 29019.4 PUSH 和 PULL 操作与远程版本库/ 29219.5 里程碑和远程版本库/ 29419.6 分支和里程碑的安全性/ 294第20章 补丁文件交互/ 29620.1 创建补丁/ 29620.2 应用补丁/ 29720.3 StGit 和 Quilt/ 30020.3.1 StGit/ 30020.3.2 Quilt/ 304第4篇 Git协同模型第21章 经典Git协同模型/ 30821.1 集中式协同模型/ 30821.1.1 传统集中式协同模型/ 30921.1.2 Gerrit 特殊的集中式协同模型/ 31021.2 金字塔式协同模型/ 31121.2.1 贡献者开放只读版本库/ 31221.2.2 以补丁方式贡献代码/ 313第22章 Topgit 协同模型/ 31422.1 作者版本控制系统的三个里程碑/ 31422.2 Topgit 原理/ 31622.3 Topgit 的安装/ 31722.4 Topgit 的使用/ 31922.5 用Topgit方式改造Topgit/ 33022.6 Topgit 使用中的注意事项/ 334第23章 子模组协同模型/ 33623.1 创建子模组/ 33623.2 克隆带子模组的版本库/ 33923.3 在子模组中修改和子模组的更新/ 34023.4 隐性子模组/ 34323.5 子模组的管理问题/ 345第24章 子树合并/ 34724.1 引入外部版本库/ 34724.2 子目录方式合并外部版本库/ 34924.3 利用子树合并跟踪上游改动/ 35124.4 子树拆分/ 35324.5 git-subtree 插件/ 353第25章 Android 式多版本库协同/ 35625.1 关于 repo/ 35725.2 安装 repo/ 35725.3 repo和清单库的初始化/ 35925.4 清单库和清单文件/ 36025.5 同步项目/ 36125.6 建立 Android 代码库本地镜像/ 36325.7 repo 的命令集/ 36525.8 repo 命令的工作流/ 37025.9 好东西不能 Android 独享/ 37125.9.1 repo+Gerrit 模式/ 37125.9.2 repo 无审核模式/ 37125.9.3 改进的 repo 无审核模式/ 372第26章 Git 和 SVN 协同模型/ 37826.1 使用 git-svn 的一般流程/ 38026.2 git-svn 的奥秘/ 38626.2.1 Git 库配置文件的扩展及分支映射/ 38726.2.2 Git工作分支和 Subversion 如何对应/ 38826.2.3 其他辅助文件/ 39026.3 多样的 git-svn 克隆模式/ 39026.4 共享 git-svn 的克隆库/ 39326.5 git-svn 的局限/ 394第5篇 搭建Git服务器第27章 使用 HTTP 协议/ 39827.1 哑传输协议/ 39827.2 智能 HTTP 协议/ 40027.3 Gitweb 服务器/ 40127.3.1 Gitweb的安装/ 40227.3.2 Gitweb的配置/ 40327.3.3 版本库的 Gitweb 相关设置/ 40427.3.4 即时Gitweb服务/ 405第28章 使用 Git 协议/ 40628.1 Git 协议语法格式/ 40628.2 Git 服务软件/ 40628.3 以 inetd 方式配置运行/ 40628.4 以 runit 方式配置运行/ 407第29章 使用 SSH 协议/ 40929.1 SSH 协议语法格式/ 40929.2 服务架设方式比较/ 40929.3 关于 SSH 公钥认证/ 41129.4 关于 SSH 主机别名/ 411第30章 Gitolite 服务架设/ 41330.1 安装Gitolite/ 41430.1.1 服务器端创建专用账号/ 41430.1.2 Gitolite 的安装/升级/ 41530.1.3 关于 SSH 主机别名/ 41730.1.4 其他的安装方法/ 41830.2 管理 Gitolite/ 41930.2.1 管理员克隆 gitolite-admin 管理库/ 41930.2.2 增加新用户/ 42030.2.3 更改授权/ 42230.3 Gitolite 授权详解/ 42330.3.1 授权文件的基本语法/ 42330.3.2 定义用户组和版本库组/ 42430.3.3 版本库ACL/ 42430.3.4 Gitolite 授权机制/ 42630.4 版本库授权案例/ 42730.4.1 对整个版本库进行授权/ 42730.4.2 通配符版本库的授权/ 42830.4.3 用户自己的版本库空间/ 42930.4.4 对引用的授权:传统模式/ 43030.4.5 对引用的授权:扩展模式/ 43030.4.6 对引用的授权:禁用规则的使用/ 43130.4.7 用户分支/ 43130.4.8 对路径的写授权/ 43230.5 创建新版本库/ 43230.5.1 在配置文件中出现的版本库,即时生成/ 43330.5.2 通配符版本库,管理员通过推送创建/ 43430.5.3 直接在服务器端创建/ 43530.6 对 Gitolite 的改进/ 43530.7 Gitolite 功能拓展/ 43630.7.1 版本库镜像/ 43630.7.2 Gitweb 和 Git daemon 支持/ 43830.7.3 其他功能拓展和参考/ 439第31章 Gitosis 服务架设/ 44131.1 安装 Gitosis/ 44231.1.1 Gitosis 的安装/ 44231.1.2 服务器端创建专用账号/ 44231.1.3 Gitosis 服务初始化/ 44331.2 管理 Gitosis/ 44331.2.1 管理员克隆 gitolit-admin 管理库/ 44331.2.2 增加新用户/ 44431.2.3 更改授权/ 44631.3 Gitosis 授权详解/ 44731.3.1 Gitosis 默认设置/ 44731.3.2 管理版本库 gitosis-admin/ 44731.3.3 定义用户组和授权/ 44831.3.4 Gitweb 整合/ 44931.4 创建新版本库/ 44931.5 轻量级管理的 Git 服务/ 450第32章 Gerrit 代码审核服务器/ 45232.1 Gerrit 的实现原理/ 45232.2 架设 Gerrit 的服务器/ 45632.3 Gerrit 的配置文件/ 46132.4 Gerrit 的数据库访问/ 46232.5 立即注册为 Gerrit 管理员/ 46432.6 管理员访问 SSH 的管理接口/ 46732.7 创建新项目/ 46832.8 从已有的 Git 库创建项目/ 47232.9 定义评审工作流/ 47332.10 Gerrit 评审工作流实战/ 47732.10.1 开发者在本地版本库中工作/ 47732.10.2 开发者向审核服务器提交/ 47832.10.3 审核评审任务/ 47832.10.4 评审任务没有通过测试/ 48032.10.5 重新提交新的补丁集/ 48232.10.6 新修订集通过评审/ 48332.10.7 从远程版本库更新/ 48532.11 更多 Gerrit 参考/ 486第33章 Git 版本库托管/ 48733.1 Github/ 48733.2 Gitorious/ 489第6篇 迁移到Git第34章 CVS版本库到Git的迁移/ 49234.1 安装cvs2svn(含 cvs2git)/ 49234.1.1 Linux下cvs2svn的安装/ 49234.1.2 Mac OS X 下 cvs2svn 的安装/ 49334.2 版本库转换的准备工作/ 49434.2.1 版本库转换注意事项/ 49434.2.2 文件名乱码问题/ 49434.2.3 提交说明乱码问题/ 49434.3 版本库转换/ 49634.3.1 配置文件解说/ 49634.3.2 运行cvs2git完成转换/ 50034.4 迁移后的版本库检查/ 501第35章 更多版本控制系统的迁移/ 50235.1 SVN版本库到Git的迁移/ 50235.2 Hg 版本库到Git的迁移/ 50335.3 通用版本库迁移/ 50535.4 Git 版本库整理/ 51135.4.1 环境变量过滤器/ 51335.4.2 树过滤器/ 51335.4.3 暂存区过滤器/ 51335.4.4 父节点过滤器/ 51435.4.5 提交说明过滤器/ 51435.4.6 提交过滤器/ 51535.4.7 里程碑名字过滤器/ 51635.4.8 子目录过滤器/ 516第7篇 Git的其他应用第36章 etckeeper/ 51836.1 安装 etckeeper/ 51836.2 配置 etckeeper/ 51936.3 使用 etckeeper/ 519第37章 Gistore/ 52037.1 Gistore 的安装/ 52037.1.1 软件依赖/ 52037.1.2 从源码安装 Gistore/ 52137.1.3 用 easy_install 安装/ 52137.2 Gistore 的使用/ 52237.2.1 创建并初始化备份库/ 52237.2.2 Gistore 的配置文件/ 52337.2.3 Gistore 的备份项管理/ 52437.2.4 执行备份任务/ 52537.2.5 查看备份日志/ 52537.2.6 查看及恢复备份数据/ 52737.2.7 备份回滚及设置/ 52837.2.8 注册备份任务别名/ 52937.2.9 自动备份:crontab/ 52937.3 Gistore 双机备份/ 529第38章 补丁中的二进制文件/ 53138.1 Git 版本库中二进制文件变更的支持/ 53138.2 对非 Git 版本库中二进制文件变更的支持/ 53538.3 其他工具对 Git 扩展补丁文件的支持/ 536第39章 云存储/ 53839.1 现有云存储的问题/ 53839.2 Git 式云存储畅想/ 539第8篇 Git杂谈第40章 跨平台操作 Git/ 54240.1 字符集问题/ 54240.2 文件名大小写问题/ 54340.3 换行符问题/ 545第41章 Git 的其他特性/ 54941.1 属性/ 54941.1.1 属性定义/ 54941.1.2 属性文件及优先级/ 55041.1.3 常用属性介绍/ 55241.2 钩子和模板/ 55741.2.1 Git 钩子/ 55741.2.2 Git 模板/ 56241.3 稀疏检出和浅克隆/ 56341.3.1 稀疏检出/ 56341.3.2 浅克隆/ 56641.4 嫁接和替换/ 56841.4.1 提交嫁接/ 56841.4.2 提交替换/ 56841.5 Git 评注/ 57041.5.1 评注的奥秘/ 57041.5.2 评注相关命令/ 57341.5.3 评注相关配置/ 574第9篇 附录附录A Git 命令索引/ 576A.1 常用的Git命令/ 576A.2 对象库操作相关命令/ 578A.3 引用操作相关命令/ 578A.4 版本库管理相关命令/ 579A.5 数据传输相关命令/ 579A.6 邮件相关命令/ 580A.7 协议相关命令/ 580A.8 版本库转换和交互相关命令/ 581A.9 合并相关的辅助命令/ 581A.10 杂项/ 582附录B Git 与 CVS 面对面/ 583B.1 面对面访谈录/ 583B.2 Git 和CVS 命令对照/ 585附录C Git 与 SVN 面对面/ 587C.1 面对面访谈录/ 587C.2 Git 和SVN 命令对照/ 589附录D Git 与 Hg 面对面/ 592D.1 面对面访谈录/ 592D.2 Git和Hg 命令对照/ 593
评论关闭。