Git的基础概念与工作原理

1. 什么是版本控制?

版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。

2. 有哪几种类型版本控制系统?

本地版本控制系统

  • 描述:采用某种简单的数据库来记录文件的历次更新差异,代表系统 RCS,VCS。
  • 优点:实现简单。
  • 缺点:无法协同工作。

集中化的版本控制系统

  • 描述:这类系统都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。代表有 CVS、Subversion 以及 Perforce 等。
  • 优点:每个人都可以在一定程度上看到项目中的其他人正在做些什么。管理员也可以轻松掌控每个开发者的权限,管理一个 CVCS 要远比在各个客户端上维护本地数据库来得轻松容易。
  • 缺点:对中央服务器的依赖过高,安全性和可靠性不足。

分布式版本控制系统

  • 描述:客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来。任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。代表有 Git、Mercurial、Bazaar 以及 Darcs 等。
  • 优点:服务器去中心化,降低了风险,同时可以指定和若干不同的远端代码仓库进行交互。
  • 缺点:暂无。

3. Git与SVN在对待数据上有什么区别?

  • SVN:特点是差异比较,以文件变更列表的方式存储信息,将它们保存的信息看作是一组基本文件和每个文件随时间逐步累积的差异。
  • Git:特点是存储快照,Git 不按照以上方式对待或保存数据。反之,Git 更像是把数据看作是对小型文件系统的一组快照。每次你提交更新,或在 Git 中保存项目状态时,它主要对当时的全部文件制作一个快照并保存这个快照的索引。为了高效,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。Git 对待数据更像是一个快照流。

4. Git有哪些特点?

  • 近乎所有操作都是本地执行:在 Git 中的绝大多数操作都只需要访问本地文件和资源,一般不需要来自网络上其它计算机的信息,因为本地磁盘上就有项目的完整历史。
  • Git 保证完整性:Git 中所有数据在存储前都计算校验和,然后以校验和来引用。实际上,Git 数据库中保存的信息都是以文件内容的哈希值来索引,而不是文件名。
  • Git 一般只添加数据:你执行的 Git 操作,几乎只往 Git 数据库中增加数据。很难让 Git 执行任何不可逆操作,或者让它以任何方式清除数据。

5. Git有几种状态?

Git 有三种状态,你的文件可能处于其中之一:

  • 已提交(committed):表示数据已经安全地保存在本地数据库中。
  • 已修改(modified):表示修改了文件,但还没保存到数据库中。
  • 已暂存(staged):表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。

由此引入 Git 项目的三个工作区域的概念:

  • Git 仓库:Git 用来保存项目的元数据和对象数据库的地方。
  • 工作目录:对项目的某个版本独立提取出来的内容。
  • 暂存区域:一个文件,保存了下次将提交的文件列表信息。

基本的 Git 工作流程如下:

  1. 在工作目录中修改文件。
  2. 暂存文件,将文件的快照放入暂存区域。
  3. 提交更新,找到暂存区域的文件,将快照永久性存储到 Git 仓库目录。

6. Git的内部原理

  • Git 是一个内容寻址(content-addressable)文件系统:Git 的核心部分是一个简单的键值对数据库(key-value data store)。你可以向该数据库插入任意类型的内容,它会返回一个键值,通过该键值可以在任意时刻再次检索(retrieve)该内容。

Git对象

  • blob对象:存储文件内容的快照,并不保存文件名。
  • tree对象:解决文件名保存的问题,允许将多个文件组织到一起。
  • 提交对象:保存快照的时间和原因。

Git 所做的实质工作——将被改写的文件保存为数据对象,更新暂存区,记录树对象,最后创建一个指明了顶层树对象和父提交的提交对象。

7. Git的底层命令

底层命令让你窥探 Git 内部的工作机制,也有助于说明 Git 是如何完成工作的。多数底层命令并不面向最终用户:它们更适合作为新命令和自定义脚本的组成部分。

当在一个新目录或已有目录执行 git init 时,Git 会创建一个 .git 目录。这个目录包含了几乎所有 Git 存储和操作的对象。该目录的结构如下所示:

$ ls -F1
HEAD
config*
description
hooks/
info/
objects/
refs/

该目录下可能还会包含其他文件,不过对于一个全新的 git init 版本库,这将是你看到的默认结构。以下是重要条目:

  • HEAD 文件:指示目前被检出的分支。
  • index 文件:保存暂存区信息。
  • objects 目录:存储所有数据内容。
  • refs 目录:存储指向数据(分支)的提交对象的指针。

我们将详细地逐一检视这四部分,以期理解 Git 是如何运转的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值