<commit_before>---
layout: post
title:  "git"
date:   2015-05-18
catalog: true
tags:
    - 技术
    - git
---

# 版本模型
资料：[分支模型](http://blog.csdn.net/qq_34651940/article/details/51891767)，[英文原版](http://nvie.com/posts/a-successful-git-branching-model/)
![](http://img.blog.csdn.net/20160716144249144?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)

|分支类型 | 名称 | 永久 | 命名规范 | 来源 | 操作 | 合并到 | 角色 |
| -------- | ----- | ----- | ----- | ---- |----- | ----- | ---- |
| 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 | 发布人员，开发人员 |

精简模型的操作：
1. hotfix无需另开分支，直接在master开发【否则还需部署一套环境】。合并操作同hotfix。
1. 当前版本的feature无需另开分支，直接在dev开发。长期feature需开分支。

# 环境清单
每个环境都有一套：执行程序，数据库，配置

| 环境 | 对应分支 | 执行程序 | 数据库 | 设置 | 说明 |
| :----: | ---- | ---- |
| 开发环境 | dev+feature | 开发人员自行搭建，独立 | 可复用测试数据库 | 可复用测试配置 |
| 测试环境 | dev | 独立 | 独立 | 独立 |
| 发布环境 | release或者hotfix | 独立 | 可复用测试数据库 | 独立 |
| 正式环境 | master | 独立 | 独立 | 独立 |

# 使用
## 日常流程
### 初始化
1. 从master克隆dev：git checkout master; git branch dev;

### 开发feature分支
1. 从dev克隆feature：git checkout dev; git branch V2.3_ft_pay_lyx;
1. 开发人员检出：git checkout V2.3_ft_pay_lyx;
1. feature合并回dev：git checkout dev; git merge V2.3_ft_pay_lyx;

### 开发release分支
1. 从dev克隆release：git checkout dev; git branch V2.3_rl_20161111;
1. 开发人员检出：git checkout V2.3_rl_20161111;
1. release合并回dev：
1. release合并到master（是一个发布版本。同时需要打标签）：

### 开发hotfix分支
1. 从master克隆hotfix：git checkout master; git branch V2.2_hf_123456-332452_wyq;
1. 开发人员检出：git checkout V2.2_hf_123456-332452_wyq;
1. hotfix合并回master：
1. hotfix合并到dev/release：

> hotfix时，当有一个release分支同时存在（当前版本快发布了，却发现上个版本的bug）。这个hotfix分支必须被合并到release分支而不是dev分支(release后续会合并到dev)。

### 部署环境
1. 获取代码(测试环境)：git -C DIR checkout dev; git -C DIR pull;
1. 部署

## 常用操作
### 选择提交的分支
按照以下顺序选择：
1. release分支：bugfix(无bugfix分支的情况下)，需尽快发布的小改动和功能
1. dev分支：
  * 下个版本 && 小改动
  * 下个版本 && (新增功能 && 不修改原有逻辑)
1. feature分支：到了测试和发布阶段再合并回dev分支
  * !下个版本
  * 下个版本 && 调整功能
  * 下个版本 && (新增功能 && 修改原有逻辑)

### 暂存文件
  * 工作区代码暂存，会记录来源分支
  * 使用场景：有新工作要做（如bugfix）+ 当前工作区有不少修改了却无法提交的文件
  * 暂存当前工作区，切换到新工作，恢复当前工作区
### 打补丁
  * 跨分支代码迁移
  * 使用场景：提交了代码到主分支+该功能代码需要先发布上线
  * 在主分支上选择该功能对应的所有提交，创建成一个补丁，在发布分支上应用本补丁

## 命令脚本
- **指定在特定目录执行git：git -C <目录>**
- 显示当前分支：git branch
- 新建分支：git branch <远程分支>
- 切换分支：git checkout <远程分支>，git checkout master
- 拉取当前分支：git pull
- 拉取分支：git pull <远程主机> <远程分支>:<本地分支>，git pull origin master:master。
- 合并分支(远程分支合并到当前分支)：git merge <远程分支>
- 删除分支：git branch -d <远程分支>
- 基于当前分支创建新分支：git branch <本地新分支>
- 显示分支的提交记录：git show-branch
- 显示所有分支：git branch -va
- 重置当前分支到最新提交：cd <目录> | git reset --hard HEAD^

# 资料
1. **[git push & git pull 推送/拉取分支](http://blog.csdn.net/litianze99/article/details/52452521)**
1. **[Git - 分支的新建与合并](https://git-scm.com/book/zh/v2/Git-%E5%88%86%E6%94%AF-%E5%88%86%E6%94%AF%E7%9A%84%E6%96%B0%E5%BB%BA%E4%B8%8E%E5%90%88%E5%B9%B6)**
1. [SourceTree使用流程和方法](/file/SourceTree.docx)
1. [git – 简易指南](http://www.bootcss.com/p/git-guide/)
1. [强制删除远程分支上的某次提交](http://blog.csdn.net/qqxiaoqiang1573/article/details/68074847)
<commit_msg>no message<commit_after>---
layout: post
title:  "git"
date:   2015-05-18
catalog: true
tags:
    - 技术
    - git
---

# 版本模型
资料：[分支模型](http://blog.csdn.net/qq_34651940/article/details/51891767)，[英文原版](http://nvie.com/posts/a-successful-git-branching-model/)
![](http://img.blog.csdn.net/20160716144249144?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)

|分支类型 | 名称 | 永久 | 命名规范 | 来源 | 操作 | 合并到 | 角色 |
| -------- | ----- | ----- | ----- | ---- |----- | ----- | ---- |
| 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 | 发布人员，开发人员 |

精简模型的操作：
1. hotfix无需另开分支，直接在master开发【否则还需部署一套环境】。合并操作同hotfix。
1. 当前版本的feature无需另开分支，直接在dev开发。长期feature需开分支。

# 环境清单
1. 每个环境都有一套：执行程序，数据库，配置

| 环境 | 对应分支 | 执行程序 | 数据库 | 设置 | 说明 |
| :----: | ---- | ---- |
| 开发环境 | dev+feature | 开发人员自行搭建，独立 | 可复用测试数据库 | 可复用测试配置 |
| 测试环境 | dev | 独立 | 独立 | 独立 |
| 发布环境 | release或者hotfix | 独立 | 可复用测试数据库 | 独立 |
| 正式环境 | master | 独立 | 独立 | 独立 |

# 使用
## 日常流程
### 初始化
1. 从master克隆dev：git checkout master; git branch dev;

### 开发feature分支
1. 从dev克隆feature：git checkout dev; git branch V2.3_ft_pay_lyx;
1. 开发人员检出：git checkout V2.3_ft_pay_lyx;
1. feature合并回dev：git checkout dev; git merge V2.3_ft_pay_lyx;

### 开发release分支
1. 从dev克隆release：git checkout dev; git branch V2.3_rl_20161111;
1. 开发人员检出：git checkout V2.3_rl_20161111;
1. release合并回dev：
1. release合并到master（是一个发布版本。同时需要打标签）：

### 开发hotfix分支
1. 从master克隆hotfix：git checkout master; git branch V2.2_hf_123456-332452_wyq;
1. 开发人员检出：git checkout V2.2_hf_123456-332452_wyq;
1. hotfix合并回master：
1. hotfix合并到dev/release：

> hotfix时，当有一个release分支同时存在（当前版本快发布了，却发现上个版本的bug）。这个hotfix分支必须被合并到release分支而不是dev分支(release后续会合并到dev)。

### 部署环境
1. 获取代码(测试环境)：git -C DIR checkout dev; git -C DIR pull;
1. 部署

## 常用操作
### 选择提交的分支
按照以下顺序选择：
1. release分支：bugfix(无bugfix分支的情况下)，需尽快发布的小改动和功能
1. dev分支：
  * 下个版本 && 小改动
  * 下个版本 && (新增功能 && 不修改原有逻辑)
1. feature分支：到了测试和发布阶段再合并回dev分支
  * !下个版本
  * 下个版本 && 调整功能
  * 下个版本 && (新增功能 && 修改原有逻辑)

### 暂存文件
  * 工作区代码暂存，会记录来源分支
  * 使用场景：有新工作要做（如bugfix）+ 当前工作区有不少修改了却无法提交的文件
  * 暂存当前工作区，切换到新工作，恢复当前工作区
### 打补丁
  * 跨分支代码迁移
  * 使用场景：提交了代码到主分支+该功能代码需要先发布上线
  * 在主分支上选择该功能对应的所有提交，创建成一个补丁，在发布分支上应用本补丁

## 命令脚本
1. **指定在特定目录执行git：git -C <目录>**
1. 显示当前分支：git branch
1. 新建分支：git branch <远程分支>
1. 切换分支：git checkout <远程分支>，git checkout master
1. 拉取当前分支：git pull
1. 拉取分支：git pull <远程主机> <远程分支>:<本地分支>，git pull origin master:master。
1. 合并分支(远程分支合并到当前分支)：git merge <远程分支>
1. 删除分支：git branch -d <远程分支>
1. 基于当前分支创建新分支：git branch <本地新分支>
1. 显示分支的提交记录：git show-branch
1. 显示所有分支：git branch -va
1. 永久删除远程分支上的提交。非常规操作，不建议使用
  1. cd <目录>
  1. git reset --hard HEAD^ // 删除最近的一次提交，删除n次提交就执行n次
  1. git push origin master -f // 提交到远程

# 资料
1. **[git push & git pull 推送/拉取分支](http://blog.csdn.net/litianze99/article/details/52452521)**
1. **[Git - 分支的新建与合并](https://git-scm.com/book/zh/v2/Git-%E5%88%86%E6%94%AF-%E5%88%86%E6%94%AF%E7%9A%84%E6%96%B0%E5%BB%BA%E4%B8%8E%E5%90%88%E5%B9%B6)**
1. [SourceTree使用流程和方法](/file/SourceTree.docx)
1. [git – 简易指南](http://www.bootcss.com/p/git-guide/)
1. [强制删除远程分支上的某次提交](http://blog.csdn.net/qqxiaoqiang1573/article/details/68074847)

{'fraction_non_alphanumeric': 0.1708381839348079, 'fraction_numerical': 0.06635622817229336, 'mean_word_length': 4.031478770131772, 'pattern_counts': {'":': 0, '<': 23, '<?xml version=': 0, '>': 25, 'https://': 2, 'lorem ipsum': 0, 'www.': 2, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '336841', 'n_tokens_mistral': 4450, 'n_tokens_neox': 4754, 'n_words': 549}