gpt4 book ai didi

"git status"背后的Git技术和逻辑

转载 作者:太空狗 更新时间:2023-10-29 13:52:14 24 4
gpt4 key购买 nike

git status 正在查看本地文件夹中是否有任何更改时,到底发生了什么?

据我所知,每个文件都是通过哈希码(准确地说:sha1)“注册”的,git status“简单地”尝试将到目前为止注册的哈希与飞计算,如果有什么不同,它被认为是状态变化。老实说,我对此不太确定,如果我错了,我希望得到纠正。无论如何,出现了一些问题:

  1. 在哪里可以找到哪些散列? repo 特定事物有很多哈希值,但我究竟在哪里可以找到每个文件的注册哈希值?
  2. 如果运行以下命令之一,这些哈希会发生什么情况:git addgit commit -amgit gc<

最佳答案

要了解这一点,您首先需要了解 git 存储的对象,所有这些对象均由其 SHA1 哈希值标识。它们是提交、树和 blob。

提交包含提交消息、提交者、日期、父提交的 SHA1 和树的 SHA1(加上一些附加信息)。

树代表一个目录。它包含它包含的文件和目录的名称(和其他元数据)。对于每个文件,它还包含相应 blob 的 SHA1,对于每个子目录,它还包含另一棵树的 SHA1。

Blob 表示文件的内容,没有名称或任何其他元数据。

现在,git status 比较三棵树:

  1. 属于当前提交的那个(HEAD,通常是当前分支上的最新提交)。
  2. 在暂存区的那个。这是文件在您 git add 之后去的地方,用于在您实际提交之前准备提交。
  3. 你的工作树。这是目录当前在您的磁盘上的样子。

这就是为什么,如果你编辑一个文件(比如,a.txt),git add 它,再编辑一些,然后使用 git status,你会得到像这样的输出:

# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: a.txt
#
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: a.txt
#

现在回答您的实际问题:

Where could which hashes be found? There are many hashes for repo specific things but where exactly do I find the registered hash for each file?

它们存储在树对象中。例如,要查看当前提交的树对象 (HEAD),请使用 git ls-tree HEAD:

$ git ls-tree HEAD
100644 blob 9c59e24b8393179a5d712de4f990178df5734d99 a.txt

您可以看到 repo 的根目录包含一个名为 a.txt 的文件 (blob),其 SHA1 为 9c59e24b8393179a5d712de4f990178df5734d99。

您可以使用相同的命令来查看子目录和子目录中文件的 SHA1,详情请参阅该命令的文档。

要计算磁盘上某个文件的 SHA1,您可以使用 git hash-object

What happens with these hashes if one of the following command is run

您应该记住,SHA1 是基于对象的内容。而且每个对象都是完全不可变的,所以某些对象的 SHA1 永远不会改变。但是许多操作可以创建新对象,例如它们还可以将某些分支点更改为什么对象。

  • git add 获取暂存区的树,根据命令的参数通过添加或更改一些文件对其进行修改,并将修改后的树保存回暂存区。
  • git commit 获取暂存区中的树并创建指向该树的提交。新提交也有当前日期,您作为提交者,当前提交作为其父级。然后该命令将当前分支更改为指向新的提交。
  • git commit -a 只是 git add 后跟 git commit 的快捷方式。
  • git gc 查看它存储的所有对象并删除那些无法访问的对象。可达对象是所有分支、标签或当前提交的提示以及它们递归引用的所有对象。最近使用的提交(以及它们引用的对象)也不会被删除,因为它们可以通过 reflog 访问。

关于 "git status"背后的Git技术和逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9513103/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com