规范明确, 清晰, 一致的 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
, 把对应的bugfix
merge
到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`` 安装 |