likes
comments
collection
share

分布式版本控制工具Git入门及原理简介

作者站长头像
站长
· 阅读数 65

Git是什么

Git是一个分布式版本控制工具 , 最早是用于Linux内核开发的版本控制

为什么Linux内核开发使用Git

  • 速度
  • 对非线性开发模式的强力支持(允许上千个并行开发的分支)
  • 完全分布式
  • 有能力高效管理类似 Linux 内核一样的超大规模项目(速度和数据量)

版本控制

版本控制就是对文件变更过程的管理 ,把一个文件或一些文件的各个版本按一定的方式管理起来,目的是需要用到某个版本的时候可以随时使用。

本地版本控制系统(RCS)

通过复制整个项目目录的方式来保存不同的版本,加上备份时间进行区别。

  • 优势 简单。
  • 劣势: 容易混淆所在的工作目录,一旦弄错文件丢了数据就没法撤销恢复。 分布式版本控制工具Git入门及原理简介
集中式版本控制系统(SVN)

分布式版本控制工具Git入门及原理简介

  • 版本库是集中存放在中央服务器的 ,工作时使用自己的电脑从中央服务器取得最新的版本 ,工作结束后再把自己的修改推送给中央服务器
  • 优势:
  1. 每个人都可以一定程度上看到项目中的其他人正在做些什么。而管理员也可以轻松掌控每个开发者的权限.
  • 劣势
  1. 没有网络或者断开VPN你就无法做任何事情
  2. 中央服务器的单点故障,那么谁都无法提交更新、还原、对比等,也就无法协同工作 。如果没做过备份或者备份得不够及时的话,有丢失数据的风险。
分布式版本控制系统

分布式版本控制工具Git入门及原理简介

  • 没有 “中央服务器”,每个人的电脑上都是一个完整的版本库 ,当多人协作时 ,只需把各自的修改推送给对方,就可以互相看到对方的修改了.
  • 优势:
  1. 在分布式版本控制系统中,客户端并不只提取最新版本的文件快照,而是把原始的代码仓库完整地镜像下来. 这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复;
  2. 另外,因为Git在本地磁盘上就保存着所有有关当前项目的历史更新,并且Git中的绝大多数操作都只需要访问本地文件和资源,不用连网,所以处理起来速度飞快;
  3. 大多数操作本地进行,数度更快,不受网络与物理位置限制,不联网也可以提交代码、查看历史、切换分支等等.
  • 劣势:
  1. 学习周期相对而言比较长;
  2. 代码保密性差,一旦开发者把整个库克隆下来就可以完全公开所有代码和版本信息.

Git能做什么

从一般开发者的角度来看,git有以下功能:

  1. 从服务器上克隆完整的Git仓库 ,在单机上自己创建的分支上提交代码。
  2. 在单机上解决冲突 合并分支。

Git的工作流程

Workspace:工作区 Index / Stage:暂存区 Repository:仓库区(或本地仓库) Remote:远程仓库

分布式版本控制工具Git入门及原理简介

Git对象模型

Git是一个键值对的文件系统

指向对象的键

  • 每一个Objects使用SHA1算法加密成40位的HashCode ,HashCode的前两个字符用于命名子目录,余下的 38 个字符则用作文件名
  • Git不是简单的将数据内容进行Hash , 而是通过 数据长度 + 一个空格 + 数据内容 来进行Hash 。
  • .git/objects文件夹中会包含很多的子文件夹,其中Git对象保存在以其sha-1值的前两位为子文件夹、后38位位文件名的文件中

Git的对象

  • Blob 数据对象:存储文件系统中的文件的文件内容 分布式版本控制工具Git入门及原理简介
  • Tree 树对象:指向Blob对象或者其他树对象 ,相当于文件系统中的文件夹 分布式版本控制工具Git入门及原理简介
  • Commit 提交对象: 包含提交时间 提交备注 父提交ID 树对象的指针 分布式版本控制工具Git入门及原理简介

Git的快照

  • Git是把变化的文件进行快照后,记录在一个微型的文件系统中。每次提交更新时,它会浏览一遍所有文件的指纹信息并对文件进行快照,然后保存一个指向这次快照的索引。若文件没有变化,Git会指向上一次保存的快照链接 。 (所以每次commit时 ,git存储全新的文件快照)
  • Git的快照会保存两个指针:指向上一次提交的指针和指向一个tree,这个tree指向了当前状态下的所有文件(不论是以前生成的还是新生成的 ,保存了当前代码所有副本的引用) 分布式版本控制工具Git入门及原理简介

