Git 是什么?~ 什么是分支 ~
首先
如果有人问你”Git是什么?”,你会怎么回答呢?
以前的我可能会说:
“Git是一个文件版本管理系统。如果你不想改变正式版本的代码,你可以创建一个分支,自己在分支上进行工作。”
但是在学习过程中,我发现了许多错误,所以我想把它们总结起来。
由于内容非常庞大,所以我打算分几次来解释。
Git初学者常犯的误解
首先,「分支」指的是什么?
如果这个概念理解错误,那么Git就很难理解了。
一开始我解释说,“创建分支就是创建工作环境”。
很多初学者可能会误认为分支就像“一个目录”。
首先我们需要纠正这个理解。
「分支」是一个指针。
这可能是在学习Git时常见的误解:“创建一个新分支并在上面进行工作”,“工作完成后将两个分支合并”,这是最初学习Git时被教授的方法导致的误解。实际上,我们可以通过查看“.git”目录中的内容来理解到底发生了什么。考虑到有些人可能对命令行不太熟悉,我们这次将使用资源管理器或记事本进行确认。
ref表示的是“参考”,在HEAD中表示“查看refs目录中的heads目录下的main”。
没什么东西。顺便提一下,执行了git checkout -b edit命令后,虽然成功切换了分支,但文件夹的内容仍然是空的。
接下来,我打算提交到main分支。
因为刚才移动到了edit分支,所以使用git checkout -b main命令返回到main分支。为什么要加上“-b”在后面会进行解释。
echo "hello" > test1.txt
git add .
git commit "test_commit1"
下一次让我们来深入探讨一下。
Git是什么?
如果有人问「Git是什么?」,大多数人会开头回答像我刚才提到的『版本控制系统』。这并不是错的,但「它是如何实现的?」这一点才是最重要的。
公式的写法如下所示。
Git的核心部分是一个简单的键值数据存储。
键值型数据存储是一种将要保存的数据分配一个唯一键,并以一组方式进行存储的方法。
在Git中,使用SHA-1哈希函数生成40位键值。
通过将其与数据一起存储,只需指定键值即可调用任意数据。
那么,让我们回顾一下先前的提交。
$ git commit -m "test_commit1"
[main (root-commit) aa78566] test_commit1
1 file changed, 1 insertion(+)
create mode 100644 test1.txt
$ git log
commit aa78566285e3aa3782eaeba35fc431200252b9ef (HEAD -> main)
aa78566是提交ID的前几个字符。
使用git log命令输出的是原始的提交ID。
虽然在不同的命令中都会使用提交ID,但每次输入40个字符都很麻烦,所以在提交时会告诉你“只需要输入这些就可以了”。(据我所查,只有前4个字符是可省略的。如果有重复的情况,它还会告诉你候选项。)
下一篇文章将详细解释为什么会有三个文件夹产生这样复杂的问题。本次只需要记住“Git在进行提交时,保存了一个40位数的键值和数据”这一点就可以了。
最后,分支是什么?
头指针
我认为我们已经开始了解分支的本质。接下来,我想学习关于「HEAD指针」的内容。
给一个额外的东西
如果之前认为「分支=工作目录」,突然被告知「只是个标记而已」,那么有人会疑问「那我在哪里工作呢!」让我们回顾一下在这之前提交的过程吧。
在进行 Git 提交之前,可以分为三个主要区域。
ワークツリー
作業エリアです。エリアとは言っていますが、特に意識しなくても何かしらのファイルを変更しているときは常にここにいます。
インデックス
コミットを準備するためのエリアです。git addを行うとここに変更したファイルが登録されます。
リポジトリ
ここが「変更を管理する」エリアです。git commitを行うとスナップショット等をここに保存します。
スナップショットとは簡単に言うとその時点での写真だと思ってもらうとイメージしやすいです。
これが存在することで、簡単に前のバージョンのファイルに戻すことができるのです。
最后
请问如何呢?实际上,“分支是什么”这个问题已经在限定发布的文章中写过了,我还让工程师朋友们看过,但是他们完全没有理解。即使口头问我,虽然我脑海中有一个形象图,但却无法很好地用语言来表达,我感到非常沮丧,因此通过更深入的学习,我意识到“噢,我只了解表面,还没理解到更深层次的地方”。昨天我一直在不断地喊着“分支不是面,是点!”被人笑了,所以希望这篇文章能够传达出来(笑)。下次我打算写一个关于“解剖Git命令”的主题!感谢你阅读这篇长文!