📜  Git-基本概念

📅  最后修改于: 2020-11-01 03:51:20             🧑  作者: Mango


版本控制系统

版本控制系统(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”

斑点

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

树木

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

提交

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

分行

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

标签

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

克隆

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

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

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

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

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

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

修订版

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

网址

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