分支
分支分类
- master: 存储了正式发布的历史,为主分支(保护分支),不能直接在 master 上进行修改代码和提交;
- develop:作为功能的集成分支,开发完成需要提交测试的功能合并到该分支;
- feature: 大家根据不同需求创建独立的功能分支,开发完成后合并到 develop 分支;
- release: 发布分支,主要用于测试或修复 bug。
- fix: 为 bug 修复分支,需要根据实际情况对已发布的版本进行漏洞修复,必须从 master 拉取;

分支命名
功能分支: featrue/功能名称
发布分支:release/版本号-功能名称-发布日期
维护分支:fix/版本号-问题概述或 issueid-日期 (最好使用 issue 建立问题描述?)
分支管理策略
develop 为集成开发分支
自己分支自测完毕; review 通过再合并;
本地分支管理
- 本地分支要做到勤提交,分小功能提交;
- 本地分支 merge 到 develop 分支时(rebase ? ),必须先 merge develop 到本地分支,自测通过再提交;
开发者相同版本尽量不要修改相同功能,提前划分或协商清楚;
如果修改代码涉及多人功能,提交完毕请及时告知相关人员;
开发者每天更新 develop 分支内容到本地分支,避免大规模 merge(?);
fixbug 分支修改测试完,立即合并到 develop 上
提交相关
关于提交 git commit message
详细内容格式
1 | <type>(<scope>): <subject> |
使用
git commit -m 'XXX'时,输入的’XXX’其实是<type>(<scope>): <subject>的部分
type
type 在 commit 的是否必须存在。
- feat: 添加新特性
- fix: 修复 bug
- docs: 仅仅修改了文档
- style: 仅仅修改了空格、格式缩进、逗号等等,不改变代码逻辑
- refactor: 代码重构,没有加新功能或者修复 bug
- perf: 优化相关,比如提升性能、体验
- test: 增加测试用例
- chore: 改变构建流程、或者增加依赖库、工具等
- revert: 回滚到上一个版本
scope
scope:【可选】用于说明 commit 的影响范围
subjec
subject:commit 的简要说明,尽量简短
Body
对本次 commit 的详细描述,可分多行
Footer
不兼容变动:需要描述相关信息
如果当前代码与上一个版本不兼容,则 Footer 部分以BREAKING CHANGE开头,后面是对变动的描述、以及变动理由和迁移方法。
1 | BREAKING CHANGE: 隔离作用域绑定定义已更改。 |
关闭 Issue
- 关联 Issue(Issue #1, #2, #3)
- 关闭 Issue(Close #1, #2, #3)
1 | Closes #234 |
可用 github 关闭 issue,或者与自己的任务相关联
Commitizen 使用方法
全局安装
1 | npm install -g commitizen |
然后,在项目目录里,运行下面的命令,使其支持 Angular 的 Commit message 格式。
1 | $ commitizen init cz-conventional-changelog --save --save-exact |
以后,凡是用到git commit命令,一律改为使用git cz。这时,就会出现选项,用来生成符合格式的 Commit message。
规范提交信息
cz-conventional-changelog
1 | npm install cz-conventional-changelog -D |
生成 change log
conventional-changelog-cli 通过提交记录生成 CHANGELOG.md
https://github.com/conventional-changelog-archived-repos/conventional-changelog-cli
安装
1 | npm install -g conventional-changelog-cli |
生成 change log
1 | conventional-changelog -p angular -i CHANGELOG.md -s |
通过以上命令你就会发现在项目中多了个CHANGELOG.md文件,表示生成 Change log 成功了。
生成的文档包括以下部分
- New features
- Bug fixes
- Breaking changes.
查看分支图
1 | git log --graph --oneline --decorate |
提交关键词搜索
1 | git log --grep keywords |
合并代码
git merge
将一个分支合并到当前分支
1 | git merge dev |
git pull = git fetch + git merge
1
2
3
4
5
6
7 > git fetch orgin master //将远程仓库的master分支下载到本地当前branch中
>
> git log -p master ..origin/master //比较本地的master分支和origin/master分支的差别
>
> git merge origin/master //进行合并
>
>

git rebase
变基,改变当前分支的基点
1 | git rebase dev |
git pull —rebase = git fetch + git rebase
在 mywork 分支上 rebase,将基点从 C2 改为 C4,在 C4 后添加 C5’ C6’(即:C5 C6 的拷贝节点,与 C5 C6 不是一个节点但内容保留)

移除 C5 C6 节点

追后结果

综上 rebase 是对一个分支做“变基”操作,这意味着改变这个分支的 base commit。它会在新的 base 上一个一个地运行这个分支上的所有 commits.
rebase 冲突
- rebase 过程中也会出现冲突 解决冲突后,使用
git add .添加,然后执⾏git rebase --continue。接下来 Git 会继续应⽤用余下的补丁。
- 任何时候都可以通过如下命令终⽌止 rebase,分⽀支会恢复到 rebase 开始前的状态
git rebase --abort
注意:
不要 rebase 一个已经在远程库中已经存在的分支,只能 rebase 你自己使用的私有分支。

rebase 远程分支在提交将导致历史混乱,并且 merge 后存在多个完全相同修改记录
其他操作
合并多个 commit 为一个完整 commit

1 | git rebase -i [startpoint] [endpoint] |
-i的意思是--interactive,即弹出交互式的界面让用户编辑完成合并操作.
[startpoint] [endpoint]则指定了一个编辑区间,如果不指定[endpoint],则该区间的终点默认是当前分支HEAD所指向的commit。
pick:保留该 commit(缩写:p)
reword:保留该 commit,但我需要修改该 commit 的注释(缩写:r)
edit:保留该 commit, 但我要停下来修改该提交(不仅仅修改注释)(缩写:e)
squash:将该 commit 和前一个 commit 合并(缩写:s)
fixup:将该 commit 和前一个 commit 合并,但我不要保留该提交的注释信息(缩写:f)
exec:执行 shell 命令(缩写:x)
drop:我要丢弃该 commit(缩写:d)
将某一段 commit 粘贴到另一个分支上

将 develop 分支中的 C~E 部分复制到 master 分支中,这时我们就可以通过 rebase 命令(如果只是复制某一两个提交到其他分支,建议使用更简单的命令:git cherry-pick)
1 | git rebase [startpoint] [endpoint] --onto [branchName] |
[startpoint] [endpoint]仍然和上一个命令一样指定了一个编辑区间(前开后闭),--onto的意思是要将该指定的提交复制到哪个分支上。

此时 HEAD 所指向的内容正是我们所需要的,但是 master 分支是没有任何变化的,git只是将 C~E 部分的提交内容复制一份粘贴到了 master 所指向的提交后面,我们需要做的就是将 master 所指向的提交 id 设置为当前 HEAD 所指向的提交 id 就可以了
1 | git checkout master |
git 打 tag
tag 对应某次 commit, 是一个点,是不可移动的。
branch 对应一系列 commit,是很多点连成的一根线,有一个 HEAD 指针,是可以依靠 HEAD 指针移动的。
所以,两者的区别决定了使用方式,改动代码用 branch ,不改动只查看用 tag。
1 | git tag <tagName> // 创建本地tag |
git alias
查看已有别名
1 | git config --global --list |
编辑别名
1 | git config --global --edit |
🌰:
1 | [alias] |