一、简介

  • Git是一个免费开源的分布式版本控制系统
  • SVN是一个集中式版本控制系统
  • 版本控制系统的核心是版本控制,而不是团队协作
  • 版本控制系统提交记录后会产生迭代版本,方便检索对比和回滚
  • SVN只有服务器版本控制,Git还有本地版本控制

版本控制系统集中式和分布式的区别

  1. 你的本地是否有完整的版本库历史
  2. 假设SVN服务器没了,那你丢掉了所有历史信息,因为你的本地只有当前版本以及部分历史信息
  3. 假设Git服务器没了,你不会丢掉任何git历史信息,因为你的本地有完整的版本库信息。你可以把本地的git库重新上传到另外的git服务商。

二、基本概念

  • 工作区:本地存放项目代码的目录
  • 暂存区:用于临时存放项目改动的文件,位于 .git/index 文件
  • 本地仓库:各种修改的版本信息最后存储的地方,位于 .git 目录
  • 远程仓库:托管代码的服务器
  • git add:工作区 -> 暂存区
  • git commit:暂存区 -> 本地仓库
  • git push:本地仓库 -> 远程仓库
  • git reset --soft:暂存区 -> 工作区
  • git reset --mixed:本地仓库 -> 暂存区
  • git reset --hard:本地仓库 -> 暂存区 -> 工作区

三、使用规范

3.1 分支管理策略

├─── 主分支(master)
│    ├─── 开发分支(develop)
│    │    ├─── 开发者A分支(develop-x1)
│    │    ├─── 开发者B分支(develop-x2)
│    │    ├─── 发布分支(release-x.y)
│    │    ├─── 发布分支(release-x.y)
│    ├─── 紧急修复分支(hotfix-aaa)
│    ├─── 紧急修复分支(hotfix-bbb)
│    ├─── (hotfix最后要合并到主分支和开发分支)
│

* master(主分支):可用的稳定版本,不允许随意提交修改,由开发经理从 develop 分支合并;
* develop(开发分支):不允许直接修改,但允许程序员发起提交合并请求;
* release(发布分支):在 develop 分支上创建的分支,用于测试发布部署;
* hotfix-xxx(紧急修复分支):在 master 分支上创建的分支,修复后合并到 master

3.2 团队协作规范流程

<TODO>
---------------- 初始阶段 ----------------
1. 开发主管创建 master 分支,并将其设置为保护分支;
2. 开发主管在 master 分支上创建 develop 分支;
---------------- 开发阶段 ----------------
3. 并行项目(多人协作):在 develop 分支上创建 feature-xx 分支进行开发;
   非并行项目(单人开发):在 develop 分支上创建 develop-yy 分支进行开发;
4. 开发完成后将 feature-xx 或 develop-yy 合并到 develop 分支;
   (开发完成后可以删除 feature-xx 或 develop-yy 分支)
---------------- 测试阶段 ----------------
5. 开发人员在 develop 分支上创建 release-x.y 分支并解决 BUG 修复;
6. 测试完成后将 release-x.y 分支合并到 develop 分支;
7. 开发主管将 develop 分支合并到 master 分支;
   (测试完成后可以删除 release-x.y 分支)
---------------- 紧急修复 ----------------
8. 在 master 分支上创建 hotfix-x.y 分支并解决 BUG 修复;
9. 将 hotfix-x.y 分支合并到 master 分支;

注意:feature-xx、develop-yy、release-x.y、hotfix-x.y 等分支仅作为本地分支。

3.3 团队协作操作步骤

## --------------------- 前期准备 ---------------------
#### 创建本地分支并与远程分支关联
$ git checkout -b dev-tracine origin/dev-tracine
#### 创建与远程分支关联的同名分支
$ git checkout -t origin/feature

## --------------------- 开发阶段 ---------------------
#### 模块开发完成之后,先要拉取 develop 并合并到自己的分支
$ git checkout develop-tracine
$ git pull origin develop
$ git merge --no-ff -m "merge" develop
#### 解决代码版本冲突后再将自己的分支合并到 develop 分支
$ git add -A
$ git commit -m "develop-tracine description"
$ git checkout develop
$ git merge --no-ff -m "说明" develop-tracine
$ git push origin develop
## ----------------- 发布阶段(正式版) -----------------
#### 从 release 或 hotfix 分支合并到 master 分支需要打标签
$ git merge --no-ff -m "修复后的1.1.3版本" hotfix-1.1.3
$ git tag -a v1.1.3 -m 'v1.1.3'
$ git push origin v1.1.3

3.4. 冲突解决方案

## --------------- 方案1:备份本地修改 ---------------
#### 备份本地所做的修改
$ git stash save -m "备注"
#### 回退到之前的历史版本
$ git reset --hard HEAD
#### 拉取更新最新代码
$ git pull
#### 读取备份然后删除并恢复到工作区
$ git stash pop

## --------------- 方案2:直接放弃本地修改 ---------------
#### 将工作区恢复到上次提交的内容,同时放弃本地所做的修改
$ git reset --hard HEAD
$ git pull

