对于Git一些操作 通过git三个区来理解
首先,初始化吧
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 restore filename.txt
|
将暂存区的文件移除
1
| git rm --cached filename.txt
|
了解工作区与暂存区文件的状态
1 2 3
| git status 简洁版 git status -s
|
Repository:仓库区(或本地仓库)
版本回退(将工作区暂存区的内容回退到某个版本)
查看提交历史 获得版本号
版本回退命令
1 2 3
| git reset --soft 版本号 git reset --hard 版本号 git reset mixed 版本号 (等价于 git reset)
|
三者区别在于是否会覆盖 工作区和暂存区未跟踪的文件
要把暂存区的变更提交到远程仓库
Remote:远程仓库
推送到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 配置
git初始化 git init
初始化 husky 工具配置 https://typicode.github.io/husky/
1
| pnpm dlx husky-init && pnpm install
|
- 修改 .husky/pre-commit 文件(这里的pnpm lint是配置好了的)
问题:默认进行的是全量检查,耗时问题,历史问题。
暂存区eslint校验
只对暂存区里新的内容进行规范检查
lint-staged 配置
- 安装
- 配置
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" } }
|
- 修改 .husky/pre-commit 文件