2013年10月1日 星期二

[books] - Git 权威指南

1st edition: 20131001

Git 权威指南 (Git 權威指南) 89 rmb (534 nt)


  • 作者: 蒋鑫
  • 出版社: 机械工业出版社华章公司
  • 出版年: 2011-6
  • 页数: 595
  • 定价: 89.00 rmb
  • ISBN: 9787111349679
目录

前 言
第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

目錄長到嚇人, 你滾的手指痛了吧? 我篇幅倒是佔用的蠻過癮的 (我已經縮短了 2 倍)。不過每章的長度不長, 蠻容易閱讀。20120120 購於成大若水堂, 先來看看書底中國讀者的推薦:

徐继哲哲思社区 创始人
“目前市面上关于Git的书不在少数,但迄今为止, 国内外还没有一本书能在广度和深度上达到本书的水平, 也许在今后相当长的一段时间内也不会有。如果你是一位软件开发者, 强烈建议你学习并使用Git;如果你要学习Git,本书无疑是你最佳的选择。”

我停頓了一會兒, 心情覺得沉重, 台灣比你們還慘, 連一本繁體中文的 git 書籍都沒有; 所有人幾乎都要各顯神通, 自己從網路找尋片斷的學習資料, 有一本能看的就不錯了, 哪還有得挑, 否則我也不會找簡體中文的書看。不過簡體中文書籍有個問題, 味道很難聞, 這本書就是這樣, 我有時候得戴上口罩閱讀才行, 書價這麼高, 該用好點的品質來製作書籍, 一本實體書, 可不是只有內容可看, 裁切、排版、裝訂、封面, 有太多的面向可以欣賞一本實體書; 噢! 當然, 電子書就只剩下內容可看了。

不過購買此本書不久後, 台灣 o'reilly 在 2012/1/29 出了一本 - 版本控制使用 Git (目前已經有第二版), 我沒有槌心肝 (20120120 購入, 你看看才差幾天), 雖然我偏好繁體中文, 但這本簡體中文實在寫的不錯。我大概翻了一下版本控制使用 Git 的內容, 無法評論這兩本哪一本好, 個人覺得也寫得不錯。不過 Git 权威指南對我來說, 的確是一本很好的 git 學習書籍。

20130826 補充: 到現在好像也就這麼一本繁體中文 git 書籍。


git 不算是容易學習的軟體, 不要小看學習他的難度 (事實上 git 很難學), 網路片斷的資料實在難以讓人有個完整的學習。就算有完整電子書, 你能在螢幕上完整看完嗎? 印出來是個好方法, 但大多是 html 格式的電子書, 輸出紙張的效果可能不是很好 (pro git 中文版有 epub 格式, 是個好選擇)。我知道有人可以拼拼湊湊就把 git 學好, 我不是這樣的人, 我相信大多數人也需要一本好的書籍來學習 git, 速食主義實在荼毒我們太深, 希望本篇文章可以吸引你去找一本書來學習 git, 而不是在網路上尋找片面資料, 這是很難學好 git 的。

我在 2001 左右開始使用 rcs, 接著是 cvs, svn, svk, 但我遇上 git 則完全沒辦法適應, 之前的學習經驗都派不上用場, 沒有去看相關資料, 並不是那麼好上手, 所以我只勉勉強強的使用, 大部份還是使用 svn, 直到我看完本書才能上手。svk 則是有著恐怖的 perl depend package, 我只用了很短的時間, 便不再使用了。

我一直在找一本可以參考的 git 中文書籍, 買書閱讀某個知識一直是我的主要學習方式, 沒想到簡體中文書籍多的讓我驚訝, 我看了書名, 挑了這本。