Git的快照系统与CVS等的区别

SVN快照

分布式版本控制工具Git入门及原理简介

  • 最主要的区别在于对待数据保存的方式 ,Git关心文件数据的整体是否发生变化 ,每一次commit时都会保存一次全部文件快照 ,git会保存这个快照的索引 。如果文件没有发生变化 ,那仅仅保存指向以前文件的索引 后者主要关心的是文件之间的差异 ,以文件的变更列表的形式存储信息(一组文件加上每个文件随着时间变更所累计的差异 ,往后的快照都只是记录之前版本和现在两者的变化信息

Git GC

  • Git每次提交都会提交整个文件的存储快照 ,容易导致代码仓库中存在太多的松散对象 .Git GC可以收集所有松散对象并将它们存入 packfile,合并这些 packfile 进一个大的 packfile,然后将不被任何 commit 引用并且已存在一段时间 (默认是半个月) 的对象删除。 此外,Git还会将所有引用 (references) 并入一个单独文件。

  • 一般是用户手动操作Git gc ,Git也会不定时地自动运行auto gc命令

    • --prune : 回收早于指定日期的对象

Git的分支

  • Git的分支本质就是指向一个commit对象的可变指针 ,从分支指向的对象往回看就是一整条分支
  • Git通过一个特殊的指针 HEAD 来指向当前正在工作中的本地分支 分布式版本控制工具Git入门及原理简介
  • Git如何保证历史记录不被篡改

常用命令

  • git add :把工作目录的文件放入暂存区域(标记工作目录中状态为 未追踪 的文件)

  • git commit : 将暂存区域内的文件生成一份快照 ,将快照传入本地仓库 ,并将本地仓库中的HEAD指针指向这次最新的commit

  • 当git commit时 ,git会首先会计算每一个子目录的校验和 ,然后将这些校验和保存为树对象 ,随后创建一个commit对象 (之所以要创建commit对象 是因为commit对象除了要保存文件快照指针以外 ,还要保存作者的信息 ,父对象的指针以及项目根目录指针)

分布式版本控制工具Git入门及原理简介

  • git commit -amend :使用与当前提交相同的父节点进行一次新提交,将上一次commit取消

  • 将修改的代码 git add .

  • 使用git commit -amend 分布式版本控制工具Git入门及原理简介

  • git reset : 用于撤销之前的commit ,

  • git reset --mixed (或者不加参数) : 保留工作目录区的内容 ,清空暂存区的内容(也就是说没有git commit 和 git add 过)

  • git reset --hard : 会将工作区的目录也更新为指定commit相同的内容(没有发生过git commit 和 git add )

  • git reset --soft : 保留index区和工作目录的内容(类似与已经git add过)

  • git revert : 用于撤销已经push的代码 实质就是生成一个新的commit ,但是新commit的内容和指定撤销的commit的内容相反

  • git rebase : 使用git merge 的话 ,commit历史就会出现分叉 ,可以用rebase代替merge 避免出现commit历史分叉

  • git rebase -i HEAD~n :用于合并本地的多个提交 ,通过rebase , 让本来分叉了的提交历史重新回到了一条线上 。

  • git stash stash会将可以被git追踪的文件(也就是要git add 过)存放在本地的一个单独区域中 ,待需要时再取出

  • git merge 将当前节点与目标节点加上两个节点的共同祖先节点进行三向合并 结果先保存当前目录和索引,然后和父节点33104一起做一次新提交。 分布式版本控制工具Git入门及原理简介

Git命令的底层原理

Git命令分为procelain和plumbing

  • porcelain命令就是我们常用的git add,git commit等命令
  • plumbing命令可以理解为更底层的命令,实际上一个porcelain命令可以由若干个plumbing命令完成,plumbing命令可以帮助我们了解git底层的工作原理
  1. git add

    1. 根据文件内容计算SHA-1值
    2. 将文件内容存储到仓库的数据库中
    3. 将文件内容注册到.git/index文件中
  2. git commit

    1. 根据当前的工作树生成一个tree对象(tree对象记录了当前工作目录的结构,保存有对当前版本的文件的引用), 将tree对象保存到.git/objects下
    2. 由上述tree对象生成一个commit对象,
    3. 移动分支到新生成的commit对象
转载自:https://juejin.cn/post/7229259138919874620
评论
请登录