Git 笔记

本文详述了Git的基本操作,包括安装、配置、版本控制、分支管理和远程仓库协作流程。介绍了Git的底层概念,如工作区、暂存区、版本库和Git对象。此外,还讲解了代码风格检查工具Eslint和husky的使用,以及如何创建和管理远程仓库。文章强调了Git的本地执行、数据完整性和直接快照记录等特点。
摘要由CSDN通过智能技术生成

一、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 对一个文件进行简单的版本控制

  1. 创建一个新文件并将其内容存入数据库
    echo 'dudu v1' > dudu.txt
    git hash-object -w dudu.txt
  2. 向文件里写入新内容,并再次将其存入数据库
    echo 'dudu v2' > dudu.txt
    git hash-object -w dudu.txt
  3. 查看数据库内容
    find .git/objects -type f

问题:

  1. 记住文件的每一个版本所对应的哈希值并不现实
  2. 在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 --cachedgit 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 refloggit log -g 来找到丢失的提交的哈希值,直接在该提交上创建一个新的分支,此时丢失的提交就是可到达的了

10. 打tag

列出标签
  • git tag 列出所有 tag
  • git tag -l 'v1.2.1*' 表示列出 1.2.1 后的 tag
创建标签
  • git tag 名字 在当前提交上打 tag
  • git 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 文件,可以直接使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值