台灣的工程師除了電腦的專業, 還要面對英文的專業, 一個擁有兩項專業的軟體工程師卻不見得能領到兩倍薪水 (其實有這樣的能力, 拿三倍薪水也不為過), 真是辛苦。若翻譯工業能幫上忙, 無疑是幫了軟體工程師一個大忙。工程師們也能努力在電腦專業上發展, 一個工業若總是要靠天才來支撐, 哪能成事, 讓翻譯工業來幫幫像我這樣的平凡人,我想學得是 git, 不是英文。

自從看完《CODE (编码 : 隐匿在计算机软硬件背后的语言)》之後, 閱讀簡體中文書籍沒在讓我那麼害怕, 就算有些字看不懂, 有些技術術語差異頗大, 但總能在一段時間之後習慣。而簡體中文在怎麼不習慣, 以我的英文程度, 還是遠遠勝過讀原文書籍。我每每在想, 要是因為語言的關係無法讀到某些經典之作, 實在是一大憾事。

不過這本不是翻譯書籍而是中國的電腦技術作家寫的, 也真讓台灣的我們夠羨慕的。就算可以勉強看懂簡體中文, 但總是不習慣其中的用語, 還是希望能有適合台灣讀者的技術書籍出現。要是我來出版簡體中文書籍繁體, 術語台灣化, 不知道有沒賺頭。

扯遠了, 閱讀技術書籍, 沉浸在電腦技術的茫茫大海中, 享受著在浮在沉的樂趣 (這算樂趣嗎?)

書中一開始提到 git 的發音, 讀作 "哥億特", 不過在 Tech Talk: Linus Torvalds on git: http://www.youtube.com/watch?v=4XpnKHJAok8 好像不是這樣發音阿?



我只剛看了前面幾章, 就已經覺得值回票價, 光是第一章的 diff, 就讓我興奮莫名, 我終於知道那些數字還有 +- 是什麼意思了。

--- a/a
+++ b/a
@@ -1,2 +1,2 @@
 123
-
+567

你對上述的 diff 感到迷惑嗎? 翻翻第一章的解釋, 保證精彩。Linus 就是以 diff, patch, tar 在 1991 ~ 2002 年間, 手動管理 linux source code, 這還真是不簡單。

接著談到版本管理工具的演進, rcs, cvs, svn ... 剛好我都用過, 讀來有著不少的回憶。本書把我想知道的 git 功能羅列出來, 這本書不算便宜, 而且還用膠膜封住, 我可是下了不少賭注, 還好沒讓我後悔, 這是一本可以用來學習 git 的書籍。目前中國亞馬遜有 kindle 的版本, 便宜不少, 還不用聞那難聞的墨水味道。

1.4 會大概介紹為什麼 Linus 會開發 git, 因為在 2002 ~ 2005, BitKeeper 不是用的好好的嗎?

第三章在說明如何安裝, 也許有人會覺得這是佔篇幅的一章, 不過對於 mac os, windows 的使用者還是有用的, 並介紹使用中文上的一些問題, 例如中文檔名, 中文的 log。在 windows 上, 我個人是偏好使用 cygwin/git, 不過速度真的是慢了點。linux 當然是 apt-get install git, 不過你有可能會裝到 gnu git 哦! 請小心。

學習 git 的心態最好是像螞蟻啃骨頭那樣, 一小口一小口扎實的把骨頭啃完, 需要一段不算短的時間。把在網上找資料的時間省下來, 只要花個 3~7 天, 看完 3 ~ 14 章, 應該就可以使用 git 了, 再花個 3~7 天, 看完 15 ~ 20 章, 就有足夠的知識來操作遠端 repository, 後面的章節自己決定要不要看。兩個禮拜 git 就上手, 還可接受啦 (開頭就說了, git 學習曲線很陡), 嫌太久, 嗯 ... 那看快點就是了。

我常看到網路上有些 git 的問題, 大部份都不是很難很進階的問題, 只要把上述章節看過, 就能理解, 真的不需要把時間花在 google 上, 而且得到的是似懂非懂的答案。

