Git基础使用总结

Git | 本篇文章共3.5k字,预计阅读12分钟
文章目录
  • 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/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 生成一个新的树对象,可以清晰看到版本的更迭
    • 树对象流程
      • 创建一个新文件1,提交到数据库,放入暂存区,执行git write-tree,这其中生成了一个git对象和tree对象
      • 修改文件1,创建新文件2,然后提交到数据库,放入暂存区,执行git write-tree,这时候暂存区修改的新文件覆盖旧的文件,于是又生成了2个git对象,1个新的tree对象
      • 将前一个树对象加到第2个树对象上
      • 流程示意图 tree.png
    • 提交对象
      • echo ‘ ‘ | git commit -tree 树对象哈希值 ,完成首次提交
      • echo ‘ ‘ |git commit-tree 第2个树对象哈希值 -p 父对象哈希值(即上次提交对象)
      • 提交对象的格式
        • 顶层对象,即当前项目快照
        • 作者/提交者信息+时间戳
        • 留空一行
        • 提交注释
        • 可以得出结论:提交对象是一个封装对象,封装了树对象以及相关的信息,而且提交对象是一个链式的关系,它可以追溯到父对象,进而是实现版本控制
        • 关系图 commit.png
  • 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 checkout , 撤销工作目录文件的修改,使其回到原状态
        • git reset HEAD , 撤销暂存区的文件到工作目录,已修改未暂存的状态
      • git commit –amend , 撤销提交,修改当前提交的注释信息,完成1次提交
    • 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 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进行许可,转载或引用时请遵守该协议