📜  Git 版本控制如何工作?

📅  最后修改于: 2021-10-19 06:14:22             🧑  作者: Mango

Git ……程序员在编程世界中最流行和最常用的工具。

暂时忘记这个工具,看看下面给出的图片……

闪回……你在笑吗?? (是的!你是……)

上图让您想起了您的开发者之旅。当您害怕在项目中做错事时,这就是您尝试保留文件备份的方式。您遵循了这种传统方法,认为您可能会在项目中造成混乱。

Git 版本控制是如何工作的

您在项目中创建了一些文件,进行了一些更改,实现了一些新的东西,然后复制了这些文件,并将它们命名为 blogPost_new。再次进行一些更改,使用另一个文件名 blogPost_backup 创建另一个副本。这样继续下去,您的目录现在充满了单个项目的多个文件。您项目中的文件是 blogPost_old、blogPost_one、blogPost_two、blogPost_backup、blogPost_final 等。

几天后,您打开您的项目。您想检查您在之前的副本中做了什么,但是当您看到项目中的大量文件时,您会感到困惑。现在您无法确定哪个文件做了什么以及这些文件的顺序是什么。哪个文件运行顺利,哪些文件发生了什么样的变化,为什么要更改文件,以及哪个文件在您的项目中没有任何作用?

您并不孤单,在我们的开发生涯中,我们都曾经历过这样的过程。手动检查文件中的代码以确定其目的是一件非常痛苦的事情。

现在您可能已经了解 Git(如果您是一名程序员,并且熟悉此工具)在程序员生活中的重要性。它可以节省您的时间,并使软件开发团队的生活变得更加轻松。

使用 Git 管理代码非常容易,而且如果出现问题,修复错误也很容易。今天大多数程序员(尤其是新手)都知道它的重要性。

您可能已经在 git….git add、git push、git pull、git commit 等中使用了各种命令,但是如果我们询问幕后的工作方式以及 Git 的流程是什么样的,那么您的答案会是什么……

我们大多数人知道不知道……

今天在这个博客中,我们将更多地探索这个神奇的工具。我们将深入讨论 Git 在内部是如何工作的。

坐在椅子上,坐下来,放松一下,在周末或几个小时内多了解一下您最喜欢的工具。

快速介绍

如果您不熟悉此工具,请阅读博客An Ultimate Guide to Git and Github

简而言之,Git 会保留您项目的备份。它以快照的形式跟踪您的源代码。它为每个快照分配一个唯一值(SHA-1 哈希)以区分它们。简而言之,Git 在您的文件中创建保存点,以便您可以随时检查或检索它们。

让我们来谈谈要点……Git 的核心功能。 Git 如何处理您的文件及其工作流程。

Git 中的状态

Git 的核心功能主要在三种文件状态下工作:修改状态暂存状态提交状态。如果包含远程存储库,则可以将其核心功能分为四种状态。您的文件可以处于任何一种状态。我们将讨论它们中的每一个,但为了更好地理解,我们将举一个现实生活中的例子。

考虑一个场景,要求您创建一个漂亮的相册,其中包含一些标题或消息以及图片。你会怎么做??

您很可能会执行下面给出的操作……

  • 您将拍摄一些照片以包含在您的相册中。您尚未将其粘贴到相册中,因此不会影响您的相册。您可以自由过滤要包含在相册中的图片。如果您还没有点击好图片,那么您也可以在必要时选择再次拍摄相同的图片。
  • 在下一步中,您将过滤出要包含的图片,然后将它们打印出来。想象一下,您将它们设置在相册中的空白页面旁边。基本上,您正在准备这些照片(创建一种临时区域)以粘贴在您的相册中,但您还没有这样做。
  • 准备好图片后,您可以将它们粘贴在相册中,并附上一些描述与图片相关的事件时刻的消息或标题。

您可以随时翻动相册的页面,并可以提醒自己那个特定时刻的情况。我们可以将这个例子与 Git 中的四种状态联系起来,这样我们就可以更好地理解它了。如何…。??让我们讨论一下。

1. 修改状态

在此状态下,您的文件会被修改,但不会保存更改。您没有指示 Git 监视这些文件。基本上,这些是未提交的文件。拍照就像更改文件一样。您创建文件,编写代码以添加某些功能,或者删除文件。您正在准备这些文件以保存在 Git 提交中。

这些文件不会永久保存,您的工作仍在进行中。您可以随时写入、重写、删除或更改文件。

2. 阶段性状态

在此状态下,您的文件已准备好在 .git 存储库中提交。这些文件未提交,它们仅准备在当前状态或版本中提交。您只是明确授权 Git 监控文件版本。

Git 尚未提交这些文件,因此即使将文件添加到暂存区后,您仍然可以选择修改您的文件。您可以进行修改,并且可以将此修改添加到暂存区。这就像单击一些新图片,然后决定将它们粘贴到相册中。

3. 承诺状态

在这最后一个阶段,您成功地将文件保存在 .git 存储库中,并为它们创建了一个提交。创建提交就像将照片粘贴到相册中一样。在这个最后阶段,您将文件的暂存版本记录在 Git 目录中。

