转http://wangyaqi.cn/2015/05/18/git/
分支类型 | 名称 | 永久 | 命名规范 | 来源 | 操作 | 合并到 | 角色 |
---|---|---|---|---|---|---|---|
master | 主干,正式环境 | Y | master | release,hotfix | 无 | 无 | 发布人员 |
develop | 开发分支,开发环境,测试环境 | Y | dev | 无 | 任意 | 无 | 开发人员 |
feature | 功能分支 | N | V2.3_ft_pay_lyx。V版本号__ft_功能说明_负责人 | dev | 任意 | dev | 开发人员 |
release | 版本发布分支 | N | V2.3_rl_20161111。V版本号__rl_版本日期 | dev | bugfix | dev | 发布人员,开发人员 |
hotfix | 补丁分支 | N | V2.2_hf_123456-332452_wyq。V版本号__hf_bug说明_负责人 | master | bugfix | dev | 发布人员,开发人员 |
精简模型的操作:
- hotfix无需另开分支,直接在master开发【否则还需部署一套环境】。合并操作同hotfix。
- 当前版本的feature无需另开分支,直接在dev开发。长期feature需开分支。
环境清单
- 每个环境都有一套:执行程序,数据库,配置
环境 | 对应分支 | 执行程序 | 数据库 | 设置 | 说明 |
---|---|---|---|---|---|
开发环境 | dev+feature | 开发人员自行搭建,独立 | 可复用测试数据库 | 可复用测试配置 | |
测试环境 | dev | 独立 | 独立 | 独立 | |
发布环境 | release或者hotfix | 独立 | 可复用测试数据库 | 独立 | |
正式环境 | master | 独立 | 独立 | 独立 |
使用
日常流程
初始化
- 从master克隆dev:git checkout master; git branch dev;
开发feature分支
- 从dev克隆feature:git checkout dev; git branch V2.3_ft_pay_lyx;
- 开发人员检出:git checkout V2.3_ft_pay_lyx;
- feature合并回dev:git checkout dev; git merge V2.3_ft_pay_lyx;
开发release分支
- 从dev克隆release:git checkout dev; git branch V2.3_rl_20161111;
- 开发人员检出:git checkout V2.3_rl_20161111;
- release合并回dev:
- release合并到master(是一个发布版本。同时需要打标签):
开发hotfix分支
- 从master克隆hotfix:git checkout master; git branch V2.2_hf_123456-332452_wyq;
- 开发人员检出:git checkout V2.2_hf_123456-332452_wyq;
- hotfix合并回master:
- hotfix合并到dev/release:
hotfix时,当有一个release分支同时存在(当前版本快发布了,却发现上个版本的bug)。这个hotfix分支必须被合并到release分支而不是dev分支(release后续会合并到dev)。
部署环境
- 获取代码(测试环境):git -C DIR checkout dev; git -C DIR pull;
- 部署
常用操作
选择提交的分支
按照以下顺序选择:
- release分支:bugfix(无bugfix分支的情况下),需尽快发布的小改动和功能
- dev分支:
- 下个版本 && 小改动
- 下个版本 && (新增功能 && 不修改原有逻辑)
- feature分支:到了测试和发布阶段再合并回dev分支
- !下个版本
- 下个版本 && 调整功能
- 下个版本 && (新增功能 && 修改原有逻辑)
暂存文件
- 工作区代码暂存,会记录来源分支
- 使用场景:有新工作要做(如bugfix)+ 当前工作区有不少修改了却无法提交的文件
- 暂存当前工作区,切换到新工作,恢复当前工作区
打补丁
- 跨分支代码迁移
- 使用场景:提交了代码到主分支+该功能代码需要先发布上线
- 在主分支上选择该功能对应的所有提交,创建成一个补丁,在发布分支上应用本补丁
取消本地没push的commit
- 重置到commit前的上一个版本,常用mixed
- soft:提交内容放在缓冲区(相当于git add了)
- mixed:提交内容不放在缓冲区(相当于改动后什么都没操作,git add后等于soft)
- hard:丢弃提交内容
pull时冲突处理
无commit(2种方法,推荐暂存)
暂存处理
- stash暂存改动
- pull最新的版本
- stash pop,手动解决冲突
冲突处理
- commit
- “有commit”的流程
有commit
- pull,手工解决冲突
- commit(解决冲突)merge版本
- push
冲突各方说明
方式 | 我的(LOCAL) | 他人(REMOTE) |
---|---|---|
暂存 | 本地文件 | 暂存 |
分支合并 | 目标分支(LOCAL) | 源分支(REMOTE, 被合并的) |
补丁 | 本地文件 | 补丁 |
代码合并
- Git – Fast Forward 和 no fast foward
- BASE是双方的父亲
- 冲突文件说明
<<<<<<< HEAD 我的 ======= 他人 >>>>>>>6853e5ff961e684d3a6c02d4d06183b5ff330dcc
仓库迁移
- https://www.jianshu.com/p/39d2263c69b1
重置目录
- git -C src fetch && git -C src reset –hard && git -C src checkout B1 && git -C src pull
- src是git目录路径,B1是分支或者标签。如是标签pull会失败,可忽略
信息获取
- git -C $3 symbolic-ref –short -q HEAD // 分支
- git -C $3 describe –always –tag // 标签
- git -C $3 rev-parse –short HEAD // 提交
变基(rebase)
- merge和rebase这两种整合方法的最终结果没有任何区别,但是变基使得提交历史更加整洁。 你在查看一个经过变基的分支的历史记录时会发现,尽管实际的开发工作是并行的,但它们看上去就像是串行的一样,提交历史是一条直线没有分叉。
- 目的是为了确保在向远程分支推送时能保持提交历史的整洁。例如向某个其他人维护的项目贡献代码时。在这种情况下,你首先在自己的分支里进行开发,当开发完成时你需要先将你的代码变基到 origin/master 上,然后再向主项目提交修改。 这样的话,该项目的维护者就不再需要进行整合工作,只需要快进合并便可。
- https://xiaozhuanlan.com/topic/6873210549
- https://git-scm.com/book/zh/v2/Git-%E5%88%86%E6%94%AF-%E5%8F%98%E5%9F%BA
命令脚本
branch
- 显示当前分支:git branch
- 显示所有分支:git branch -va
- 显示分支的提交记录:git show-branch
- 显示当前分支的版本号(commit id):git rev-parse HEAD
- 切换分支/标签
- 切换本地分支:git checkout 分支/tag/commit,git checkout branch1, git checkout tag1, git checkout commit1
- 下载远程分支并切换:git checkout -b <本地分支> origin/<远程分支>,git checkout -b lb origin/rb
- 下载远程标签并切换:git checkout -b <本地分支> origin/tag1
- 基于当前分支创建新分支:git branch <本地新分支>
- 删除分支:git branch -d <远程分支>
其他
- **指定在特定目录执行git:git -C <目录> 执行命令**
- 拉取当前分支:git pull
- 拉取分支:git pull <远程主机> <远程分支>:<本地分支>,git pull origin master:master
- 合并分支(远程分支合并到当前分支):git merge <远程分支>
- 清除当前目录所有commit冲突的文件,不会回退:git reset hard
- 清除当前目录下所有没commit的管理文件的修改:git checkout .
- 清除当前目录下所有非管理文件:git -C . clean -xdf
- 永久删除远程分支上的提交。非常规操作,不建议使用
cd <目录> git reset --hard HEAD^ // 删除最近的一次提交,删除n次提交就执行n次 git push origin master -f // 提交到远程, origin是远程名称,master是分支名称