Git相关 | 青训营笔记

116 阅读4分钟

前言

理解git、使用git

是什么

版本控制系统用于跟踪、维护源代码、文档以及配置文件等的改动,有利于协作、备份、纠错。

分布式系统是跨独立计算节点的软件系统。

git是分布式版本控制系统,每个节点都有本地仓库进行版本控制。

image.png

实现

  • 工作区:用户工作区域

  • 版本库:工作区同目录下隐藏的.git目录

  • 暂存区:.git/index目录下

.git目录: 存储git仓库的所有数据

$tree -L 1 -F
.
├── COMMIT_EDITMSG
├── HEAD
├── config
├── description
├── hooks/
├── index
├── info/
├── logs/
├── objects/
└── refs/

5 directories, 5 files

objects目录: 存储git仓库的对象(blob、commit、tree),每个对象以其hash值(实质是sha-1算法)前两个字符为目录,后续字符为文件名创建相应的文件

  • commit对象 是git仓库的一个版本的入口对象,指明了顶层tree对象和父commit对象,记录版本间的时序关系和版本注释。

  • tree对象 类似于目录节点包含一条或多条记录,每条记录含有一个指向blob对象或tree对象的SHA-1指针,以及相应的模式、类型、文件名。(直接在暂存区添加时为顶层tree)

  • blob对象 存储普通文件的数据,git数据库存储文件时,只关心文件内容,与文件的名字无关。

index目录:暂存区,暂存tree对象,blob对象会被保存到本地仓库,暂存区的文件索引保存blob对象的ID。

refs目录: 下面的branch和tag目录存分支和标签(重要版本),实际是一个指向某个commit对象的指针

过程

通过一个commit对象、root tree对象和若干tree对象和blob对象组成一个版本,未发生变更的对象可利用树对象的对应关系不重复创建。

  • git add添加树对象到暂存区,新增或修改文件添加到本地仓库,暂存区记录该对象的ID

  • git commit暂存区的树对象写到本地库,默克尔树(Merkle Tree)判断变化

image.png

默克尔树

默克尔树是一类基于哈希值的二叉树或多叉树,其叶子节点上的值通常为数据块的哈希值,而非叶子节点上的值,是将该节点的所有孩子节点的组合结果的哈希值。默克尔树的特点是,底层数据的任何变动,都会传递到其父亲节点,一直到树根。对应git来说,叶子节点对应的就是每个文件的hash值,tree对象对应的是中间节点。因此,通过默克尔树(Merkle Tree)的特性,我们可以快速判断哪些对象对应的目录或文件发生了变化,应该重新创建对应的object。

image.png

github

GitHub是一个在线软件源代码托管服务平台,支持托管代码、历史版本管理。

image.png

使用

  • git init

  • git clone [url]

  • git add [file1] [file2] ... || git add [dir] || git add .

  • git status -s

  • git diff

  • git commit -m [message] || git commit [file1] [file2] ... -m [message] || git commit -a(跳过add)

  • git reset [--soft | --mixed | --hard] [HEAD]

    mixed默认可省略,重置暂存区的文件与上一次的提交一致

    soft参数用于回退到某个版本

    hard参数撤销工作区中所有未提交的修改内容,将暂存区与工作区都回到上一次版本,并删除之前的所有信息提交

    HEAD当前版本,HEAD^ 上个版本,HEAD~0当前版本,以此类推

  • git rm [-f || --cached] 将文件从暂存区和工作区中删除 git rm –r [目录] 递归删除目录下文件

  • git mv [-f] [file] [newfile] 用于移动或重命名一个文件、目录或软连接

  • git log提交历史

    --oneline 选项来查看历史记录的简洁的版本

    --graph 选项,查看历史中什么时候出现了分支、合并。

    --reverse 参数来逆向显示所有日志

    --author=[username]指定用户的提交日志

    --since 和 --before,但是你也可以用 --until 和 --after,限定时间{3.weeks.ago}、{2010-04-18}

  • git blame 指定文件修改记录

  • git remote -v显示所有远程仓库

    git remote show [remote]显示某个远程仓库的信息

    git remote add [shortname] [url]添加远程版本库

    git remote rm name # 删除远程仓库 git remote rename old_name new_name # 修改仓库名

  • git fetch [alias]命令用于从远程获取代码库

  • git merge [alias]/[branch]合并到你的当前分支

  • git pull其实就是 git fetch 和 git merge FETCH_HEAD 的简写,git pull <远程主机名> <远程分支名>:<本地分支名>

  • git push 命令用于从将本地的分支版本上传到远程并合并git push <远程主机名> <本地分支名>:<远程分支名>如果本地分支名与远程分支名相同,则可以省略冒号后的