新工作放在分支中, 出现问题可以随时搁置, 有空再回来继续

$ git branch sc/ruby_client master
	# 分支名称含有命名空间,比如 sc/ruby_client(其中 sc 是贡献该项工作的人名称的简写)
	# 创建分支同时切换到这个分支git checkout -b sc/ruby_client master

整合别人贡献的代码 - 来自邮件的

# 使用 apply 命令应用补丁
$ git apply /tmp/patch-ruby-client.patch
# 使用--check 预检查
$ git apply --check 0001-seeing-if-this-helps-the-gem.patch

整合别人贡献的代码 - 来自Git format-patch 生成的

# git am
$ git am 0001-limit-log-function.patch

# 有文件冲突时
$ (fix the file) # 处理冲突
$ git add ticgit.gemspec # 再次整合
$ git am --resolved

# 其它解决冲突的姿势
$ git am -3 0001-seeing-if-this-helps-the-gem.patch
	# -3 三方合并, 某个提交以来某个提交的情况
$ git am -3 -i mbox
	# -i 合并多个时, 会挨个询问

获取远程分支(贡献者Fork 后并更新过的代码库)

$ git remote add jessica git://github.com/jessica/myproject.git
$ git fetch jessica
$ git checkout -b rubyclient jessica/ruby-client

# 直接抓取, 不保存远程库
$ git pull <https://github.com/onetimeguy/project>

检查跟master 分支有什么不同(进行了哪些更新)

# 查看分支contrib 的commit 历史, 如果master 中已存在, 则忽略
$ git log contrib --not master
	# 可以加上-p 选项, 会在每个commit 历史上显示diff

# 找到共同的祖先然后显示之后的不同
$ git merge-base contrib master
	# 假设输出 36c7dba2c95e6bbb78dfa822519ecfec6e1ca649
$ git diff 36c7db 
# 简写语法 ... 三个点语法
$ git diff master...contrib # 显示两个分支合并后的所有diff

大项目合并分支的姿势

长期分支和短期分支

所有分支都从master 开始

短期分支ok 后合并入长期分支

长期分支与master 合并

不分长短, 选中一个变基(滑稽)

然后让master Fast-Forward

处理冲突可选工具(进行大量的合并或变基,或维护一个长期的特性分支)

# Rerere 是“重用已记录的冲突解决方案(reuse recorded resolution)”的意思——它是一种简化冲突解决的方法。
$ git config --global rerere.enabled true
# 使用 git rerere 命令。 当单独调用它时,Git 会检查解决方案数据库,尝试寻找一个和当前任一冲突相关的匹配项并解决冲突(尽管当 rerere.enabled 被设置为 true 时会自动进行)

为一次发布打标签

$ git tag -s v1.5 -m 'my signed 1.5 tag'

# 分发时用来签名的PGP 公钥
$ gpg --list-keys # key 列表
$ gpg -a --export F721C45A | git hash-object -w --stdin
	# 导出 key 并通过管道传递给 git hash-object 来直接将 key 导入到 Git 的数据库中
$ git tag -a maintainer-pgp-pub 659ef797d181633c87ec71ac3f9ba29fe5775b92
	# 既然 Git 中已经包含你的 key 的内容了,你就可以通过指定由 hash-object 命令给出的新 SHA-1 值来创建一个直接指向它的标签
$ git show maintainer-pgp-pub | gpg --import
	# 人们可以使用这个 key 来校验所有由你签名的标签
	# 需要校验标签的人可以通过从数据库中直接拉取 blob 对象并导入到 GPG 中来导入 PGP key

生成一个构建号(版本号)

$ git describe master
v1.6.2-rc1-20-g8c5b85c 
	# 由最近的标签名、自该标签之后的提交数目和你所描述的提交的部分 SHA-1 值构成
	# git describe 只适用于有注解的标签(即使用 -a 或 -s 选项创建的标签)
	# 为了确保能为标签生成合适的名称,打发布标签时都应该采用加注解的方式

发布一个版本(构建)

$ git archive master --prefix='project/' | gzip > `git describe master`.tar.gz
	# 创建一个最新快照的.tar.gz 格式的压缩包
$ git archive master --prefix='project/' --format=zip > `git describe master`.zip
	# zip 格式的压缩包

发布简报

# 基本山就是合并commit 的描述信息(所以描述要有规范啊 XD)
$ git shortlog --no-merges master --not v1.0.1

访问权限控制列表(ACL)系统(使用脚本根据文件内容控制用户权限)

Git 仓库的 acl 文件中
某些用户具有全部的访问权,其他人只对某些子目录或者特定的文件具有推送权限

# 内容例子:
avail|nickh,pjhyett,defunkt,tpw # 这些人权限大
avail|usinclair,cdickens,ebronte|doc # 这些人只能玩doc 目录
avail|schacon|lib # 这个人只能玩lib
avail|schacon|tests # 只能玩tests, 如果脚本遍历权限时拒绝超出权限的操作
	# 脚本基本上就是匹配用户名称与目录名称