首页 > 自考资讯 > 自考知识

git完整教程,gitsd

头条共创 2024-07-05

Git是最流行的版本控制工具,也是程序员必备技能之一。本文将带你在20 分钟内了解Git。

b789c93678704548a3c66179b24a2555~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720741278&x-signature=hpyiFAXyrp%2Fcel0dRbERjf1e82Q%3D翻译如下:

你每天都在使用Git,但你可能不明白它是如何工作的。为什么Git 允许版本控制? 基本命令git add 和git commit 到底有什么作用?

本文通过一个例子来解释Git的执行过程,帮助您了解Git的工作原理。

0bff9da8a0ae404b830c8e108ad8e4ac~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720741278&x-signature=DLg0S3JXnQWWJXyT0yxlCBb9rXM%3D

1.初始化

为您的项目创建一个目录并移至该目录。

$ mkdir git-demo-project$ cd git-demo-project 如果你想管理项目的版本,你应该做的第一件事就是通过git init 初始化它。

$ git init git init 所做的就是在项目的根目录中创建一个.git 子目录来存储版本信息。

$ ls .gitbranches/configdescriptionHEADhooks/info/objects/refs/上面的命令显示.git 子目录的内容。

2.保存对象

接下来,让我们创建一个新的空文件test.txt。

运行$ touch test.txt 将此文件添加到您的Git 存储库。此步骤创建test.txt 现有内容的副本。

$ git hash-object -w test.txte69de29bb2d1d6434b8b29ae775ad8c2e48c5391 在上面的代码中,git hash-object 命令将test.txt 的现有内容压缩为二进制文件并将其保存到Git。压缩文件称为Git 对象,存储在.git/objects 目录中。

此命令允许您根据对象的文件名检索对象的当前内容,并将其计算为SHA1 哈希值(长度为40 的字符串)。看一下下面新生成的Git 对象文件。

$ ls -R .git/objects.git/objects/e6:9de29bb2d1d6434b8b29ae775ad8c2e48c5391 如上面的代码所示,git/objects 目录下多了一个子目录,这个子目录的名称就是上面的哈希值中的第一个。 2 个字符。该子目录包含一个文件,其名称是上面哈希的剩余38 个字符。

我们再看一下文件的内容。

$ cat .git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 上面代码输出的文件内容是一些二进制字符。 test.txt 是一个空文件,但您可能想知道为什么它包含此内容。这是因为二进制对象还存储一些元数据。

如果你想查看文件的原始文本内容,你应该使用git cat-file。

$ git cat-file -p e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 上面的命令不会显示任何内容,因为原始文件是空的。接下来,让我们向test.txt 文件写入一些内容。

$ echo 'hello world' test.txt 文件的内容已更改,必须再次保存为Git 对象。

$ git hash-object -w test.txt3b18e512dba79e4c8300dd08aeb37f8e728b8dad 如上面的代码所示,当文件内容发生变化时,test.txt 的哈希值也会发生变化。还生成了一个新文件.git/objects/3b/18e512dba79e4c8300dd08aeb37f8e728b8dad。现在将显示该文件的内容。

$ git cat-file -p 3b18e512dba79e4c8300dd08aeb37f8e728b8dadhello world

3.更新索引

将文件保存为二进制对象后,您需要告诉Git 哪些文件已更改。 Git 将所有修改过的文件记录在称为“索引”(或阶段)的区域中。然后,它会等待所有更改完成,并将这些文件一起写入索引中的正式版本历史记录。

$ git update-index --add --cacheinfo 100644 \3b18e512dba79e4c8300dd08aeb37f8e728b8dad test.txt 上面的命令在索引中记录了文件名test.txt、二进制对象名称(哈希值)和文件权限。

git ls-files 命令显示索引的当前内容。

$ git ls-files --stage100644 3b18e512dba79e4c8300dd08aeb37f8e728b8dad 0 test.txt 上面的代码显示索引中只有一个test.txt 文件,同时还显示了该文件的二进制对象名称以及访问该文件的权限。如果您知道二进制对象名称,则可以查看.git/objects 子目录中的文件内容。

您可以使用git status 命令输出更具可读性的结果。

$ git statusChanges to Submit: New file: test.txt 上面的代码显示,索引中只有一个新文件test.txt 等待写入版本历史。

4.git add命令

对每个文件执行上述两个步骤非常繁琐。因此,Git提供了git add命令来简化这些操作。

$ git add --all 上面的命令相当于对当前项目中所有修改过的文件执行以上两步。

5.提交(Commit)

索引存储更改的文件信息。更改完成后,所有这些信息都会写入版本历史记录中。这与生成当前项目的快照相同。

项目的历史记录由项目在不同时间点的快照组成。 Git 可以将您的项目恢复到任何快照。 Git 有一个特殊的术语叫做“快照”,即“提交”。因此,生成快照也可以称为完成提交。

下面所有对“快照”的引用都是指提交。

6.完成提交

首先,您需要设置您的用户名和电子邮件地址。保存快照时,Git 需要跟踪谁进行了提交。

$ git config user.name '用户名' $ git config user.email '电子邮件地址' 接下来,保存现有的目录结构。在本文前面,我们解释了保存对象仅保存文件,而不保存它们之间的目录结构。

git write-tree 命令可以根据您当前的目录结构生成Git 对象。

$ git write-treec3b8bb102afeca86037d5b5dd89ceeb0090eae9d 在上面的代码中,目录结构存储为二进制对象,对象的名称是哈希值。它还保存在.git/objects 目录中。

我们来看看这个文件的内容。

