吉特';“背后的技术和逻辑”;“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
    ,通常是当前分支上的最新提交)
  • 在暂存区的那个。这是文件在添加后的位置,用于在实际提交之前准备提交
  • 你的工作树。这是当前目录在磁盘上的外观
  • 这就是为什么,如果您编辑一个文件(比如a.txt),
    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