Git基本概念


Git基本概念


版本控制系统

版本控制系统(VCS) 是一种软件,可帮助软件开发人员协同工作并维护其工作的完整历史记录。

下面列出的是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教程

假设您修改了两个文件,即“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中,文件不是通过名称来处理的。一切都是满足内容的。

Tree

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

Commit

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

分支

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

标签

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

克隆

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

pull

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

push

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

head

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

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

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

修订

Revision表示源代码的版本。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/*