$ git cat-file -p c3b8bb102afeca86037d5b5dd89ceeb0090eae9d100644 blob 3b18e512dba79e4c8300dd08aeb37f8e728b8dad test.txt 可以看到当前目录下只有一个文件test.txt。

这个所谓的快照保存了当前的目录结构以及每个文件对应的二进制对象。由于前面的操作保存了文件结构,因此我们需要将此目录结构与元数据一起写入版本历史记录。

git commit-tree 可以将目录树对象写入版本历史记录。

$ echo 'first commit' | git commit-tree c3b8bb102afeca86037d5b5dd89ceeb0090eae9dc9053865e9dff393fd2f7a92a18f9bd7f2caa7fa 上面的代码中,需要在提交时指定提交描述,可以通过echo 'first commit' 来指定提交描述。 git commit-tree 命令根据元数据和目录树生成Git 对象。现在我们来看看这个对象的内容。

$ git cat-file -p c9053865e9dff393fd2f7a92a18f9bd7f2caa7fatree c3b8bb102afeca86037d5b5dd89ceeb0090eae9dauthor jam 1538889134 +0800committer jam 1538889134 +0800 上述代码中的第一个Comm它,输出的第一行是快照对应的目录树对象,第二行和第三行是关于作者和提交的内容。作者信息,最后一行内容是帖子描述。

您还可以使用git log 命令查看有关快照的信息。

$ git log --stat c9053865e9dff393fd2f7a92a18f9bd7f2caa7facommit c9053865e9dff393fd2f7a92a18f9bd7f2caa7faAuthor: jam Date: 10月7日星期日13:12:14 +0 800首先提交test.txt | 1 + 1 个文件更改,1 个插入(+)

7.git commit命令

Git 简化了上述提交操作提供了git commit 。保存到索引后,您只需运行git commit 命令即可同时提交目录结构和描述并生成快照。

$ git commit -m 'first commit' 还有两个非常有用的附加命令。

您可以使用git checkout 命令切换到特定快照。

$ git checkout c9053865e9dff393fd2f7a92a18f9bd7f2caa7fa 您可以使用git show 命令查看快照中的所有代码更改。

$ git show c9053865e9dff393fd2f7a92a18f9bd7f2caa7fa

8.分支(branch)

但是,当我使用git log 命令查看整个版本历史记录时,我看不到刚刚生成的快照。

$ git log 上述命令的输出为空。这是为什么?这张快照不就被写入历史了吗?

事实上,git log 命令只能显示当前分支中的更改。我已经提交了这个快照,但是我没有记录这个快照属于哪个分支。

分支是指向快照的指针,分支的名称就是指针的名称。虽然无法读取哈希值,但分支允许用户为快照添加别名。此外,如果当前分支是新快照,则该分支将自动更新。例如,master分支有一个名为master的指针,它指向master分支的当前快照。

用户可以创建指向任何快照的新指针。例如,如果您想创建一个新的fix-typo 分支,只需创建一个名为fix-typo 的指针并将其指向您的快照即可。因此,在Git 中创建新分支非常容易并且开销非常低。

Git 有一个特殊的指针HEAD,它始终指向当前分支中的最新快照。此外,Git 还提供了快捷方式。例如,HEAD^指的是HEAD(父节点)之前的快照,HEAD~6指的是HEAD之前的第6个快照。

指向每个分支的指针是存储在.git/refs/heads/目录中的文本文件。文件的内容是文件指向的快照的二进制文件名(哈希)。

9.更新分支

下面介绍如何更新分支。首先,修改test.txt。

运行$ echo 'hello world Again' test.txt 并保存二进制对象。

$ git hash-object -w test.txtc90c5155ccd6661aed956510f5bd57828eec9ddb 然后将对象写入索引并保存目录结构。

$ git update-index test.txt$ git write-tree1552fd52bc14497c11313aa91547255c95728f37最后提交目录结构并生成快照。

$ echo '第二次提交' | git 提交树1552fd52bc14497c11313aa91547255c95728f37 -p c9053865e9dff393fd2f7a92a18f9bd7f2caa7fa785f188674ef3c6ddc5b516307884e1 d5 51f53ca 上面的代码中,我们使用git commit-tree 命令的参数-p 来指定父节点,即快照所基于的节点。 能。

接下来,将快照的哈希值写入.git/refs/heads/master 文件,使master 指针指向快照。

$ echo 785f188674ef3c6ddc5b516307884e1d551f53ca .git/refs/heads/master 现在您可以使用git log 命令查看这两个快照。

$ git logcommit 785f188674ef3c6ddc5b516307884e1d551f53ca (HEAD - master)Author: jam Date: Sun Oct 7 13:38:00 2018 +0800 秒提交c9053865e9dff393fd2f7a92 18f9bd7f2caa7faAuthor: jam Date: Sun Oct 7 13:12:14 2018 +0800 第一次提交运行git log 命令的流程大致如下。

找到HEAD指针对应的分支。在上面的例子中,这是master。找到master指针指向的快照。在上面的示例中,它是785f188674ef3c6ddc5b516307884e1d551f53ca。找到父节点(即上一个快照)c9053865e9dff393fd2f7a92a18f9bd7f2caa7fa。等待,最后显示当前分支的所有快照。另外,虽然我们前面提到分支指针是动态的,但以下三个命令会自动覆盖分支指针:

Git commit:将当前分支指针移至新创建的快照。 git pull:当当前分支和远程分支合并时,指针指向新创建的快照。 git reset [commit_sha]:将当前分支指针重置到指定快照。原文:https://www.tutorialdocs.com/article/how-git-works.html

作者:亚历克斯

译者:三日月编辑:郭锐

版权声明:本文由今日头条转载,如有侵犯您的版权,请联系本站编辑删除。

猜你喜欢