Git - 基本概念

版本控制系统

版本控制系统(VCS)是一款帮助软件开发人员协同工作并保持完整工作历史的软件./p>

下面列出的是VCS : 的功能;

  • 允许开发人员同时工作.

  • 不允许覆盖彼此的更改.

  • 维护每个版本的历史记录.

以下是VCS的类型 :

  • 集中版本控制系统(CVCS).

  • 分布式/分散式版本控制系统(DVCS).

在本章中,我们将只关注分布式版本控制系统,尤其是Git的. Git属于分布式版本控制系统.

分布式版本控制系统

集中版本控制系统(CVCS)使用中央服务器存储所有文件和实现团队协作.但CVCS的主要缺点是其单点故障,即中央服务器故障.不幸的是,如果中央服务器停机一小时,那么在那个小时内,任何人都无法合作.即使在最坏的情况下,如果中央服务器的磁盘损坏并且没有采取适当的备份,那么您将丢失项目的整个历史记录.在这里,分布式版本控制系统(DVCS)开始出现.

DVCS客户端不仅可以查看目录的最新快照,还可以完全镜像存储库.如果服务器出现故障,则可以将任何客户端的存储库复制回服务器以进行还原.每次结账都是存储库的完整备份. Git不依赖于中央服务器,这就是您在离线时可以执行许多操作的原因.您可以在脱机时提交更改,创建分支,查看日志以及执行其他操作.您只需要网络连接即可发布更改并进行最新更改.

Git的优点

免费和开源

Git是根据GPL的开源许可证发布的.它可以通过互联网免费获得.您可以使用Git管理属性项目而无需支付一分钱.由于它是开源的,您可以下载其源代码并根据您的要求执行更改.

快速和小型

大多数操作在本地执行,它在速度方面提供了巨大的好处. Git不依赖于中央服务器;这就是为什么,不需要为每个操作与远程服务器交互. Git的核心部分是用C语言编写的,它避免了与其他高级语言相关的运行时开销.虽然Git镜像整个存储库,但客户端数据的大小很小.这说明了Git在客户端压缩和存储数据的效率.

隐式备份

在那里丢失数据的可能性非常少是它的多个副本.任何客户端上的数据都会镜像存储库,因此可以在发生崩溃或磁盘损坏时使用它.

安全性

Git使用一种称为安全散列函数(SHA1)的通用加密散列函数,用于命名和标识其数据库中的对象.每个文件和提交都在结账时通过校验和进行校验和检索.这意味着,在不知道Git的情况下,无法从Git数据库更改文件,日期和提交消息以及任何其他数据.

不需要强大的硬件

对于CVCS,中央服务器需要足够强大以满足整个团队的请求.对于规模较小的团队来说,这不是问题,但随着团队规模的扩大,服务器的硬件限制可能成为性能瓶颈.在DVCS的情况下,开发人员不与服务器交互,除非他们需要推送或拉动更改.所有繁重的工作都发生在客户端,所以服务器硬件确实非常简单.

更容易分支

CVCS使用廉价的复制机制,如果我们创建一个新分支,它会将所有代码复制到新分支,因此这非常耗时且效率不高.此外,在CVCS中删除和合并分支是复杂且耗时的.但是使用Git进行分支管理非常简单.创建,删除和合并分支只需几秒钟.

DVCS术语

本地存储库

每个VCS工具都提供私人工作场所作为工作副本.开发人员在其私人工作场所进行更改,并且在提交后,这些更改将成为存储库的一部分. Git通过为它们提供整个存储库的私有副本,更进了一步.用户可以使用此存储库执行许多操作,例如添加文件,删除文件,重命名文件,移动文件,提交更改等等.

工作目录和暂存区域或索引

工作目录是签出文件的地方.在其他CVCS中,开发人员通常会进行修改并将更改直接提交到存储库.但是Git采用了不同的策略. Git不会跟踪每个修改过的文件.无论何时提交操作,Git都会查找暂存区域中存在的文件.只有那些存在于暂存区域中的文件才被认为是提交而不是所有修改过的文件.

让我们看看Git的基本工作流程.

第1步 : 您可以从工作目录修改文件.

步骤2 : 您将这些文件添加到临时区域.

步骤3 : 您执行从暂存区域移动文件的提交操作.在推送操作之后,它将更改永久存储到Git存储库.

Git Tutorial

假设您修改了两个文件,即"sort.c"和"search.c",并且您希望每个操作有两个不同的提交.您可以在暂存区域中添加一个文件并执行提交.在第一次提交之后,对另一个文件重复相同的过程.

# First commit
[bash]$ git add sort.c

# adds file to the staging area
[bash]$ git commit –m "Added sort operation"

# Second commit
[bash]$ git add search.c

# adds file to the staging area
[bash]$ git commit –m "Added search operation"

Blob

Blob代表 B inary L arge Ob ject.每个版本的文件都由blob表示. blob保存文件数据,但不包含有关该文件的任何元数据.它是一个二进制文件,在Git数据库中,它被命名为该文件的SHA1哈希.在Git中,文件不是通过名称来处理的.一切都是内容解决的.

树是一个对象,代表一个目录.它包含blob以及其他子目录.树是一个二进制文件,用于存储对blob和树的引用,这些引用也被命名为树对象的 SHA1 哈希.

提交

Commit保存存储库的当前状态.提交也由 SHA1 哈希命名.您可以将提交对象视为链接列表的节点.每个提交对象都有一个指向父提交对象的指针.从给定的提交中,您可以通过查看父指针来查看提交的历史记录.如果提交有多个父提交,那么通过合并两个分支创建了该特定提交.

分支

分支用于创建另一个分支发展.默认情况下,Git有一个master分支,与Subversion中的trunk相同.通常,会创建一个分支来处理新功能.功能完成后,它将与主分支合并,然后删除分支.每个分支都由HEAD引用,它指向分支中的最新提交.无论何时进行提交,HEAD都会使用最新提交进行更新.

标记

标记在存储库中为特定版本指定一个有意义的名称.标签与分支非常相似,但区别在于标签是不可变的.这意味着,tag是一个分支,没有人打算修改.为特定提交创建标记后,即使您创建了新提交,也不会更新它.通常,开发人员为产品版本创建标签.

克隆

克隆操作会创建存储库的实例.克隆操作不仅会检出工作副本,还会镜像完整的存储库.用户可以使用此本地存储库执行许多操作.网络实例的唯一时间是同步存储库实例.

拉操作将更改从远程存储库实例复制到当地的. pull操作用于两个存储库实例之间的同步.这与Subversion中的更新操作相同.

推送

推送操作将更改从本地存储库实例复制到远程实例.这用于将更改永久存储到Git存储库中.这与Subversion中的提交操作相同.

HEAD

HEAD是一个指针,它始终指向分支中的最新提交.无论何时进行提交,HEAD都会使用最新提交进行更新.分支的头部存储在 .git/refs/heads/目录中.

 
 [CentOS] $ ls -1 .git/refs/heads/
 master 
 [CentOS] $ cat .git/refs/heads/master 
 570837e7d58fa4bccd86cb575d884502188b0c49

修订版

版本代表源代码的版本. Git中的修订由提交表示.这些提交由 SHA1 安全哈希标识.

URL

URL表示Git存储库的位置. Git URL存储在配置文件中.

[tom@CentOS tom_repo]$ pwd
/home/tom/tom_repo

[tom@CentOS tom_repo]$ cat .git/config
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
[remote "origin"]
url = gituser@git.server.com:project.git
fetch = +refs/heads/*:refs/remotes/origin/*