对于Git一些操作 通过git三个区来理解

首先,初始化吧

1
git init

Workspace:工作区

本地电脑上的东西都在这个区

从远程仓库克隆到本地

1
git clone https://github.com/username/repository.git

从远程仓库克隆特定分支到本地

1
git clone -b branch-name https://github.com/username/repository.git

远程仓库有多个分支时切换到想要更新的分支

1
git checkout branch-name

(获取fetch 然后 合并merge ) 或者 pull抓取 等同这两个操作

1
2
3
4
git fetch origin
git merge origin/branch-name

git pull origin branch-name

Index / Stage:暂存区

要提交 首先得把工作区的更改放到暂存区

提交某个文件

1
git add filename.txt

**提交全部文件 **

1
git add .

将暂存区的文件覆盖给工作区

1
git restore filename.txt

将暂存区的文件移除

1
git rm --cached filename.txt

了解工作区与暂存区文件的状态

1
2
3
git status
简洁版
git status -s

Repository:仓库区(或本地仓库)

版本回退(将工作区暂存区的内容回退到某个版本)

查看提交历史 获得版本号

1
git log --oneline

版本回退命令

1
2
3
git reset --soft 版本号
git reset --hard 版本号
git reset mixed 版本号 (等价于 git reset)

三者区别在于是否会覆盖 工作区和暂存区未跟踪的文件

要把暂存区的变更提交到远程仓库

1
git commit -m "提交的注释"

Remote:远程仓库

推送到master分支

1
git push origin master

推送本地分支到远程仓库

1
git push origin feature-branch

设置推送的新分支为上游分支,之后每次提交只需用 git push

1
git push -u origin feature-branch

合并dev分支到master分支 然后上传

1
2
3
git checkout master
git merge dev
git push master

分支管理

分支本质上是指向提交节点的可变指针,默认是master或main。分支可以用来开发新需求或修理bug,保证主线代码随时可用,开发完成后合并到主分支上。

HEAD指针影响工作区/暂存区的代码状态

创建和切换分支

1
2
3
4
创建
git branch 分支名
切换分支
git checkout 分支名

分支功能完成后,合并回到主分支

1
2
3
4
5
6
切回到要合入的分支上:
git checkout master
合并其他分支过来
git merge bug-fix
删除合并后的分支指针
git branch -d bug-fix

快进合并和三方合并

快进合并:当前分支是目标分支的祖先分支,git会进行快速合并。分支的指针会移动到目标分支的位置,不会创建的新的合并提交。

类似这样

1
2
3
4
A (main)
A---B---C(target-branch)
合并后
A---B---C (main, target-branch)

三方合并:当前分支不是目标分支的祖先分支(当前分支有了新的提交)git会进行三方合并,合并会创建一个新的合并提交

1
2
3
4
5
6
7
8
9
10
11
12
13
最初
A (main)
A (target-branch)

分支开发结束后
A---B---C (main)
A---E (target-branch)

合并后
A---B---C---F (main)
A---E (target-branch)

F即为新的合并提交,记录了合并过程

rebase和merge对比

1
2
3
4
5
6
7
8
9
10
11
12
当前
A---B---C (origin/main)
\
D---E (main)

merge
A---B---C---G (main)
\ /
D---E

rebase
A---B---C---D'---E' (main)

合并冲突

冲突的概念:一次合并中,不同的分支对于同一文件的同一部分内容不同,git无法干净的合并,产生合并冲突

解决:找到冲突文件并手动解决,再进行一次提交

冲突是可以避免的,避免方式例如

1.按页面划分不同分支开发

2.公共代码在统一文件夹维护

3.Node等软件版本统一,npm 包统一下载

其他

忽略文件.gitignore

概念:.gitignore 文件可以让 git 彻底忽略跟踪指定文件,让 git 仓库更小更快,避免重复无意义的文件管理

1.项目根目录新建 .gitignore 文件

2.填入相应配置来忽略指定文件

常用命令

命令 作用 注意
git -v 查看 git 版本
git init 初始化 git 仓库
git add 文件标识 暂存某个文件 文件标识以终端为起始的相对路径
git add . 暂存所有文件
git commit -m ‘说明注释’ 提交产生版本记录 每次提交,把暂存区内容快照一份
git status 查看文件状态 - 详细信息
git status -s 查看文件状态 - 简略信息 第一列是暂存区状态,第二列是工作区状态
git ls-files 查看暂存区文件列表
git restore 文件标识 从暂存区恢复到工作区 如果文件标识为 . 则恢复所有文件
git rm –cached 文件标识 从暂存区移除文件 不让 git 跟踪文件变化
git log 查看提交记录 - 详细信息
git log –oneline 查看提交记录 - 简略信息 版本号 分支指针 提交时说明注释
命令 作用 注意
git reflog –oneline 查看完整历史 - 简略消息 包括提交,切换,回退等所有记录
git reset 版本号 切换版本代码到暂存区和工作区 –soft 模式保留暂存区和工作区原本内容 –hard 模式不保留暂存区和工作区原本内容 –mixed 模式不保留暂存区,工作区保留(默认) 先覆盖到暂存区,再用暂存区对比覆盖工作区
git branch 分支名 创建分支
git branch 查看本地分支
git branch -d 分支名 删除分支 请确保记录已经合并到别的分支下,再删除分支
git checkout 分支名 切换分支
git checkout -b 分支名 创建并立刻切换分支
git merge 分支名 把分支提交历史记录合并到当前所在分支
命令 作用 注意
git remote add 远程仓库别名 远程仓库地址 添加远程仓库地址 别名唯一,地址是 .git 结尾的网址
git remote -v 查看远程仓库地址
git remote remove 远程仓库别名 删除远程仓库地址
git pull 远程仓库别名 分支名 拉取 完整写法:git pull 远程仓库别名 远程分支名:本地分支名 等价于:git fetch 和 git merge
git push 远程仓库别名 分支名 推送 完整写法:git push 远程仓库别名 本地分支名:远程分支名 -u:建立通道后以后可以简写 git push
git pull –rebase 远程仓库别名 分支名 拉取合并 合并没有关系的记录
git clone 远程仓库地址 克隆 从0得到一个远程的Git仓库到本地使用

基于husky的代码检查

husky 是一个 git hooks 工具 ( git的钩子工具,可以在特定时机执行特定的命令 )

例如可以在提交时检查代码错误

husky 配置

  1. git初始化 git init

  2. 初始化 husky 工具配置 https://typicode.github.io/husky/

1
pnpm dlx husky-init && pnpm install
  1. 修改 .husky/pre-commit 文件(这里的pnpm lint是配置好了的)
1
pnpm lint

问题:默认进行的是全量检查,耗时问题,历史问题。

暂存区eslint校验

只对暂存区里新的内容进行规范检查

lint-staged 配置

  1. 安装
1
pnpm i lint-staged -D
  1. 配置 package.json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
// ... 省略 ...
"lint-staged": {
"*.{js,ts,vue}": [
"eslint --fix"
]
}
}

{
"scripts": {
// ... 省略 ...
"lint-staged": "lint-staged"
}
}
  1. 修改 .husky/pre-commit 文件
1
pnpm lint-staged