working tree, index, repository 的關係剪不斷、理還亂, 第五章在談 index, 相信可以讓你搞清楚這些關係, 對於使用 git 有相當程度的幫助, 不會再說 git 怎麼那麼難搞, 這可是 git 厲害的地方之一 (是的, 有之一)。

git reset HEAD         使用 master branch 的內容覆蓋 index
git rm --cached file   刪除 index file
git checkout -- file   使用 index 的內容覆蓋 working tree
git checkout HEAD .    使用 HEAD 指向的 master branch 的內容覆蓋 index 和 working tree

這幾個指令是不是常常困擾你呢?「好像是這樣又好像是那樣, 會不會把我還沒改的檔案蓋掉阿? 真擔心, 還是先存到別的目錄好了。」第五章可以先掃過一遍, 等有實際使用經驗, 再看一次, 相信就更能理解。

fig 1 git 指令示意圖


git术语解释staging,index,cache 解釋了 index, 配合 fig 1 參考應該有個大致上的理解。

descent@descent-u:t0$ git status -s
MM tt
都是和 index 相比, 有異動會列出 M

 M tt   working tree 和 index 相比
M  tt   repository 和 index 相比

你曾經注意過這個 M 的位置嗎?

' ' = unmodified
 M = modified
 A = added
 D = deleted
 R = renamed
 C = copied
 U = updated but unmerged

第六章在談 git object, 大概解釋一下 git 怎麼把檔案存起來, 存在哪, 雖然短短 10 頁, 卻很受用, 建議先讀過一遍略懂即可, 畢竟我們主要是操作 git, 不是要學怎麼做一個 git。不過介紹 head 和 master 的關係這部份就很重要 (p86)。

6.1 描述 commit, tree, blob 是什麼? 他們放在 .git/objects 的哪裡, 使用 git cat-file -p, git cat-file -t 來觀察這些 git objects。
6.2 會告訴我們 sha1 是怎麼計算出來的, 讀完這節, 你也可以自己算出這個 sha1。

7, 8 兩章在談 master/head 指來指去的問題, 我相信大多人都沒搞懂這是在指些什麼? 21 頁, 我看得輕鬆愉快, 相信你也可以。第七章介紹 reset, 第八章介紹 checkout, 在執行這兩個命令後, master/head 很容易會搞亂。

7.2 介紹了 reflog 這個指令, 可以在移動 master 時, 輕易回復 master 指到的位置。

7.3 介紹 git reset [--soft | --mixed | --hard] 你和我一樣總是搞亂嗎? reset 用來移動 master。

git reset 會改變 master 指向的位置, 並根據參數的不同有下面不同的影響:
--hard 
改變 master
用 commit 換掉 index
用 commit 換掉 working tree

--soft
改變 master
index, working tree 不動

--mixed
改變 master
用 commit 換掉 index
working tree 不動

呼, 多了一個 index, 複雜度就變高了。

git check -> 改變 head
git reset -> 改變 master

git checkout 有可能會處在斷頭模式 (detached HEAD state。呵, 我真喜歡這個恐怖的名詞), 在這裡所做的修改, 很有可能會消失, 在使用 git gc 時, 會檢查這部份的時間, 過期後這部份的 commit 都會被清掉, 而 git gc 在執行某些指令時, 會自動呼叫, 所以並不是沒有主動 git gc 就沒事, 請小心, 這是另一個你用 commit 進 repository 的東西有可能會消失的另一種情形。

10.5 (p120) 介紹了 describe, 搭配 tag, 可以用來紀錄軟體版本編號。也可參考 p553 (ident), p557 (export-ignore) 這兩個屬性。

第 12 章提供了兩個範例, 分別使用不同命令來完成這些需求。
12.3.1 reset, cherry-pick
12.3.2 rebase
12.3.3 交談式 rebase
第 6, 7, 8 章提到的東西要很清楚, 否則這章可能會看到頭昏, 不過不要緊, 就算不使用本章提到的功能, 也已經可以基本的使用 git。看不懂就先跳過。

