1. 综感
    1. 小,快
      1. 小工具堆叠
      2. 好也晕
    2. 推荐
      1. Mercurial
      2. 有大工程实用
    3. 对比 Hg Bzr SVN perforce
      1. 便宜的本地分支
        1. 自由变迁
        2. 改进行为
          1. Topic
          2. Topic
          3. Topic
          4. Topic
          5. Topic
      2. 所有內容都在本地端
        1. 真正的離線工作
      3. Git 很快
        1. 所有的操作都是在本地端
        2. 是用 C 寫的
        3. 速度对比
      4. Git 很小
        1. 空间占用是精心优化的
      5. 暫存區域
        1. index/staging area
        2. 模式0
        3. 模式1
      6. 是分布式的
        1. 每个人都可以是中心仓库
        2. 而且不会太慢!
      7. 適用任何工作流程
        1. SVN式
        2. 整合管理
        3. 司令官與副手
      8. 我們有 GitHub !
        1. http://github.com/
        2. 社交導向的
        3. 使用者導向
      9. 容易學習
        1. 这个,,,,
  2. 关于
    1. 内容:
      1. 阅读理解\GIT使用体会/Yubao.Liu@gmail.com
      2. 解析阅读\Why Git is Better than X
    2. 作者:Zoom.Quiet
    3. 工具:xMind 3
    4. 版本:
      1. 081205 创建
      2. 081211 继续P9~15
      3. 081212 all readed
    5. 存疑
      1. 全局版本图
        1. 可能根本无法获得实体
        2. 没有办法可以收集齐全版本
  3. 基本 概念
    1. file
    2. directory
      1. 文件名、目录名的集合
    3. version reversion
      1. 树 的 状 态
        1. 单向无循环图 (DAG)
      2. 非CVS中的单文件
    4. tag label
      1. 助记字串
      2. 静态标签(static tag)
      3. 浮动标签 (float tag)
      4. branch的分岐
        1. 版本线段
        2. 同标签中的版本集
        3. 可回溯到的版本集
  4. 术语
    1. blob
      1. 文件
      2. 数据+长度
    2. tree
      1. 目录
      2. 权限位
      3. 对象类型
      4. SHA1 摘要
      5. 名字
    3. commit
      1. 版本
    4. tag
      1. 静态标签
      2. 轻量级的
    5. 自称: stupid content tracker
      1. 关心的文件内容的流向
      2. 不显式记录复制、移动
      3. git文件
        1. 此路径曾经指代的文件内容变化
        2. 一个路径所牵涉到的历史
      4. log对比
        1. 操作:
          1. git/svn add a && commit && git/svn mv a b && commit
        2. git log
          1. a 会显示两次提交(一次新增,一次删除)
          2. b 会显示一次提交
        3. svn log
          1. a 会显示 a 没有纳入版本控制
          2. b 会显示两次提交
      5. 机制对比
        1. SVN从当前目录回溯出版本历史
        2. Git从当前版本过滤出当前目录的历史变化
    6. 引用 reference ref
      1. head
        1. .git/refs/heads
      2. tag
        1. .git/refs/tags
        2. 可以指向四种 object
          1. tree
          2. commit
          3. blob
      3. symbolic ref
        1. .git/ 目录下的符号链接
        2. 内容为 refs:refs/.... 的普通文件
        3. symbolic ref 跟 ref 重名时
          1. 要用 refs/heads/xxx 或者 heads/xxx
  5. 版本库
    1. .git 目录
      1. 用于保存全局版本演化图
        1. 子集
        2. 标签
      2. 同步
        1. pull = fetch + merge
    2. 注意
      1. head和tag ref
        1. 只作用同一仓库
      2. origin/master
        1. git clone 时自动建立分支
        2. fetch
        3. remote update
      3. 分支
        1. remote branch
          1. 同步对方库
          2. 不得提交
        2. tracking branch
          1. 无参数的 git pull
          2. 不建议提交
          3. 无 厘 头 !
        3. normal branch
        4. 理解
          1. branch head
          2. 各自在全局版本图上的 动态标签
  6. 对象 记法
    1. git help rev-parse
    2. commit-ish
      1. 版本号推导字串
        1. SHA1 摘要
        2. 含 ~ 和 ^ 记法的版本号
        3. 版本日期记法
        4. 标签对象的摘要
        5. 标签名字
        6. 分支名字
        7. 以及以上的组合
    3. tree-ish
      1. 目录版本推导字串
        1. 同上
    4. 运用
      1. 指定某个版本 的文件树中 的内容
        1. tree-ish:fullpath 语法
        2. v2.6.27:init/main.c
      2. 参数
        1. 没有用 -r REV 这样的方式
        2. 要在 file 参数前面添加“--”参数
      3. git log
        1. 参数是个 commit-ish
          1. 能够回溯到的所有版本
        2. 未必可以看到想看的
  7. 合并
    1. fast forward
      1. master 分支没有提交
      2. 修改head指向合并的分支
      3. KILLed 私有分支
        1. 从全局版本图角度 看不出私有分支轨迹
        2. 停止贡献就不再有新的痕迹
    2. svn log 式 直线分支历史
      1. log -g xxx
      2. log --first-parent
        1. 对fast forward的分支 失效
  8. 混乱之源 index
    1. git 文件 逻辑地点
      1. repository
        1. .git
          1. 各历史文件
      2. work tree
        1. 工作目录
          1. 仅有当前版本
      3. index
        1. 暂存修改
          1. 实际是链接到 .git/object
        2. cache ?
    2. 涉及功能
      1. git add
        1. 0. 加入index
        2. 1. 修订 work tree
        3. 2. 再add
        4. 3. 入repository
      2. git rm
        1. 从index+work tree 清除
        2. git rm --cached 只从 index 中删除文
      3. git commit
        1. 文件从index到repository
        2. git commit -a
          1. 0. work tree中修订的 add 到index
          2. 1. 从index提交到repository
      4. git checkout
        1. 0. repository 中指定版本的文件
        2. 1. 覆盖index+work tree 中文件
      5. git reset
        1. 0. 取repository 中的 commit 版本
        2. 1. 覆盖 index 中的对应文件
      6. git reset --hard
        1. 撤销 index 和 work tree 中的修改
      7. git checkout -- paths
        1. 从 index 取文件覆盖 work tree 中文件
      8. git checkout <tree-ish> -- paths
        1. 0. repository 中的 commit 版本
        2. 1. 覆盖index 以及 work tree 中文件
      9. git status
        1. Changes to be committed
          1. index 中的文件状态
          2. git commit 可将之加入repo.
          3. stage
          4. git add/rm
          5. unstage
          6. git rese
        2. Changed but not updated
          1. work tree 中的文件状态
          2. git add 可将之纳入 index
        3. untracked files
      10. git diff
        1. 面对多样的树 diff很丰富
        2. git diff
          1. 比较 index 和 work tre
        3. git diff --cached tree-ish
          1. 比较 index 和 tree-ish
        4. git diff tree-ish
          1. tree-ish 和 work tree
        5. git diff tree1-ish tree2-ish
          1. 比较两个 tree
          2. tree-ish
          3. 可以是文件树的一个部分
          4. git diff v2.6.21:init v2.6.27:init
  9. 工作 流程
    1. GIT 太灵活 太繁复
      1. 有多种流程在使用
    2. tip
      1. 不要往 不是自己手动建立的分支上 直接提交
        1. 处理分支
          1. cherry-pick
          2. rebase
        2. 建立本地仓库
          1. git remote update
          2. 得到 remote branch
          3. 建立 normal branch
          4. 提交时
          5. 0. 更新 remote branch
          6. 1. rebase normal branch
          7. 2. push/fetch 到上游
        3. 提供给他人跟踪的 分支 策略
          1. 0. 建立专用目录
          2. 1. 修订
          3. 2. 建立分支
          4. 3. 整理修订:
          5. git merge --squash
          6. git cherry-pick
          7. 不向自个儿的pub分支检入! 只是 git push
        4. 目的
          1. 只牵涉到三个分支
          2. 正式库里的上游分支
          3. 本地remote branch
          4. 本地工作分支
      2. 不要往 HEAD 指向的分支 push
        1. 会导致HEAD指向变化
        2. 纠正
          1. git reset --hard
          2. git reset && git checkout paths...
      3. 尽量不要 回滚公开分支
        1. 使他人从这个分支上 pull 造成麻烦
  10. 常用 命令
    1. 日用类
      1. add
        1. -i 选项支持细调
      2. rm
        1. 删除文件
      3. commit
        1. 提交一个新版本
      4. describe
        1. 将某 个版 本用最近的 tag 加上 ~ 和 ^ 记法来显示
      5. svn
        1. 与 Subversion 的双向交互
        2. 用 GIT 来当作更强更快的SVN客户端
      6. 观察
        1. cat-file
          1. 判断对象类型
          2. 原样或者格式化输出对象内容
          3. 对于tree
          4. ls-tree
          5. cat-file -p
          6. show
        2. grep
          1. 在指定版本的文件树里搜索包含特定模式的行
        3. diff
          1. 看文件内容修改情况
        4. blame
          1. 查看每一行是从哪个版本来的
        5. log
          1. 查看版本历史
        6. ls-files
          1. 显示 index 和 work tree 中的文件列表
          2. 常用于 Shell 编程
        7. shortlog
          1. 统计提交情况
        8. show-branch
          1. 显示各个分支的提交情况
        9. status
          1. 查看 index 和 work tree 中文件状态
      7. 分支
        1. apply
          1. 应用补丁
        2. checkout
          1. 切换分支
          2. 撤销修改
        3. fetch
          1. 从远端代码库同步版本图到本地代码库
          2. 修改本地库里指定的 head 同远程指向同
        4. push
          1. 与 fetch 功能类似
          2. 动作相反
        5. merge
          1. 分支合并
        6. mergetool
          1. 调用第三方合并工具合并
          2. kdiff3(最好的图形三路合并工具)
        7. pull
          1. 不推荐用这个命令
          2. pull = fetch + merge
        8. stash
          1. 暂存 index 和 work tree 的状态
          2. 稍候可以再恢复
      8. bisect
        1. 对半查找版本树中引入 bug 的版本
        2. 高效处理非线破碎的版本树
      9. mv
        1. 重命名、移动文件或者目录
        2. GIT 并不在版本库里记录此类操作
      10. reset
        1. 撤销 index 和 work tree 中未提交的修改
      11. revert
        1. 撤销已经提交的修改
    2. 协作类 Email
      1. format-patch
        1. 将分支上的修改生成补丁序列
      2. am
        1. 从邮箱里提取补丁并应用
      3. imap-send
      4. send-email
    3. 管理类
      1. 配置
        1. config
          1. 配置 git 的行为
          2. system 范围
          3. /etc/gitconfig
          4. global 范围
          5. $HOME/.gitconfig
          6. repository 范围
          7. .git/config
          8. 设置命令别名
          9. git config --global alias.b branch
      2. 仓库
        1. init
          1. 新建一个 GIT 版本库
        2. cherry-pick
          1. 将某次提交打个补丁应用到当前分支
          2. 从其它分支提取所需的修改
        3. clone
          1. 复制代码库
          2. --depth 选项可以避免复制代码库中包含的整个版本历史
          3. -s 用以在本地硬盘进行clone 时节省空间
        4. clean
          1. 删除工作目录中没有被 git 管理的文件
        5. rebase
          1. 将一个分支上的版本序列提取出来在另一个分支上重新提交一遍
          2. 保证上游分支历史是直线的
        6. remote
          1. 管理 remote branches
      3. 空间
        1. count-objects
          1. 统计 loose object 个数以及所占空间
        2. gc
          1. 节省磁盘空间
          2. loose object >>> packed object
        3. bundle
          1. 将指定版本的各种对象以及 refs 打包
          2. 用以进行 离线开发
        4. archive
          1. 打包指定版本文件树
          2. 支持 tar 和 zip 格式
  11. 模块 功能
    1. git module
    2. 比较复杂
    3. 不用为好,,,