开发学院

您的位置:首页>教程>正文

教程正文

Git 基础概念

Git基础概念

版本控制系统

  版本控制系统( VCS )是一种软件,它帮助软件开发人员协同工作并保持他们工作的完整历史。

  下面列出了VCS的功能:

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

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

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

以下是风险投资的类型:

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

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

  在本章中,我们将只关注分布式版本控制系统,特别是Git。git属于分布式版本控制系统。

分布式版本控制系统

  集中式版本控制系统( CVCS )使用中央服务器存储所有文件并实现团队协作。但是CVCS的主要缺点是它的单点故障,即中央服务器的故障。不幸的是,如果中央服务器停机一小时,那么在那一小时内,根本没有人可以协作。在最坏的情况下,如果中央服务器的磁盘损坏,并且没有进行适当的备份,那么您将丢失整个项目历史。为了解决这个问题,分布式版本控制系统( DVCS )应运而生。

  DVCS客户端不仅检查目录的最新快照,而且还完全镜像存储库。如果服务器出现故障,则可以将来自客户端的存储库复制回服务器以进行恢复。每次签出都是存储库的完整备份。git不依赖于中央服务器,所以脱机时可以执行许多操作。脱机时,您可以提交更改、创建分支、查看日志和执行其他操作。您只需要网络连接来发布您的更改并接受最新的更改。

地理信息技术的优势

自由开放源码

  Git是根据GPL的开源许可证发布的。它可以在互联网上免费获得。你可以用Git来管理房地产项目,而不用花一分钱。由于它是一个开放源代码,您可以下载它的源代码,也可以根据您的要求执行更改。

体积小速度块

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

隐式备份

  当数据有多个副本时,丢失数据的机会非常少。任何客户端上的数据都反映了存储库,因此可以在崩溃或磁盘损坏的情况下使用。

安全

  Git使用一种称为安全散列函数( SHA1 )的常见加密散列函数来命名和标识其数据库中的对象。每个文件和提交在签出时通过其校验和进行校验和检查和检索。这意味着,在不知道Git的情况下,不可能更改Git数据库中的文件、日期和提交消息以及任何其他数据。

不需要强大的硬件

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

更容易分支

  CVCS使用廉价的复制机制,如果我们创建一个新的分支,它会将所有的代码复制到新的分支,这样既耗时又没有效率。此外,CVCS中分支的删除和合并是复杂和耗时的。但是Git的分支管理非常简单。创建、删除和合并分支只需要几秒钟。

分布式版本控制系统术语

本地存储库

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

工作目录和临时区域索引

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

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

  •   步骤1 :从工作目录修改文件。

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

  •   步骤3 :执行提交操作,将文件从暂存区移出。推送操作后,它将更改永久存储到Git存储库中。

1111.png

  假设您修改了两个文件,即“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”

Blobs

  Blob代表二进制大对象。文件的每个版本都由Blob表示。Blob保存文件数据,但不包含有关文件的任何元数据。它是一个二进制文件,在Git数据库中,它被命名为该文件的SHA1哈希。在Git中,文件不按名称寻址。一切都是内容寻址的。

  树是表示目录的对象。它包含小块以及其他子目录。树是一个二进制文件,存储对节点和树的引用,这些节点和树也称为树对象的SHA1散列。

Commits

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

分支

  分支用于创建另一条开发线。默认情况下,Git有一个主分支,与Subversion中的中继相同。通常,会创建一个分支来处理新功能。功能完成后,它将与主分支合并,我们将删除该分支。每个分支都由HEAD引用,HEAD指向分支中的最新提交。每次提交时,HEAD都会更新为最新提交。

标签

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

克隆

  克隆操作创建存储库的实例。克隆操作不仅检查工作副本,而且还镜像完整的存储库。用户可以使用此本地存储库执行许多操作。只有在同步存储库实例时才涉及网络。

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

  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/*