經歷過 12.3.1 的 reset, cherry-pick 再來看看 rebase, 就比較清楚的了解 rebase 是在幹什麼。

假設現在有 a, b, c, d, e, f, 6 個 commit, 要移除 d, 可以這麼下 rebase:

git rebase --onto c d f

rebase 的語法之一:
git rebase --onto <newbase> <since> <till>
把 since (不包含 sinece) ~ till 放到 newbase 上。

這就是 12.3.2 的範例之一。

rebase 很複雜, 如果遇上 rebase conflict, 可能會害怕自己會不會搞砸 repository。
這篇介紹 rebase 用法: Git-rebase 小筆記
我認為要寫出這篇文章並不是容易的事, rebase 這概念還真不是很好描述出來。

第 13 章介紹 git clone, 告訴我們 bare 的 repository 和 non-bare repository 有什麼不同, 對 push/pull 的行為有什麼不同。這也是我曾經在網路看到的問題。在本章, 你會看到 git push repos/a.git master:master 這樣的指令。到了這裡, 基本上已經可以上手 git 了, 總共是 186 頁, 辛苦了。再把第 3 篇讀完吧, 還有 109 頁, 不難,這樣 git 應該已經可以用得得心應手。

想要真的把 repository 的東西砍掉嗎?傳說 check in 進版本控制的東西就不用擔心會不見, 只怕你找不到而已, git 提供了指令讓我們可以刪除 repository 的東西, 危險! 請勿亂用, 你真的會遺失東西。第 14 章在談這個。

第 14 章管理 git repository 基本上可先跳過, 這並不會影響使用 git, 當初我看的時候也是跳來跳去, 違反我從頭看到尾的原則。

第 16 章談到最令我們害怕的事情, merge conflict, 16.2 ~ 16.5 總共提了 4 個例子, 介紹 merge 這個指令。當然, 在真實世界裡, 會遇到比較複雜的 merge conflict, 這得靠自己想辦法。

git tag 也沒想像中的簡單, 看看第 17 章 git 里程碑。

第 18 章重頭戲 git branch, 很多人喜愛的功能, 也是 git 強大的地方之一, 得花點心思讀讀, 可能會需要前幾章的回憶, 相信你應該和我一樣, 已經忘光光了, 得回頭翻翻才是。

18.1, 18.1.1, 18.1.2, 18.1.3, 提供了開發模型, 如何使用 branch 來作 bug fixed, 新功能的開發, 有幾張圖示, 相信可以幫上不少忙, 我就是參照這章的說明來使用 branch, 就算是我一人在用 git, 也很方便。

第 19 章遠端版本庫也一樣重要, 這是分散式版本控制系統厲害的地方, 沒有這個, 那 git 就像 rcs 純個人使用了, 把之前的努力累積起來, 讀起來可能更加迷惑了, 但記得的部份已經足夠使用, 過陣子再來回味吧!

chapter 33 介紹 github, gitorious 這兩個 git 伺服器, 不算詳細, 所以作者在 http://www.worldhello.net/gotgithub/ 補上談 github 的書籍, clone 下來慢慢看吧!

第 6 篇的 34, 35 兩章在說明如何將 cvs, svn 遷移到 git, 在我使用 git 時, 我便把之前的 svn repository 轉移到 git。

附錄 A 有很用心的 git 指令索引, 指出在哪一頁哪個章節提到。

附錄 B, C, D 以對話的方式比較了 cvs, svn, hg 的優劣 (我覺得 git 是大獲全勝), 並附上 git 和 cvs, svn, hg 的指令對照表, 很有趣, 輕鬆一下學習 git 的心情。

這本書說實在很貴, 我認為其技術資料沒這麼高貴, 但他有效的幫我在短時間內學習 git, 花的錢不算白費。

