规范明确, 清晰, 一致的 Git 分支管理, 可以帮助在多人协作时更加和谐.
每个人对工具的使用往往各有偏好, 各种方法各有利弊, 无所谓对错. 但涉及团队协作的方面需要有一些一致的规范, 遵守一致的规范也能提升大家的效率.

除了一致性之外,这个规范的目的是以下几点:
- 确保可以轻易确定特定时间发布或运行的版本. 在新发布的程序存在重大缺陷时, 可以尽快 
rollback到上一个稳定版本. - 在需要修复紧急 
bug并尽快发布时, 可以只发布必要的bugfix而不同时发布还不应发布的其他改动. 
Git 分支管理使用规范
branch 和 tag
每个项目的
repo都应该含有且仅有以下的branch和tag
Branch: master 和 release, 其中 master 对应目前的开发分支, 所有的 pull request 都应该发到这个分支. release 是当前发布的分支,在这个分支只能增加从 master cherrypick 过来的 commit.
Tag: 对应每个发布版本的 tag, SDK 和应用程序的 tag 应该遵照 <major>.<minor>.<patch> 的命名风格,如 2.5.1;服务端程序的 tag 以发布的日期命名, 如 2014.11.13, bugfix 的 tag 应该遵从 <major>.<minor>.<patch>-bugfix 的风格, 如果 tag 已经存在, 则可以使用在后面添加小写字母的方式延续, 例如 2.5.2-bugfix 后面就是 2.5.2-bugfix-a.
在一个
repo中只应该有以上说的branch和tag, 在开发过程中使用到的feature branch等请都放在个人的fork, 一律通过向master发pull request的方式给repo提交代码。
新版本发布流程
- 确保所有要发布的 
pull request都已经merge到master; - 使用 
master branch的代码进行测试, 如果发现bug, 把对应的bugfixmerge到master; - 删除旧的 
release branch, 并从当前的master创建新的release branch; - 发布完成后在当前的 
release branch打上对应版本的tag. 
Bugfix 流程
这里的 bugfix 指的是修复已经发布的程序(release branch)中的缺陷. master 里的 bug 请直接 merge bugfix 到 master.
- 如果此缺陷在 
master中还存在,请先merge bugfix到master, 否则跳到下一步; - 在 
release branch从master cherrypick修复该缺陷的一个或多个commit; - 发布完成后在当前的 
release branch打上tag. 
并不是每个
bug都有专门发布bugfix版的必要, 对于不紧急的bug, 可以在master里修复后随下一个版本发布
Git 常用命令收集
撤销本次 Merge
开发过程中, 多多少少总会出现在版本快要上线准备提交代码时, 某个功能延后或剔除的情况, 无奈只能将本次的 merge 撤销掉.
快进合并下和修复完冲突的 Merge 撤销
找到最后一次提交到 master 分支的版本号,即 merge 前的版本号, 并直接回滚
1  | $ git reset --hard (merge 前的 commit id)  | 
含有冲突的情况下 Merge 撤销
1  | $ git reset --merge  | 
Git 更新单个指定文件
在 Laravel/Lumen 项目中, 有的时候我们会通过 composer 增加新的扩展包, 在版本发布的时候就需要先更新 composer.json 和 composer.lock 两个文件, 然后执行 composer install 确保服务不会因为缺少扩展包出错.
如果想拿远端 git 服务器上的最新版本 (或某个特定版本) 覆盖本地的修改, 可以使用 git pull 命令, 但这会 全面更新本地代码库和工作拷贝; 想放弃本地工作拷贝所做修改, 可以使用 git checkout file/to/path 命令, 但该命令只能用本地库覆盖你的工作拷贝, 并不能取得远端版本的更新.
正确的做法应该是先更新本地库 (但不更新工作拷贝), 然后用本地库来更新单个的工作拷贝文件
1  | $ git fetch  | 
git log 乱码问题解决

1  | # 在环境变量中增加如下参数  | 
git summary 使用
git summary 可以查看所有贡献者对项目的贡献程度
1  | # 这个命令默认没有,在mac下需要通过 ``brew install git-extras`` 安装  |