**层级关系**
工作区(add) --> 暂存区(commit) --> 本地库(push) --> 远程库
## Commit 规范
![image.png](https://blog.zs-fighting.cn/upload/2022/04/image-f3ee8a110ac54075aea7201178b2868f.png)
## 从远程库获取最新代码合并到本地
---
```shell
// 查询当前远程的版本
$ git remote -v
// 获取最新代码到本地
$ git fetch
// 合并远程分支最新代码
$ git merge origin/master
// 合并本地分支最新代码
$ git merge dev
// 本地建立master分支,并下载/关联远程orgin/master
$ git branch --track master origin/master
```
## Git 撤销操作
```shell
Disk(本地修改代码,没有 add、commit):
git checkout <file> 撤消代码修改
Staging(修改代码, 只 add):
git reset <file> 只撤消add操作
git checkout HEAD <file> 撤消add操作和代码修改
Local(修改代码, add, commit):
git reset --soft HEAD~1 只撤消commit操作
git reset HEAD~1 只撤消commit、add操作,代码修改不变
git reset --hard HEAD~1 撤消commit、add、代码修改,完整恢复到原始状态
```
## Git 基础 - tag
---
`git tag v1.0.0`
每一个提交都有一个`commitID`,但是每次记录`commitID`都很复杂,使用`git tag`可以在一些重要的版本和修改中加入一个标识,可以很快速的找到我们需要的版本。
![image.png](https://blog.zs-fighting.cn/upload/2022/04/image-d33618379614430aa4a4cb739db4cf81.png)
- fix 类型的 commit 可以将修订号+1。
- feat 类型的 commit 可以讲此版本号+1。
[Git 基础 - 打标签](https://git-scm.com/book/zh/v2/Git-%E5%9F%BA%E7%A1%80-%E6%89%93%E6%A0%87%E7%AD%BE)
## Git命令行操作
---
```shell
// 常用命令
#清空暂存区
git reset HEAD
#只清空暂存区某个文件
git reset HEAD -- <fileName>
#工作区文件回退到暂存区
git checkout -- <fileName>
#将工作区文件暂存/恢复
git stash/git stash apply
// 本地库初始化
git init
注意:生成的 .git 目录中存放的是本地库相关文件,不要删除
// 设置签名
git config --global user.name username
git config --global user.email username@domain.com
// 查看config
git config --global --list
- local:只对某个仓库生效
- global:对所有仓库生效
- system:对所有的系统用户都生效
// 查看工作区、暂存区状态
git status
// 将工作区的文件添加到暂存区
git add <fileName>
// 将暂存区内容提交到本地库
git commit -m 'commit message'
// 查看历史记录
git log
- oneline: 简洁显示
- all: 显示所有分支
- graph: 图形化
// 前进后退
git reset
// 文件对比
#暂存区与HEAD对比
git diff --cached
#工作区与暂存区对比
git diff
#分支或者commit对比
git diff <branch/commit> <branch/commit>
// 分支管理
#查看所有分支信息
git branch -av
#切换分支
git checkout <branch>
#新建分支
git branch <branch>
#删除分支
git branch -d/-D <branch>
// 解决冲突
- 冲突的解决
- 第一步:编辑,删除特殊标记`<<<` `===`
- 第二步:修改到满意位置,保存退出
- 第三步:添加到缓存区 `git add 文件名`
- 第四步:提交到本地库`git commit -m '日志信息' ` `注意:后面一定不能带文件名`
// tag标签
#创建本地tag信息
git tag -a v1.0 -m '版本介绍'
#删除tag
git tag -d v1.0
#将本地tag信息推送到远程库
git push origin --tags
#拉取到本地
git pull origin --tags
#切换tag
git checkout v.10
#指定tag下载代码
git clone -b v0.1 地址
```
## Git工作流
![3fff7af34841aeef3caeeb28fa485035.jpg](https://blog.zs-fighting.cn/upload/2021/10/3fff7af34841aeef3caeeb28fa485035-8b7a87a9e0bd42b88778358797f2480e.jpg)
## 合并多条commit
---
- 由于开发中各种修改,本地分支多次commit。最后提交master后,会看到乱七八糟的所有增量修改历史。
```
$ git rebase -i [startpoint] [endpoint]
- -i的意思是--interactive,即弹出交互式的界面让用户编辑完成合并操作。
- [startpoint] [endpoint]则指定了一个合并的区间。
- 如果不指定[endpoint],则该区间的终点默认是当前分支HEAD所指向的commit。
```
示例:现需要合并三个commit(first、second、third)
![image.png](https://blog.zs-fighting.cn/upload/2021/11/image-3ce9b4142ef94eefb024bd13650bee29.png)
执行 `git rebase -i f123956` 进入交互界面。
![image.png](https://blog.zs-fighting.cn/upload/2021/11/image-043d66e391c040c4960171b1c79c69d8.png)
根据我们的需求,我们将commit内容编辑如下:
```
pick 4d32374 first commit
s b10e9fc second commit
s 99a0294 third commit
```
上面的意思就是把第三次、第二次提交的commit合并到第一次的提交上。
wq保存后,进入注释修改界面:
![image.png](https://blog.zs-fighting.cn/upload/2021/11/image-6e428ebf7cdc4f878e1934c0c5ec6f15.png)
>删除之前的commit注释,添加合并后的注释,最终编辑效果如下:
![image.png](https://blog.zs-fighting.cn/upload/2021/11/image-1371c390f5d941208449fed9cb84e8ed.png)
查看 `log` 已经合并了
![image.png](https://blog.zs-fighting.cn/upload/2021/11/image-4c8f502e97b74c439d8ea5a5b279dce9.png)
## BLOB、Commit和Tree组件
![image.png](https://blog.zs-fighting.cn/upload/2022/05/image-eb023aca3ef64cb1a35896d097a16d24.png)
git 使用简易指南