你大概可以看出我花了很大心力在學 git, 因為我認為這是一個值得投資的軟體 (又跨平台, 這點很重要), 但我不希望重演 rcs, cvs, svn, git, ??? 的戲碼, 不僅浪費我的投資, 轉換各種 repository 可是很痛苦的。

以下是 Bitbucket 建立一個新的 repository 時給的命令:
cd /path/to/my/repo
git remote add origin ssh://git@bitbucket.org/dsung/a_prog.git
git push -u origin --all # pushes up the repo and its refs for the first time
git push -u origin --tags # pushes up any tags

這個 pdf 大約說明了 git 一些操作, 有些還算是蠻進階的議題。
http://ihower.tw/git/files/ihower-git.pdf

本書網站: http://www.worldhello.net/gotgit/

本書作者蒋鑫是版本控制系統的顧問, 專門幫企業導入版本控制系統, 難怪可以寫出這樣的內容, 從書中的內容能感覺到作者的專業。

這是 git 維護者濱野 純 (Junio C Hamano)在書背的推薦,
Junio C Hamano
  • “我是 Junio C Hamano,Git 的主要维护者。我当年写了一本针对日本读者的Git书, 当我把我签名的书送给Linus时,他对我说:“除了截图和命令行示例外, 什么也看不懂(Linus不懂日文)”。基于同样的原因,虽然我不能了解这本书的全貌, 但是我可以看出这本书涵盖了非常广泛的主题,并且看出蒋鑫对这本书的用心。 我非常高兴能够看到这本书的出版,感谢向世界传播Git。”
  • 八卦:同时向 Git 社区大佬 Junio 和 Linus 发送本书章节目录的翻译稿, 其中的翻译错误让人忍俊不住(感谢表妹和男友鹏辉)。 本书发行后,会同时给 Junio 和 Linus 邮寄一本签名版, 并争取“等价”交换一本他们的自传或图书。
濱野 純有關 git 的著作:
入門 Git by 濱野 純 (Junio C Hamano) (著)

除了本書, 還有其他有用的網路書籍可供學習 git, 可以參考 progit (簡體中文), 我下載 epub 格式到我的 sony-T1, 輕鬆閱讀中。本書作者蒋鑫也是由這本書開始學習 git。

解釋為什麼 rebase 一下比較好:
Keep a readable Git history
可是一想到 rebase 會遇到的 conflict 就令我害怕。

最後提一個 tig 工具, 這個可以用來輔助 git 命令列, 有時候我想 git add 一行, git add -e 可以辦到, 但是我一直不會用 git add -e, tig 很容易就解決我的問題。tig 用法請參考 ref 3。

ref:
  1. git 學習網站
  2. git internals (qrtt1 推薦)
  3. tig ── git 的命令列好夥伴
  4. 本書官網: http://www.worldhello.net/gotgit/

21天教你学会C++ (我也不知道為什麼會有這個連結)



這是我在某聚會分享的 5 分鐘 git 就上手 - 不可能, 說明 working tree, index, repository 的相關操作。主要不是 git 教學, 而是說明 git 很難學。



mission impossible 2 - 5 分鐘 git 就上手

HEAD, master branch
move master branch by reset
reflog
show "detached HEAD" by checkout command

modify commit log (HEAD commit, a specify commit) by git commit --amend

delete a commit
merge 2 commit to 1 commit
use git checkout/rebase/cherry-pick
use git rebase



這次沒有說明的很好, 我應該先解釋, working tree, index, branch, 還有 branch 指標, head, 以及 --soft, --hard 才是。

沒有留言:

張貼留言

使用 google 的 reCAPTCHA 驗證碼, 總算可以輕鬆留言了。

我實在受不了 spam 了, 又不想讓大家的眼睛花掉, 只好放棄匿名留言。這是沒辦法中的辦法了。留言的朋友需要有 google 帳號。