您用这些图片写一条消息或标题,以提供有关这些图片对您意味着什么的信息。 Git 中的提交消息以相同的方式工作。您编写提交消息以提供您在代码中所做的更改或添加到代码中的功能的信息。

始终编写描述性提交消息,清楚地描述您添加了哪些功能、您进行了哪些更改或您在代码库中解决了哪些错误。

现在让我们来谈谈处理文件时文件的文件位置。根据文件的状态,我们将讨论 Git 将放置它的位置。

文件位置

对于不同的州,文件的位置会有所不同。我们将根据文件的状态和位置讨论完整的工作流程。

1. 工作目录

当您在系统中创建任何文件夹时,它位于工作目录或本地文件夹或您的工作区中。基本上工作目录是项目文件的本地文件夹。现在您可能已经理解修改后的文件驻留在工作目录中。

不要混淆工作目录和 .git 目录。工作目录由用户创建。 git 目录是由 Git 创建的。

2. 集结区

处于暂存状态的文件驻留在暂存区中。基本上,暂存区是位于 .git 目录中的 Git 术语中的“索引”。它存储有关排队等待提交的文件的信息。

3. Git 目录

  • 这个目录是 Git 的核心,所有的魔法都在这里发生。处于已提交状态的文件驻留在此目录中。
  • .git 目录由 Git 创建,它存储用户提交或指示监控的文件。 .git 文件夹存储文件的对象数据库和元数据。
  • 后跟 URL 的 git clone 命令会在您的工作区中创建存储库的本地副本。
  • add 命令将工作区中的文件添加到索引或暂存区。该文件已暂存,并标记为已提交但尚未提交。
  • 当您对所有暂存的文件执行提交命令时,它们的更改将提交到本地存储库。

现在,看看下面给出的图片,了解完整的工作流程……

GIT-工作流

上图是不言自明的,它显示了一个完整的工作流程。您可能已经了解 Git 中每个命令的用途。很少有事情,从上图中我们想在这里解释一下,以使您的概念更加清晰。

在上图中, git fetch命令将文件从远程存储库获取到本地存储库,但尚未到达您的工作区。要将更新的文件从本地存储库获取到您的工作区,您可以执行git merge命令。您本地工作区中的文件将更新为远程存储库中的文件。要立即执行 bot 操作,您可以执行git pull命令。

现在的问题是……如果我们可以在一个命令 git pull 中完成所有事情,那么为什么我们需要执行两个单独的命令 git fetch 和 git merge?

答案是……。执行两个单独的命令允许我们在实际获得文件的最新版本之前比较文件。换句话说,您可以使用 git fetch 命令从远程存储库中获取文件,然后您可以运行git diff HEAD命令来检查工作目录中存在的文件与工作目录中存在的文件之间有什么区别本地存储库。根据差异,您可以决定是否要合并文件。

git diff (without head) 命令告诉你存在于工作目录中的文件和为提交而暂存的文件之间的区别。这个命令基本上告诉你,你仍然可以添加到阶段以进行进一步的提交,而你还没有。

Git 内部结构

当您打开一个由 Git 初始化的项目时,您会遇到一个目录.git 。这是所有魔法发生的地方,在本节中,我们将讨论 .git 的内部结构。

仔细查看此目录,您会发现四个重要的子目录。下面我们来讨论一下这四个子目录的作用。。

1. objects:这个目录就像一个数据库,存储所有的 repos 文件。它们的内容被编码和压缩。

2. refs: Refs 作为普通文本文件存储在 .git/refs 目录中,该文件将指针存储到提交对象中。简单来说,如果您需要操作一个对象,您需要记住该对象的哈希值。记住这些哈希值很困难,所以 git 有参考。这些引用包含提交对象的哈希值。

3. HEAD:该文件包含指向您正在处理的当前分支的引用路径。

4. config : 在这个文件中,你可以找到 repo 配置。

你应该知道的一些管道命令

git add、git commit等几乎所有的git命令都是由一些底层的核心命令组成的。这些命令称为管道命令(我们知道这对您来说是一个新词…… )。

看看下面给出的图片,然后我们将详细解释它……

管道命令

  • 假设您有一个工作目录,并使用 Git 对其进行初始化。初始化项目后,如果您创建或放入文件,Git 会创建工作树,此时当您运行git status命令时,您会看到类似这样的内容……

  • 当您的文件暂存时,git 会创建一个 blob。 Blob 包含二进制格式的文件内容。这个 blob 被分配了一个 40 个字符的哈希(Sha 1 哈希)值,以便它可以被唯一标识。之后,此 blob 将保存到 Git 存储中的对象数据库中。
  • 暂存区将有多个 blob,因此 Git 创建了一个树来准备要提交的 blob。一棵树包含指向 blob 的指针并将其命名为 A。这将是您要提交的所有文件的快照。

Git 树

  • 在提交文件之前,我们使用用户的身份来跟踪提交的人。 Tree 存储作者、提交者以及这次提交的消息。

最后的想法

我们尽力让您熟悉 Git 的内部结构,现在您可能对 Git 的工作流程有所了解。 git 命令在后台如何工作以及在内部执行哪些操作。