吉特';“背后的技术和逻辑”;“git状态”;
当吉特';“背后的技术和逻辑”;“git状态”;,git,digital-signature,internals,Git,Digital Signature,Internals,当git status查看本地文件夹中是否有任何更改时,会发生什么情况 据我所知,每个文件都是通过哈希代码(确切地说:sha1)进行“注册”的,git status“simply”尝试将目前为止注册的哈希值与实时计算的哈希值进行匹配,如果有什么不同,则视为状态更改。老实说,我不太确定这一点,如果我错了,我希望得到纠正。无论如何,一些问题出现了: 在哪里可以找到哪些散列?回购协议特定的东西有很多散列,但是我在哪里可以找到每个文件的注册散列呢 如果运行以下命令之一,这些哈希会发生什么情况:git a
git status
查看本地文件夹中是否有任何更改时,会发生什么情况
据我所知,每个文件都是通过哈希代码(确切地说:sha1)进行“注册”的,git status
“simply”尝试将目前为止注册的哈希值与实时计算的哈希值进行匹配,如果有什么不同,则视为状态更改。老实说,我不太确定这一点,如果我错了,我希望得到纠正。无论如何,一些问题出现了:
git add
,git commit-am
,git gc
整个电子书都值得一读。要理解这一点,您首先需要了解git存储的对象,所有这些对象都由它们的SHA1散列标识。它们是树、树和斑点 提交包含提交消息、提交者、日期、父提交的SHA1和树的SHA1(加上一些附加信息) 树表示一个目录。它包含它所包含的文件和目录的名称(和其他元数据)。对于每个文件,它还包含相应blob的SHA1,对于每个子目录,它包含另一个树的SHA1 Blob表示文件的内容,没有名称或任何其他元数据 现在,
git status
比较了三棵树:
HEAD
,通常是当前分支上的最新提交)git添加它,再编辑一些,然后使用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
#
您可以看到,repo的根目录包含一个名为a.txt的文件(blob
),SHA1为9c59e24b8393179a5d712de4f990178df5734d99
您可以使用相同的命令查看这些子目录中的子目录和文件的SHA1,有关详细信息,请参阅该命令的文档
要计算磁盘上某个文件的SHA1,可以使用git hash object
如果运行以下命令之一,这些哈希会发生什么
您应该记住,SHA1基于对象的内容。每个对象都是完全不可变的,因此某些对象的SHA1永远不会改变。但许多操作可以创建新对象,例如,它们也可以更改为某些分支点的对象
git add
获取临时区域中的树,通过根据命令参数添加或更改一些文件来修改它,并将修改后的树保存回临时区域
git commit
获取暂存区域中的树,并创建指向该树的提交。新提交还具有当前日期,您作为提交者,当前提交作为其父级。然后,该命令将当前分支更改为指向新提交
git commit-a
只是git add
的快捷方式,后面跟着git commit
git gc
查看它存储的所有对象,并删除那些无法访问的对象。可访问对象是所有分支、标记或当前提交以及它们递归引用的所有对象的提示。最近使用的提交(以及它们引用的对象)也不会被删除,因为它们可以通过reflog访问
$ git ls-tree HEAD
100644 blob 9c59e24b8393179a5d712de4f990178df5734d99 a.txt