git是一个开源的分布式版本控制系统
存放版本控制信息的地方,也就是.git文件夹
按照角色分类:本地仓库、远程仓库
仓库都是分布式独立的完整的个体,远程仓库只是相对于本地仓库而言,实际上他们存在形式是一样的。
存储了包括:本地分支、远程分支(从远程仓库fetch/clone而来)、提交记录等
远程仓库只是相对本地仓库而言,提供了fetch、clone、push、pull(fetch+merge,merge部分只是把本地分支跟本地的远程分支进行合并,并没有与远程仓库进行交互)四个命令与本地仓库进行数据交互。
主分支,最为稳定功能比较完整的随时可发布的代码,即代码开发完成,经过测试,没有明显的bug,才能合并到 master 中。请注意永远不要在 master 分支上直接开发和提交代码,以确保 master 上的代码一直可用;
开发主分支,用作平时开发的主分支,并一直存在,永远是功能最新最全的分支,包含所有要发布 到下一个 release 的代码,主要用于合并其他分支,比如 feature 分支; 如果修改代码,新建 feature 分支修改完再合并到 develop 分支。所有的 feature、release 分支都是从 develop 分支上拉的。
develop跟master形成了逻辑意义上的双主模式,它们不是完全同步的,master是随时可以用于发布,而develop是可以在master还在发布过程中进行继续开发,达到发布不影响开发的效果。
功能开发分支,这个分支主要是用来开发新的功能,一旦开发完成,通过测试没问题(这个测试,测试新功能没问题),我们合并回develop 分支进入下一个 release 。
发布分支,用于发布准备的专门分支。当开发进行到一定程度,或者说快到了既定的发布日,可以发布时,建立一个 release 分支并指定版本号(可以在 finish 的时候添加)。开发人员可以对 release 分支上的代码进行集中测试和修改bug。(这个测试,测试新功能与已有的功能是否有冲突,兼容性)全部完成经过测试没有问题后,将 release 分支上的代码合并到 master 分支和 develop 分支。
补丁分支,用于修复线上代码的bug。**从 master 分支上拉。**完成 hotfix 后,打上 tag 我们合并回 master 和 develop 分支。
所有开发分支从 develop 分支拉。
所有 hotfix 分支从 master 拉。
所有在 master 上的提交都必要要有 tag,方便回滚。
只要有合并到 master 分支的操作,都需要和 develop 分支合并下,保证同步。
master 和 develop 分支是主要分支,主要分支每种类型只能有一个,派生分支每个类型可以同时存 在多个。
git flow 的工作方式
默认会初始化 master develop 两个主干分支。如果已有了不同分支,初始化的时候,可能需要手动指定 master 分支 跟 develop 分支。
分支的名称都是以 feature/*-20170323 打头,不需要做修改
基于develop分支,可以有多个特征分支进行开发
feature分支做完后,必须合并回develop 分支,合并完分支后一般会删除这个 feature 分支(也就是 finish 一般由测试进行,或者经过测试允许),也可以视情况保留
分支名称以 release/*-20170323 打头
release分支基于develop创建; 一旦创建了release分支,不能在从 develop 分支合并新的改动到 release 分支,可以基于release分支进行测试和bug修改,测试不用在另外创建用于测试的分支。
release 发布的时候,合并到 master 和 develop 分支,同时打tag,视情况删除release分支,通常应该删除掉
分支名称以 hotfix/* 开头
hotfix 分支基于 master 分支创建,开发完毕后合并到 master 和 develop 分支,同时创建 tag
这是唯一可以直接从 master 分支 fork出来的分支。
commit
提交,把工作区暂存区(已经添加跟踪)的文件的增删改提交到本地仓库的某个分支
push
把本地仓库的某个分支推送到远程的某个分支,一般建议推送到跟本地仓库的分支名字相同的远程仓库的分支
fetch
从远程仓库的某个分支获取代码到本地仓库的远程仓库信息区;
merge
把已经获取到本地仓库中的远程仓库信息区的某个分支跟本地仓库中的某个分支进行合并。
pull
拉取,等于fetch+merge两个操作;
revert
恢复,把修改的代码还原成本地仓库中最新的。
reset
重置,把修改的代码还原成本地仓库中某个版本的。
rebase
把多次的更新或者提交合并成一次,让提交次数更少。
tag
创建标签,重大版本记录。
clone
克隆,从远程仓库克隆代码下来。
rebase:把多次本地commit,折叠成一次commit,这样就可以把多次commit合并成一个push到远程
reset:原理就是放弃工作区和index的改动,同时HEAD指针指向前一个commit对象 撤销上一次的提交: git reset --hard HEAD~1
revert:git revert 这条命令会把指定的提交的所有修改回滚,并同时生成一个新的提交。