Git原理简述

这篇具有很好参考价值的文章主要介绍了Git原理简述。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

简介

git是一个分布式版本控制软件,最初由林纳斯创造,于2005年以GPL许可协议发布。最初的目的是为了更好地管理Linux内核开发而设计。
git最初的开发动力来自于BitKeeper和Monotone。git最初只是作为一个可以被其它前端包装的后端而开发的,但后来git内核已经成熟到可以独立地用作版本控制。

Git的命名

The name “git” was given by Linus Torvalds when he wrote the very first version. He described the tool as “the stupid content tracker” and the name as (depending on your way):

  • random three-letter combination that is pronounceable, and not actually used by any common UNIX command. The fact that it is a mispronunciation of “get” may or may not be relevant.
  • “global information tracker”: you’re in a good mood, and it actually works for you. Angels sing, and a light suddenly fills the room.
  • stupid. contemptible and despicable. simple. Take your pick from the dictionary of slang.

林纳斯在编写第一个版本时就使用了“git”这个名称。 他将工具描述为“愚蠢的内容跟踪器”,并将其描述为(取决于您的方式):

  • 可以发音念出的随机三个字母组合,而且并未被实际用在任何 UNIX 指令上。它是“get”的错误发音,这点可能相关也可能无关。
  • “全球信息跟踪器”:您的心情不错,对你而言它也确实说得通。天使唱歌,房间突然充满光明。
  • 愚蠢的。鄙视和卑鄙的。简单。从俚语字典中选择。

实现原理

git是用C语言开发的,以追求最高的性能。
git和其它版本控制系统(如CVS)有很大的差别,git本身关系文件的整体性是否有改变,但多数的版本控制系统如CVS或Subversion系统则在乎文件内容的差异。git拒绝保持每个文件的版本修订关系。因此查看一个文件的历史需要遍历各个history快照;git隐式处理文件更名,即同名文件默认为其前身,如果没有同名文件则在前一个版本中搜索具有类似内容的文件。
git更像一个文件系统,直接在本地上获取资料,不必连线到主机端获取资料。每个开发者都可有全部开发历史的本地副本,changes从这种本地repository复制给其他开发者。这些changes作为新增的开发分支被导入,可以与本地开发分支合并。
分支是非常轻量级的,一个分支仅是对一个commit的引用。
git存储每个新创建的object作为一个单独文件。为了压缩空间占用,packs操作把很多文件使用差分压缩入一个文件中(packfile),并创建一个对应的索引文件,指明object在packfile中的偏移值。新创建的对象仍然作为单独文件存在。repacks操作非常耗时,git会在空闲时间自动做此操作。也可用命令git gc来直接启动repack。packfile与索引文件都用SHA-1作为校验和并作为文件名。git fsck命令做校验和的完整性验证。

库目录

  • hooks:存储钩子的文件夹
  • logs:存储日志的文件夹
  • refs:存储指向各个分支的指针(SHA-1标识)文件
  • objects:存放git对象
byte ojects = tree | blob | commit
def store (o):
	id = sha(o)
	object[id] = o
def load (id):
	return object[id]
  • config:存放各种设置文档
  • HEAD:指向当前所在分支的指针文件路径,一般指向refs下的某个文件

数据结构

git有两种数据结构:可变的索引(index、stage或cache)用于缓冲工作目录信息与下一次提交的版本信息;不变的、仅追加的对象数据库。
Git原理简述,Linux,git,云原生,unix

对象数据库

对象数据库包括4类对象(用其内容的SHA-1哈希值标识:哈希值的前两个字符作为存放的目录名字,其余哈希字符昨晚这个对象的文件名):

blob(二进制大对象)

使用zlib压缩算法对一个文件的内容压缩后的结果。blobs没有保存文件名、时间戳或其他元数据。git将其存储在位于隐藏的.get/objects文件夹中。文件的名称为使用SHA-1哈希函数对原文件内容生成的哈希值。这些对象文件称为blob,每次将新文件添加到存储库时会创建blob对象。
byte blob = array<byte>

tree

tree对象对应于文件目录。包含文件名列表以及文件的类型比特、到blob(对应于文件)或tree对象的引用。tree对象是源树的快照,用默克尔树实现。
byte tree = map<byte, blob | tree>
Git原理简述,Linux,git,云原生,unix

commit

commit对象链接tree对象在一起而成为history,包含顶层源目录的tree对象名字、时间戳、log信息、0个或多个父commit对象的名字。用于保存特定版本的树形文件夹结构以及提交作者、电子邮件地址、日期和描述性提交消息。

byte commit = struct {
  parents array<commit>;
  String author;
  String message;
  tree snapshot;
}

tag

tag对象是一个容器,包含了到另一个对象的应用,也可以增加关于另外对象的元数据。通常它保存需要追溯的特定版本数据的commit对象的数字签名。

引用类型

git数据库中不变引用的对象将会被垃圾回收清楚。git命令可以创建、移动、删除引用。git show -ref列出所有引用。

heads:引用一个本地对象,是commit的指针

每个head可以指任意一个这样的指针。可以包含任意数量的heads。而“HEAD”,仅仅指的是当前有效的head。默认情况下,在每个仓库下都有一个head,叫做master。

remotes

引用远程repository中的一个对象

stash

引用一个还没有committed的对象

meta

一个bare repository中的配置,用户权限;refs/meta/config命名空间等

tags