3.5. 代码提交信息规范

$ <type>(<scope>): <subject>

###### type:用于说明提交的类别
## feat: 新增功能
## fix: 修复 bug
## docs: 仅仅修改了文档,比如 README, CHANGELOG等等
## test: 增加/修改测试用例,包括单元测试、集成测试等
## style: 修改了空行、缩进格式、引用包排序等等(不改变代码逻辑)
## perf: 优化相关内容,比如提升性能、体验、算法等
## refactor: 代码重构,没有新功能或者bug修复
## chore: 改变构建流程、或者增加依赖库、工具等
## revert: 回滚到上一个版本
## merge: 代码合并
###### 比如
$ fix: 用户查询缺少username属性 
$ feat: 用户查询接口开发 
$ style: 用户查询功能注释增强
$ chore: hutool 版本升级到 5.7.22
## ------------------------------------

3.5. 多源仓库

######## 项目初始化(开发经理或技术经理) 
# 1.在自己的项目组新建一个项目(私有仓库)
# 2.将私有仓库克隆到本地仓库
$ git clone http://192.168.1.50/xcui/base_web_test.git
# 3.添加上游仓库(前端基础底架仓库),并确认远程仓库信息是否正确
$ git remote add upstream http://192.168.1.50/architecture/web_base_frame.git
$ git remote -v
  #### 显示如下四个地址标识正确
  origin  http://192.168.1.50/xcui/base_web_test.git (fetch)
  origin  http://192.168.1.50/xcui/base_web_test.git (push)
  upstream  http://192.168.1.50/architecture/web_base_frame.git (fetch)
  upstream  http://192.168.1.50/architecture/web_base_frame.git (push)
# 4.初始化上游仓库(前端基础底架仓库)代码到私有仓库
$ git fetch upstream master
$ git checkout master
$ git merge --no-ff -m "更新底座框架" upstream/master --allow-unrelated-histories
$ git push origin master

######## 当上游仓库(前端基础底架仓库)发生版本更新时,第4步再执行一次即可

img

四、配置和使用

4.1. 配置全局用户信息

$ git config --global user.name "Tracine"
$ git config --global user.email "844256131@qq.com"
## 查看用户信息
$ git config --global --list

4.2. 生成公钥和私钥

$ ssh-keygen -t rsa
#### 然后按回车三下就生成成功了
#### 公钥私钥生成路径:C:\Users\Administrator\.ssh
#### id_rsa 就是私钥
#### id_rsa.pub 就是公钥

4.3. 常用忽略配置

## .gitignore
#### Windows ####
Thumbs.db
ehthumbs.db
Desktop.ini

#### Java ####
target
log
logs
.classpath
.settings
.project
.idea
*.iml
*.log*

#### Vue ####
.DS_Store
.vscode
/node_modules
/dist

五、基本命令

######## 代码库操作命令
$ git init [project-name] ##新建代码库
$ git clone [url] ##克隆代码库
$ git log

######## 文件操作命令
$ git status [filename]
$ git status

######## 工作区<-->暂存区
$ git add [file1] [file2] ##指定文件名提交到暂存区
$ git add [dir] ##指定文件夹提交到暂存区
$ git add . ##所有文件提交到暂存区
$ git checkout . #拉取暂存区的文件所有文件覆盖工作区
$ git checkout -- <filename> #拉取暂存区指定文件覆盖工作区

######## 暂存区<-->本地仓库
$ git commit -m "提交描述" ##提交暂存区到本地仓库
$ git reset HEAD ##本地仓库覆盖暂存区
git reset --soft
git reset --mixed
git reset --hard

$ git reset --hard HEAD ##本地仓库覆盖暂存区和工作区

######## 远程仓库命令
$ git pull origin <分支名>
$ git push origin <分支名>

######## git branch(分支相关命令)
$ git branch  ##查看当前分支
$ git branch -a  ##查看所有分支
$ git branch -v  ##查看分支最后提交信息
$ git branch <分支名称>  ##创建分支
$ git branch -d <分支名称>  ##删除分支
$ git branch -D <分支名称>  ##强制删除分支
$ git branch --merged  ##查看当前分支被合并记录

######## git checkout(分支相关命令)
$ git checkout <分支名称>  ##切换分支
$ git checkout -b <分支名称>  ##创建并切换分支
$ git merge --no-ff -m "merge" <分支名称>  ##合并到当前分支

######## git tag(标签相关命令)
$ git tag   ##显示所有的标签信息,如果为空就代表你没有此时没有任何标签信息
$ git checkout <版本号>   ##切换标签
$ git tag -a <版本号> -m "<版本注释信息>" ##创建标签
$ git push origin <版本号> ##推送单个标签
$ git push origin --tags ##推送所有本地标签

######## git stash(暂存命令)
##保存当前未commit的代码并添加备注
git stash save -m "备注的内容"
##列出stash的所有记录
git stash list
##删除stash的所有记录
git stash clear
##应用最近一次的stash
git stash apply
##应用最近一次的stash,随后删除该记录
git stash pop
##删除最近的一次stash
git stash drop