# GIT --- ## 分区 * 工作区 电脑里能看到的目录 * 暂存区 `git add`后工作区修改过的文件会添加到暂存区 * 版本区 `git commit`后,暂存区的文件会打包好作为一次提交放到版本区中 --- ## git分区图例 ![1352126739_7909.jpg](https://i.loli.net/2021/07/10/8DKJvoI1jgslSVP.jpg) --- ## 基本操作 ##### 文件操作类 - git add `xxxxxx.java` `/folder` - git commit `-m` `-v` - git stash `pop` - git reset `head` `--hard` --- ### git stash/pop 用于临时保存和回复修改,**可跨分支** > 注:在未add之前才能执行stash!(即未加入暂存区) --- ### commit message 规范 - feat(module):新功能(feature)。 - fix:修复bug,可以是QA发现的BUG,也可以是研发自己发现的BUG。 - docs:文档(documentation)。 - style:格式(不影响代码运行的变动)。 - refactor:重构(即不是新增功能,也不是修改bug的代码变动)。 - perf:优化相关,比如提升性能、体验。 - test:增加测试。 - chore:构建过程或辅助工具的变动。 - revert:回滚到上一个版本。 - merge:代码合并(冲突修复等)。 --- ### commit message 规范 ![ss](https://www.pianshen.com/images/743/c3abf70361be83548db7c3a2ad954157.png) --- ## 基本操作 ##### 分支操作类 - git checkout `-b` `branch` - git merge `branch` - git rebase `branch` - git pull `remote` `branch` - git push `remote` `branch` --- ![](https://git-scm.com/book/en/v2/images/basic-branching-4.png) ![](https://git-scm.com/book/en/v2/images/basic-merging-2.png) --- ### merge 冲突 ``` html <<<<<<< HEAD:index.html ======= >>>>>>> iss53:index.html ``` #### `git merge --abort` --- ### merge的特点 ##### **优点** - 使用简单 - 保留每一步的记录 - 保留源分支的原始记录 ##### **缺点** - 保留每一步的记录 --- ### rebase 同merge一样,主要功能也是合并分支,但是有很多不一样的细节 > 将提交到某一分支上的所有修改都移至另一分支上,就好像“重新播放”一样。 --- ### rebase ![](https://git-scm.com/book/en/v2/images/basic-rebase-3.png) 在分支`experiment`上执行`git rebase master`, 将 `C4` 中的修改变基到 `C3` 上 --- ### rebase 和 merge 的区别 **1、使用难度** merge较rebase更易于理解 **2、对git操作历史的记录结果不一样** merge会记录所有的合并操作,而rebase只会保留一个串行的提交记录。 --- ### merge后的历史 ![微信图片_20210709232045.png](https://i.loli.net/2021/07/09/8u7Bcb6JdUeTSR4.png) --- ### 过多的merge记录 ![](https://img-blog.csdnimg.cn/img_convert/7efce581c4a361c24cfecf0eafdd6639.png) --- ### rebase后的历史 ![微信图片_20210709232119.png](https://i.loli.net/2021/07/09/VIGA7k2tneBuWcd.png) --- ## 分支协作 ### Git Work Flow --- ### Git Work Flow #### 分类 - Git Flow - GitHub Flow - GitLab Flow --- ### Git Flow 以Git分支能力为基础的协作模型 ##### 分支类型 - Master *最新的可发布版本* - Dev *最新的开发进度* - Realease *预发布分支* - HotFix *紧急 bug 修复的分支* - Feature *模块开发分支* --- #### 一般流程 1. 从master新建分支dev。 2. 从dev新建各个feature分支,并在feature上开发。 3. 开发完成的feature将会合并到dev。 4. 一个阶段的功能开发完成后将会新建出一个release分支用于测试等**预发布**。 5. 在预发布期间发现的问题将在release中修改并把修改合并到dev。6、release测试通过后,合并到master。并在master`tag`一个版本记录。 6. 期间线上发生bug,需要从master中新建一个hotfix分支解决紧急问题,并合并到master、dev中。[特殊] --- ![微信图片_20210710000300.png](https://i.loli.net/2021/07/10/LbyeDfRlEoSYFng.png) --- ### Github Flow 基于GitFlowa新增`fork`, `Pull Request` ![微信图片_20210710003940.png](https://i.loli.net/2021/07/10/I4kTNdCaLsqGguR.png) --- ![微信图片_20210710003940.png](https://i.loli.net/2021/07/10/cJUhuSY1sGo8AQT.png)