git版本控制工具的原理及常用指令

本文详细介绍了Git版本控制系统的工作原理,包括其底层数据模型(快照和图结构)、常用的命令如gitinit,commit,log等,以及远程仓库的管理。重点讲述了git如何处理合并冲突和使用哈希表优化存储。
摘要由CSDN通过智能技术生成

1.版本控制工具

跟踪源代码或其他文件的修改记录的工具
支持多人协作

原理:通过维护一系列快照实现;额外维护了作者及提交时间戳等元数据

1.1 底层数据模型

git将历史记录建模为某个顶层目录中的文件和文件夹的集合。

目录称为“tree”,文件称为“blob”

(1)使用有向无环图来模拟历史。
之所以使用图结构而非线性结构,是因为可以并行进行不同功能的开发工作,例如,有一个可以正常运行的基础版本,有人进行添加新功能的工作,有人进行修复bug的工作,这些最好可以并行进行,不互相打扰。最后再进行合并工作。
在这里插入图片描述

  1. 出现合并冲突如何解决(修复bug的工作影响到新特性或新特性的实现掩盖了之前的bug)?
    会报告合并冲突,需要用户自己决定

(2)git内部如何表示这个数据结构

Commit代表快照,合并提交有多个父节点,额外元数据,snapshot里面存放真正的内容
在这里插入图片描述

1.1.1 原理

(1)git维护了一个对象的哈希表objects。对象可以是blob、tree和commit(快照)。通过哈希表存储对象或检索对象。对象id通过哈希函数(例如SHA-1)生成。
哈希表负责实际对象的存储,在commit的数据结构中的元素,实际上都是指针形式,指向实际元素,因此代价不高。

(2)blob 对象只存储文件的实际内容,不包括文件名等信息。

tree 对象存储目录结构信息,包括每个文件的权限、类型、对应SHA-1值、文件名等。

commit,它储存的是一个提交的信息,包括对应目录结构的快照tree的哈希值,上一个提交的哈希值,提交的作者以及提交的具体时间,最后是该提交的信息。

1.1.2 命令

(1)-t可以查看object的类型,-p可以查看object储存的具体内容

git cat-file -t 58c9   其中58为目录名,c9为文件名前2位

(2)

在这里插入图片描述
(3)SHA-1生成的是40大小的16进制字符串,这些ID对人类来说不易查看。
使用哈希表映射一个人们便于理解的字符串。称为引用(refs)

1.2 常用命令

  1. git init ,初始化仓库,会创建.git目录,所有的仓库数据将存放在objects和refs两个目录下。
    默认会创建一个名为"master"的引用,代表代码中的主开发分支
    “HEAD”是git中的特殊引用,指向你当前正在查看的提交

  2. git status ,查看仓库状态

  3. git add filename;添加跟踪文件
    (1)git有一个称为staging area(暂存区)来保存下一次创建快照时应该保存的更改;新创建的文件一般是Untracked files(未跟踪),即在下次快照中不会保存此文件。
    (2)跟踪的文件修改后,也需要暂存

  4. git commit, 创建快照,会启动文本编辑器,编写提交消息(移动分支指针)
    并且会输出结点的哈希值,例如a15cebf

  5. git cat-file -p 哈希值,可以查看该哈希值对应对象

  6. git log,可以查看版本历史记录(以线性形式)
    git log --all --graph --decorate;以图的形式显示
    git log --all --graph --decorate --oneline;信息更精简

  7. git checkout 哈希值;改变当前工作目录的状态到指定的那个提交
    git checkout 其他引用(例如master);实际上是移动了HEAD指针,并根据该指针改变了当前工作目录的内容

git checkout --file

  1. git diff filename;显示自HEAD指向的快照以来发生了哪些改变
    git diff 哈希值 filename;显示自指定快照以来发生的改变
    git diff 哈希值 哈希值 filename;显示两个指定快照之间发生的改变

  2. git branch;列出本地所有分支;访问分支作用
    git branch 新分支名;创建一个新的分支,新分支名目前只是一个指向当前位置的引用
    需要注意的是:若像向上面一样的结点图,进行并行开发,需要在master处创建两个分支,分别修改后,master对这些分支逐一合并。

git branch -d 分支名;删除分支

  1. 分支切换
    git checkout 分支名;切换到其他分支
    git checkout -b 新分支名;创建并切换到新分支
  2. git merge;分支合并
    出现分支冲突,需要手动调整,注意修改文件后需要重新添加到暂存区
    git merge --continue;解决分支冲突后继续执行

1.3 远程仓库

  1. git remote;列出当前仓库所知道的所有远程仓库
    git remote add < name> < url>;添加远程仓库,如果只使用一个仓库,使用名称为origin

  2. git push < remote> < local branch >:< remote branch >;在远程仓库创建一个新分支或更新上面的分支,改为本地指定分支的内容

  3. git fetch;获取仓库最新更改,不会更改本地历史记录及本地引用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值