某些操作(例如,将提交推送到远程存储库,存储太多对象或手动运行git的垃圾收集命令)可能会导致git将对象重新打包为打包文件,在打包过程中,采用反向差异并进行压缩以消除多余的内容并减小尺寸。该过程将生成包含对象内容的.pack文件,每个文件都有一个对应的.idx索引文件,其中包含对打包对象及其在打包文件中位置的引用。当将分支推送到远程存储库或从远程存储库拉出分支时,这些打包文件将通过网络传输。提取或获取分支时,将打包文件解压缩以在对象存储库中创建松散对象。文章来源地址https://www.toymoban.com/news/detail-803333.html

常用指令

  • git init:初始化一个git仓库
  • git clone:clone一个git仓库
  • git config:配置信息
  • git add:添加文件到缓存命令
  • git status:查看文件的状态命令
  • git diff:查看更新的详细信息命令
  • git commit:提交命令
  • git reset HEAD:取消缓存命令
  • git rm:删除命令
  • git mv:移动或重命名命令
  • git branch:查看分支命令
  • git branch (branchname):创建分支命令
  • git checkout (branchname):切换分支命令
  • git merge:合并分支命令
  • git branch -d (branchname):删除分支命令
  • git log: 查看历史
  • git log --all --graph --decorate:log美化
  • git tag: 创建git标签
  • **git tag -a *****:创建一个新的标签
  • git remote add:添加远程仓库
  • git remote:查看当前的远程仓库
  • git fetchgit pull:提取远程仓仓库
  • git push:推送到远程仓库
  • git remote rm:删除远程仓库
  • git cat-file -p hashValue:查看详细的提交内容

参考资料

  • Wiki百科 https://zh.wikipedia.org/wiki/Git
  • MIT公开课

到了这里,关于Git原理简述的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Git简介与工作原理:了解Git的基本概念、版本控制系统和分布式版本控制的工作原理

    🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍》学会IDEA常用操作,工作效率翻倍~💐 🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬

    2024年02月16日
    浏览(64)
  • git内部原理

    项目的本地仓库中,包含一个隐藏的.git目录,其不同的文件产生都源于git的各种不同命令造成,文件目录如下所示: 上面最核心重要的为object目录,目录最主要有三个对象,分别为blob、commit、tree对象,结合下面图来理解应该会比较容易一点

    2024年01月23日
    浏览(24)
  • git原理与使用

    假设你的老板要你设计一个文档,当你设计好了,拿给他看时,他并不是很满意,就要你拿回去修改,你修改完后,再给他看时,他还是不满意,经过多次修改,他觉得还是你之前的第三次修改后的文档好,最终决定采用第三次修改后的文档,但因为前面你都是在一个文档上

    2024年02月14日
    浏览(23)
  • 【Git原理与使用】

    博主主页 :桑榆非晚ᴷ 博主能力有限,如果有出错的地方希望大家不吝赐教 给自己打气 :成功没有快车道,幸福没有高速路。所有的成功,都来自不倦地努力和奔跑,所有的幸福都来自平凡的奋斗和坚持🥰🎉✨ 1.2.1 Linux — centos 要提前说的是, 仓库 是进⾏版本控制的⼀

    2024年02月11日
    浏览(19)
  • Git--原理与使用

    1. 技术⽬标 :掌握Git企业级应⽤,深刻理解Git操作过程与操作原理,理解⼯作区,暂存区,版本库 的含义。 2. 技术⽬标 :掌握Git版本管理,⾃由进⾏版本回退、撤销、修改等Git操作⽅式与背后操作原理。 3. 技术⽬标 :掌握Git分⽀管理,从分⽀创建,切换,合并,删除的整个

    2024年04月29日
    浏览(22)
  • Git 原理与使用

    所谓的版本控制器,就是能让你了解到⼀个⽂件的历史,以及它的发展过程的系统。通俗的讲就是⼀个可以记录⼯程的每⼀次改动和版本迭代的⼀个管理系统,同时也⽅便多⼈协同作业。 ⽬前最主流的版本控制器就是 Git 。Git 可以控制电脑上所有格式的⽂件,对于我们开发⼈

    2024年02月11日
    浏览(23)
  • Git 原理和使用

    Git是开放源代码的代码托管⼯具,最早是在Linux下开发的。开始也只能应⽤于Linux平台,后⾯慢慢的被移植到windows下,现在,Git可以在Linux、Unix、Mac和Windows这⼏⼤平台上正常运⾏了。 安装git 安装好之后就可以,查看git版本  安装git 安装好之后就可以,查看git版本 要提前说的

    2024年02月11日
    浏览(24)
  • git原理和常用命令

    git -分布式版本控制系统,可以有效、高速的处理从很小到非常大的项目版本管理。 git特点 优点: 适合分布式开发,强调个体; 公共服务器压力和数据量都不会太大; 速度快、灵活; 任何两个开发者之间可以很容易的解决冲突; 离线工作。 缺点: 代码保密性差,一旦开

    2024年02月09日
    浏览(39)
  • Git的原理与使用(一):Git的基本操作(包含:版本回退)

    Git是一个版本控制器 在这里我们重点介绍Linux操作系统下的Git的使用 因为在未来的开发过程中Linux操作系统的使用更为频繁 而且Git最初就是在Linux操作系统下面开发的 1.git命令与git help(Git下的\\\"man手册\\\") 首先我们可以使用git命令来查看我们有没有安装Git 如果结果是这样的 说明

    2024年02月05日
    浏览(36)
  • 深入剖析 Git 对象底层原理

    在我们日常使用 Git 时,通常的操作是: 在写完一段代码后,执行 git add 命令,将这段代码添加到暂存区中 然后再执行 git commit 和 git push 命令,将 本地 Git 版本库中的提交同步到服务器中的版本库中 Git 在中间做了什么,它如何存储不同的文件和内容,以及如何区分不同分支

    2024年01月20日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包