一、Git操作
1. 安装
下载exe文件,双击一直next安装
安装完成后,右键选择Git Bash Here,输入 git --version 查看是否安装成功
2. 初始化配置
设置用户名:git config --global user.name "dudu"
设置邮箱:git config --global user.email 18845788065@163.com
查看现有的配置信息:git config --list
取消配置:git config --global --unset user.name
global表示该配置只适用于该用户,system表示对系统中所有用户都适用,如果不加该参数则表示只针对当前项目有效。适用性从小到大,相同配置会被覆盖。
3. Git底层概念(底层命令)
3.1 两个重要概念
区域
- 工作区
- 暂存区
- 版本库
对象
- Git对象
- 树对象
- 提交对象
3.2 基础的linux命令
- clear 清除屏幕
- echo ‘test dudu’ 往控制台输出信息
- echo ‘test dudu’ > dudu.txt 向文件中写入内容(覆盖的)
- ll 将当前目录下的子文件和子目录平铺在控制台
- find 目录名 将对应目录下的子孙文件和子孙目录平铺在控制台
- find 目录名 type -f 将对应目录下的文件平铺在控制台
- rm 文件名 删除文件
- mv 源文件 重命名文件:重命名
- cat 文件的url:查看对应文件的内容
- vim 文件的url:
- 按i进入插入模式,进行文件编辑
- 按esc然后按: 进行命令的执行
- q! 强制退出不保存
- wq 保存退出
- set nu 设置行号
3.3 初始化新仓库
在要初始化的文件夹中右键,选择 Git Bush Here,输入命令:git init
3.4 .git文件目录
- hooks 包含客户端或服务端的钩子脚本
- info 包含一个全局性排除文件
- logs 保存日志信息
- objects 存储所有数据内容
- refs 存储指向数据(分支)的提交对象的指针
- config 文件包含项目特有的配置选项
- description 显示对仓库的描述信息
- HEAD 指示目前被检出的分支
- index 保存暂存区信息
3.5 git对象
Git的核心部分是一个简单的键值对数据库,可以向该数据库插入任意类型的内容,它会返回一个键值,通过该键值可以在任意时刻再次检索该内容。
向数据库写入内容并返回对应键值
命令:echo 'test dudu | git hash-object -w --stdin
- -w 指示 hash-object命令存数据对象;若不指定此选项,则该命令仅返回对应的键值
- –stdin 指示 该命令从标准输入读取内容;若不指定此选项,则需要在命令尾部给出待存储文件的路径
git hash-object -w 文件路径存文件git hash-object 文件路径返回对应文件的键值
返回:该命令输出一个长度为40的校验和。这是一个SHA-1哈希值
查看Git是如何存储数据的
命令:find .git/objects -type f
- 一个文件对应一条内容,校验和的前两个字符用于命名子目录,余下的38个字符则用作文件名
根据键值拉取数据
命令:git cat-file -p 哈希值
- -p 指示该命令自动判断内容的类型,并显示合适友好的内容
- -t 指示查看内容的类型
返回:对应文件的内容
3.6 对一个文件进行简单的版本控制
- 创建一个新文件并将其内容存入数据库
echo 'dudu v1' > dudu.txt
git hash-object -w dudu.txt - 向文件里写入新内容,并再次将其存入数据库
echo 'dudu v2' > dudu.txt
git hash-object -w dudu.txt - 查看数据库内容
find .git/objects -type f
问题:
- 记住文件的每一个版本所对应的哈希值并不现实
- 在Git中此时只保存了文件内容,并没有保存文件名
当前的操作都是在对本地数据库进行操作,不涉及暂存区
3.7 树对象
- 可以解决文件名保存的问题,也允许将多个文件组织到一起
- 一个树对象包含了一条或多条记录(每条记录含有一个指向git对象或子树对象的哈希指针,以及相应的模式、类型、文件名信息)
- 一个树对象也可以包含另一个树对象
构建树对象
可以通过update-index write-tree read-tree 等命令来构建树对象并塞入到暂存区(查看暂存区当前状态:git ls-files -s)
利用 update-index 命令为 dudu.txt 文件的首个版本创建一个暂存区,并通过 write-tree 命令生成树对象
$ echo 'dudu v1' > dudu.txt
$ git hash-object -w dudu.txt
$ git update-index --add --cacheinfo 100644 55806d07f4c18c38689cfa21d1318802756cb0a2 dudu.txt
$ git write-tree (hash: 0b117a68ad22da5924740da4efb889cf8c64cbd3)
文件模式:
1. 100644 表明这是一个普通文件
2. 100755 表明这是一个可执行文件
3. 120000 表示一个符号链接
--add 选项:因为此前该文件并不在暂存区中,首次需要该选项
--cacheinfo 选项:因为将要添加的文件位于 Git 数据库中,而不是位于当前目录下,所以需要该选项
新增文件 wang.txt,将新文件与 dudu.txt 的第二个版本放入暂存区,并通过 write-tree 命令生成树对象
$ echo 'wang v1' > wang.txt
使用vim修改 dudu.txt 的内容 并得到新的 hash 值:a81130c6d35adf1fb3aa3f9ea6df5e1fefdfa2e4
$ git update-index --cacheinfo 100644 a81130c6d35adf1fb3aa3f9ea6df5e1fefdfa2e4 dudu.txt
$ git update-index --add wang.txt (可以直接将文件放入暂存区)
通过查看暂存区,可以得知 wang.txt 的 hash 值:d6570ed37b69ba12c0b4f55b280891fd9a0cebeb
$ git write-tree (hash: ddb3b5b84e05dd5db4937c97c96f0c7ac4033cb8)
将第一个树对象加入第二个树对象,使其成为新的树对象
$ git read-tree --prefix=bak 0b117a68ad22da5924740da4efb889cf8c64cbd3
read-tree 可以将树对象读入暂存区
$ git write-tree (hash: a606e1b0035aa3590efdd63084ceec4543bc9bed)
树对象
查看暂存区当前的样子
$ git ls-files -s
查看树对象
$ git cat-file -p a606e1b0035aa3590efdd63084ceec4543bc9bed
- 树对象的hash可以换成 master^{tree} ,表示分支上最新的提交所指向的树对象
可以认为树对象就是项目的快照
3.8 提交对象
可以调用commit-tree命令创建一个提交对象,为此需要指定一个树对象的hash值,以及该提交的父提交对象(如果有)
创建提交对象
$ echo 'first commit' | git commit-tree 0b117a68ad22da5924740da4efb889cf8c64cbd3
查看提交对象
$ git cat-file -t 013462d3da50e1f4041c192d3bf6488dd01df590
$ git cat-file -p 013462d3da50e1f4041c192d3bf6488dd01df590
可以在提交时指定父提交对象(hash值的前7位左右作为参数就可以了)
$ echo 'second commit' | git commit-tree ddb3b5b84e05dd5db4937c97c96f0c7ac4033cb8 -p 013462d3da50e1f4041c192d3bf6488dd01df590
git commit-tree 不但生成提交对象,而且会将对应的快照(树对象)提交到本地库中
4. Git本地操作(高层命令)
初始化新仓库
- 命令:
git init - 初试化后,会生成一个 .git 目录,所有 Git 需要的资源都存在这里,但是此时还没有开始跟踪管理项目中的任何一个文件
记录每次更新到仓库
- 工作目录下面的文件状态有两种:已跟踪、未跟踪
- 已跟踪:已经纳入版本控制管理的文件,状态可能是:已提交、已修改、已暂存
- 未跟踪:本地文件,还没有纳入版本控制
git add ./ 将修改添加到暂存区
git commit -m 注释 将暂存区提交到版本库
检查当前文件状态
- 命令:
git status - 作用:确定文件当前处于什么状态
基本操作
- 跟踪新文件(暂存):
git add 文件名 - 暂存已修改文件:
git add 文件名 - 查看已暂存和未暂存的更新:
git diff(查看未暂存的更新) 和git diff --cached或git diff --staged(查看已暂存的更新) - 提交更新:
git commit -m 提交注释或git commit进入 vim 编辑模式,此时可以书写多行提交注释 - 跳过使用暂存区:
git commit -a可以将已经跟踪过的文件暂存起来一并提交 - 移除文件:手动删除文件后再次暂存提交即可(此时不再对删除的文件生成git对象,提交会产生新的树对象和提交对象),也可以使用
git rm 文件名删除文件,然后直接commit提交 - 文件改名:对文件进行改名后直接add加入暂存区再进行后续操作即可,也可以使用
git mv 原文件名 新文件名再commit提交 - 查看历史记录:
git log详细信息;git log --pretty=oneline信息一行显示;git log --oneline简略信息一行显示;查看详细历史记录:git log -g
5. Git分支操作
创建分支
- 命令:
git branch 分支名 - 作用:创建一个可以移动的新指针,本质是一个提交对象
- 注意:该命令创建分支,但并不会自动切换到新分支中去
- 其他命令:
git branch查看当前所有的分支列表git branch -d/D 分支名删除分支git branch -v查看每一个分支的最后一次提交git branch 分支名 提交对象的哈希值新建一个分支并且使分支指向对应的提交对象git branch -merged查看哪些分支已经合并到当前分支git branch --no-merged查看所有包含未合并工作的分支
查看当前分支所指的对象
- 命令:
git log --oneline --decorate
切换分支
- 命令:
git checkout 分支名|git checkout -b 分支名(创建并直接切换过去)
查看项目全部分支历史
- 命令:
git log --oneline --decorate --graph --all
分支合并
- 命令:
git merge 分支名 - 说明:切换到接收合并的分支,然后git merge 要合上去的代码所在的分支名
6. Git存储
- 命令:
git stash将未完成的修改保存到一个栈上,可以在任何时候使用git stash apply重新应用这些改动 git stash list查看存储git stash apply stash@{2}指定要应用哪个储存git stash pop应用储存然后立即从栈里扔掉它git stash drop 名字指定移除储存
7. 配别名
- 命令:
git config --global alias.别名 命令字符串 - 注意:命令字符串是原来的命令去掉git的部分
- 使用:
git 别名
8. 撤销与删除
git checkout -- 文件名可以撤销工作目录中对于该文件的修改git reset [HEAD] 文件名撤销暂存(git add)git commit --amend在注释写错时可以修改注释
重置 reset
git reset --soft HEAD~
- 移动HEAD指向的分支,此时HEAD指向当前提交的上一次提交
- 不修改暂存区和工作目录,只影响HEAD(但是与checkout不同,它会带着分支同时移动)
git reset [--mixed] HEAD~
- 移动HEAD指向的分支,此时HEAD指向当前提交的上一次提交
- 不修改工作目录,会影响暂存区和HEAD(如果在HEAD后指定文件名,此时不会影响HEAD,只影响暂存区)
git reset --hard HEAD~
- 移动HEAD指向的分支,此时HEAD指向当前提交的上一次提交
- 修改工作目录,暂存区和HEAD
9. 数据恢复
如果使用了 git reset --hard 命令,导致以前的一些提交丢失,可以使用 git reflog 或 git log -g 来找到丢失的提交的哈希值,直接在该提交上创建一个新的分支,此时丢失的提交就是可到达的了
10. 打tag
列出标签
git tag列出所有 taggit tag -l 'v1.2.1*'表示列出 1.2.1 后的 tag
创建标签
git tag 名字在当前提交上打 taggit tag 名字 hash在指定的提交上打 tag
查看特定标签
git show tagName 不光可以查看标签,给定哈希值可以查看各种对象
删除标签
git tag -d tagName
检出标签
git checkout tagName 此时HEAD会移动到该tag上,但是此时不属于任何分支,因此做的提交操作除非使用hash访问,都是无效的,因此在检出后,应该在此位置新建一个分支来进行后续的操作
10. Git特点
- 直接记录快照,而非差异比较
- 近乎所有操作都是本地执行
- 时刻保持数据完整性
- 多数操作仅添加数据
- 文件的三种状态:已修改、已暂存、已提交
二、代码风格
1. Eslint
一个开源的 JS 代码检查工具
使用
- npm 安装:
cnpm i eslint --save-dev - 在package.json中配置
"scripts": { "test": "echo \"Error: no test specified\" && exit 1", "lint": "eslint src", // 校验代码的程序,自动检验src目录下所有的js文件 "lint:create": "eslint --init" // 生成 eslintrc.js 文件,提供编码规范 }, - 运行命令按照提示生成 eslintrc.js 文件,然后就可以对文件进行检查
2. husky
- eslint需要手动调用命令来检查代码风格,可以使用 husky 来在每次git提交前自动检查
- 注意:需要初始化git仓库以后再安装 husky
- 配置:
"eslint": "^8.11.0"
"husky": "^7.0.4"
在上面版本的条件下,安装好 husky 后(全局安装)
1. 执行:husky install
2. 执行:npx husky add .husky/pre-commit "npm run lint"
此时就会在提交前对提交的代码进行检查,如果不通过就无法进行提交
上述配置参考 https://zhuanlan.zhihu.com/p/366786798
三、远程仓库
1. 远程协作基本流程
创建远程仓库
在GitHub上创建新的空仓库(不要生成README文件和.gitignore文件)
创建本地库
完成本地代码框架的搭建
为远程仓库配置别名和用户信息
git remote add 别名 远程仓库地址 配置别名
git remote -v 查看配置好的别名列表
推送本地项目到远程仓库
git push 别名 分支名
成员克隆远程仓库到本地
git clone 远程仓库地址 此时默认的别名是 origin
成员提交代码
提交代码需要得到仓库的授权
其他成员获取仓库更新的代码
git fetch 别名如果忘了别名可以用git remote -v查看- 此时更新的代码内容在远程分支上,需要在本地的主分支上对远程分支的代码内容进行合并
2. 深入理解远程库
远程分支
远程跟踪分支
- 是远程分支状态的引用,是不能移动的本地分支,在进行网络通信操作时,它们会自动移动
- 以
别名/分支名形式命名 - 当克隆一个仓库时,它通常会自动地创建一个跟踪 origin/master 的 master 分支
本地分支
- 只有在克隆的时候,本地分支与远程跟踪分支才是有同步关系的
- 可以推送本地分支到远程分支
git push origin localBranch:remoteBranch
可以将本地的 localBranch 推送到远程的 remoteBranch 上
git checkout -b branch origin/branch
git checkout --track origin/branch
可以直接在本地创建一个分支来跟踪远程分支(同名),可以单独为本地分支指定名字,此时只能用第一个命令
git branch -u origin/branch
显式的指定当前分支要跟踪的远程分支
本地提交一个新的分支到仓库,是不会自动创建分支的跟踪关系的
git branch -vv
查看设置的所有跟踪分支
分支具有跟踪关系后可以直接 git pull 拉取代码,git push 提交代码,不需要任何其他的指定
删除远程分支
git push origin --delete 分支名 删除远程分支
git remote prune origin --dry--run 列出仍在远程跟踪但是远程已被删除的无用分支
git remote prune origin 清除上面命令列出来的远程跟踪
SSH
生成公私钥:ssh-keygen -t rsa -C 邮箱
.ssh文件位置:C:\Users\用户名.ssh
测试公私钥是否已经配对:ssh -T git@github.com
3. 忽略某些文件
.gitignore 的格式规范
所有空行或者以注释符号 # 开头的行都会被忽略
可以使用标准的 glob 模式匹配
- * 代表匹配任意个字符
- ? 代表匹配任意一个字符
- ** 代表匹配多级目录
匹配模式前跟反斜杠 代表项目根目录
匹配模式最后跟反斜杠 说明要忽略的是目录
忽略指定模式以外的文件或目录,可以在模式前加上感叹号 取反
Github 上有提供一些框架开发时的 .gitignore 文件,可以直接使用
本文详述了Git的基本操作,包括安装、配置、版本控制、分支管理和远程仓库协作流程。介绍了Git的底层概念,如工作区、暂存区、版本库和Git对象。此外,还讲解了代码风格检查工具Eslint和husky的使用,以及如何创建和管理远程仓库。文章强调了Git的本地执行、数据完整性和直接快照记录等特点。
1669

被折叠的 条评论
为什么被折叠?



