- Git简介
- Git是一种分布式控制系统,在这种系统中,客户端并不只是提取最新的文件快照,而是将代码仓库全部镜像到本地。如遇故障,可最快程度恢复项目文件。
- Git在进行项目管理时,存储的不是项目版本与版本之间的差异,而存的是索引,既每次的最新项目快照。最终每个客户端都可以获取项目的全部历史记录。
- Git 会使用操作系统默认的文本编辑器,通常是 Vim。Vim 和 Emacs 是像 Linux 与 Mac 等基于 Unix 的系统上开发者经常使用的流行的文本编辑器。
- Git 中所有数据在存储前都计算校验和,Git 数据库中保存的信息都是以文件内容的哈希值来索引,而不是文件名。
- Git 有三种状态:已提交(committed)、已修改(modified)和已暂存(staged,基本的 Git 工作流程如下:
- 在工作目录中修改文件。
- 暂存文件,将文件的快照放入暂存区域。
- 提交更新,找到暂存区域的文件,将快照永久性存储到 Git 仓库目录。
- Git 自带一个 git config 的工具来帮助设置控制 Git 外观和行为的配置变量。git –version 版本检查
- /etc/gitconfig 文件: 包含系统上每一个用户及他们仓库的通用配置。
- ~/.gitconfig 或 ~/.config/git/config 文件:只针对当前用户。
- .git/config:针对该仓库。
- git用户信息配置,主要用于识别coder
- git config –global user.name “ “
- git config –global user.email examples@examples.com
- git config –list 检查配置信息
- Git初始化配置
- 在目标文件夹右键Git Bash Here,即新建git仓库
- git仓库目录
- hooks 客户端或服务器端的钩子脚本
- info 一个全局性排除文件
- objects 所有数据内容
- refs 指向分支数据的提交对象的指针
- HEAD 文件指示目前被检出的分支
- index 文件保存暂存区信息
- config 包含项目的特殊配置选项
- description 用来显示仓库的描述信息
- Git底层命令
- Linux命令
- clear 清除屏幕
- echo ‘ ‘ 向控制台文件输出信息 echo ‘version’ >text.txt,即是向该文本中输入version内容
- ll 输出当前目录下的子目录和子文件到控制台
- find 文件夹 :输出当前文件夹下的子孙文件及子孙目录到控制台
- find ./ -type f 表示输出当前目录下的所有文件
- rm 文件 :删除文件
- mv 文件 :文件重命名
- cat 文件名:查看对应文件的内容
- vim 编辑器(En输入状态)
- vim 文件名,然后按 i 变成插入模式编辑
- 按下esc 并输入:进行命令的执行
- esc 退出插入模式
- wq 保存退出
- set nu 设置行号
- git对象
- 向数据库存入数据,git对象在.git/objects目录下
- git中的数据是以哈希值作为索引的。
- echo ‘hello world’ | git hash-object –stdin 返回指定内容的哈希值
- echo ‘hello world’ | git hash-object -w –stdin 数据写入数据库,保存为哈希值
- –stdin是指向当前新建内容的路径,对于已有的文件,此处换成路径即可
- 已有文件:git hash-object -w ./go.txt
- git cat-file -p 哈希值 ,用来输出对象的内容
- git cat-file -t 哈希值 ,用来示意存储的对象类型
- 已经存入数据库的文件内容,若想同步更改的内容,需要再次执行git hash-object -w 路径,生成新的哈希值,即完成文件内容的更迭。
- git对象所存入数据库的只是文件的内容,即存储的形式以文件内容作为起始而非以文件名作为起始。
- 文件内容多次修改,就同步多个哈希值,每次获取相应的内容要输入不同的冗长的哈希字符
- 上面所用方式均是直接提交到数据库,没有涉及暂存区的内容
- 向数据库存入数据,git对象在.git/objects目录下
- 树对象
- 把文件放进暂存区,再提交成为树对象。暂存区文件在.git/index 中
- git update-index –add –cacheinfo 100644 \ 哈希值 文件名
- –add 指的是首次加入到暂存区
- –cacheinfo 指的是要添加的文件位于数据库中
- 生成文件树对象,即是将暂存区的项目生成文件快照
- git write -tree
- 查看暂存区
- git ls-files -s
- 查看树对象
- git cat-file -p 哈希值
- 一般在项目尚未完成之前,需要将修改和新增的文件放入暂存区,待到时机成熟,执行git write-tree命令,生成文件树,即产生项目的新一个版本
- 把一个树对象捆绑在另一个树对象上
- 这种捆绑是指将发生改动的一个文件联系在一起,形成一个脉络网
- git read-tree –prefix=bak 树对象哈希值 ,即可完成绑定
- git write-tree 生成一个新的树对象,可以清晰看到版本的更迭
- 把文件放进暂存区,再提交成为树对象。暂存区文件在.git/index 中
- 树对象流程
- 创建一个新文件1,提交到数据库,放入暂存区,执行git write-tree,这其中生成了一个git对象和tree对象
- 修改文件1,创建新文件2,然后提交到数据库,放入暂存区,执行git write-tree,这时候暂存区修改的新文件覆盖旧的文件,于是又生成了2个git对象,1个新的tree对象
- 将前一个树对象加到第2个树对象上
- 流程示意图
- 提交对象
- echo ‘ ‘ | git commit -tree 树对象哈希值 ,完成首次提交
- echo ‘ ‘ |git commit-tree 第2个树对象哈希值 -p 父对象哈希值(即上次提交对象)
- 提交对象的格式
- 顶层对象,即当前项目快照
- 作者/提交者信息+时间戳
- 留空一行
- 提交注释
- 可以得出结论:提交对象是一个封装对象,封装了树对象以及相关的信息,而且提交对象是一个链式的关系,它可以追溯到父对象,进而是实现版本控制
- 关系图
- Linux命令
- Git高层命令
- 高层命令一
- git init 初始化仓库
- git add ./ 生成git对象,存入暂存区
- git hash-object -w 文件路径
- git update-index –add –cacheinfo 100644 \ 哈希值 文件名
- git commit -m “ 注释内容 “
- git write-tree 生成树对象
- git commit-tree 提交对象
- 高层命令二
- 文件跟踪
- 未跟踪文件 :未进行add ./命令操作,即是没有进入数据库
- 已跟踪文件:已进行add./命令操作,存在3中状态:已修改,已暂存,已提交
- git status 检查当前文件状态,已修改显示红色,已暂存显示绿色,已提交无提示
- git diff 查看哪些文件修改而没有暂存
- git diff –staged 查看哪些文件已暂存而没有提交
- git commit -m “少注释模式”
- git commit 回车进入vim编辑注释模式
- git commit -a 跳过暂存区,直接提交,对于已经暂存过的文件
- git log 查看历史日志信息
- git log –oneline 查看提交记录
- git rm 文件名 删除文件并将修改加入暂存区
- git vm 文件名 重命名文件并将修改加入暂存区
- 文件跟踪
- Git分支
- 分支即是所指定的提交对象,不过是由HEAD确定指向哪个提交对象,切换HEAD的指向即是切换到新分支
- HEAD默认是指向master分支,每次提交更新,HEAD会跟随分支往前移动
- 创建分支
- git branch 显示分支列表
- git branch 分支名称 创建一个新的分支
- HEAD指向当前的分支
- 切换分支
- git checkout 分支名称
- 创建并且切换到该分支
- git checkout -b 分支名称
- 删除分支
- git branch -D 分支名称 强制删除分支
- git branch -d 分支名称 删除分支
- 为了避免HEAD指向一个空的分支,先要切换到主分支,git checkout master
- 查看最后一次分支提交对象
- git branch -v
- 创建一个新分支指向特定的提交对象,即是创建一个新分支回到某个提交版本
- git branch 名称 提交对象哈希值
- 查看所有分支的提交记录
- 命令:git log –oneline –decorate –graph –all
- 配置别名 git config –global alias.自定义名称 “log –online …”
- 切换分支操作的弊端:
- 当从一个有很多新增文件的新分支切换到master分支时,工作目录会复原到maser的节点状态
- 切换分支影响了3个地方:
- HEAD 指针
- 暂存区
- 工作目录
- 所以在切换分支前当前分支要做好提交工作,防止切换分支引起文件丢失
- 合并
- git checkout master ,切换到主分支
- git merge 分支名称 ,合并
- fast-forword , 快进合并,主分支往前移,合并掉新分支
- 并行合并,主分支合并掉分支后与分支的合并
- git存储
- 保存当前的项目修改,使其没有真正提交,而又能切换到其他分支进行开发,等再次使用时直接调用该项目
- 对于一个没有完成的项目而言,反复的提交对象会增加版本库的储存,也会使版本变得混乱,所以要确保项目改动完毕后再进行提交
- git stash list , 查看已有的存储,即还在进行的分支项目
- git存储后和git commit 的git status 状态是一样的
- git stash 将未完成的修改文件保存在一个栈上
- git stash apply 在任何时候应用这些改动
- git stash drop 栈上元素 ,删掉该栈内元素
- git stash pop 应用存储后立即在栈内扔掉它
- git stash +git stash drop的组合使用
- Git撤销操作
- 根据git提示命令撤销暂存和工作目录
- git restore
… , 撤销工作目录文件的修改,使其回到原状态 - git restore –staged
… , 撤销暂存区的文件到工作目录,已修改未暂存的状态
- git restore
- 其它方法来撤销暂存和工作目录
- git checkout
, 撤销工作目录文件的修改,使其回到原状态 - git reset HEAD
, 撤销暂存区的文件到工作目录,已修改未暂存的状态
- git checkout
- git commit –amend , 撤销提交,修改当前提交的注释信息,完成1次提交
- 根据git提示命令撤销暂存和工作目录
- Git撤销操作的底层命令解释
- git reset -soft HEAD~ 实际上等价于 git commit –amend
- HEAD即是对应的提交对象的哈希值
- 执行该命令,HEAD带着分支一起移动,
- 本质上是撤销了最近一次的git commit命令,当再次运行git commit时,git会创建一个新的提交,并移动HEAD所指向的分支指向该提交对象
- git reset [–mixed] HEAD~ 实际上等价于 git reset HEAD
- 执行该命令,HEAD带着分支一起移动,
- 改变了暂存区
- git reset HEAD
, 只改变暂存区
- git reset –hard HEAD~ 实际上等价于 git checkout ,git checkout 其后可以跟上文件名,就等于 git checkout
的操作 - –hard 属于危险的命令操作
- 该命令改变了版本库,暂存区,工作目录
- git checkout commithash 与 git reset –hard HEAD~ 的比较
- git checkout commithash
- 只移动HEAD
- 它通过检查来确保修改的文件不丢失
- 实际场景:当新分支文件尚未完成,没有进行存储和提交,突然切换到其他分支时,其他分支在覆盖工作目录,暂存区和提交对象时会检查这些修改的文件并一块带走。
- git reset –hard HEAD~
- HEAD带着分支一起移动
- 强制切换
- git checkout commithash
- git reset -soft HEAD~ 实际上等价于 git commit –amend
- Git tag 打标签
- git tag 列出标签
- git tag 标签名 ,创建标签
- git tag 标签名 哈希值 , 给特定提交对象打标签
- git show 查看标签
- git tag -d 标签名称 , 删除标签
- 标签分类
- 轻量标签
- 特定提交的引用
- 附注标签
- 存储在数据库的完整对象,它可以被检验,包含打标签的名字,电子邮件,日期时间
- 轻量标签
- Eslint 代码检查
- Eslint是一个第三方的js语法检查工具,它基于node.js 编写
- npm install eslint –save dev ,安装eslint
- npx eslint init , 初始化配置
- npx eslint .src/*.js ,测试src目录下的js 文件
- 高层命令一
- Git远程仓库
- 添加一个新的远程仓库,为该仓库添加别名
- git remote add
别名 远程仓库地址
- 显示远程仓库的别名以及url
- git remote -v
- 查看一个远程仓库的更多信息
- git remote show [remote-name]
- 推送本地仓库到远端
- git push [remote-name] [branch-name]
- branch-name, 是本地分支的名称
- remote-name , 是远程仓库的别名
- 克隆远端仓库到本地
- git clone 项目地址、
- 同步远端仓库的数据
- git fetch 分支名称
- 查看所有跟踪分支
- git branch -vv
- 正常数据推送和拉取步骤
- 确保本地仓库已经跟踪了远程跟踪分支
- git pull , 拉取数据
- git push , 上传数据
- 对于没有跟踪远程分支的情况
- git push [remote-name] [branch-name],基本推送方式
- 让本地分支去跟踪一个远程分支
- 在克隆项目时,已经自动生成了一个本地分支master去跟踪相应的远程分支
- 在新建其他分支时,可以指定要跟踪的远端分支
- git checkout -b 本地分支名 远程跟踪分支
- git checkout -track 远程跟踪分支
- 将一个创建好的本地分支,变成一个跟踪分支去跟踪远程跟踪分支
- git branch -u 远程跟踪分支
本文作者: moofing
本文链接: https://moofing.gitee.io/posts/b93f88f2.html
版权声明: 本文采用 CC BY-NC-SA 4.0进行许可,转载或引用时请遵守该协议