的联机帮助页git diff说
姓名
git-diff - 显示提交、提交和工作树等之间的更改
描述
显示工作树和索引或树之间的更改、索引和树之间的更改、两棵树之间的更改、两个blob 对象之间的更改或磁盘上两个文件之间的更改。
“工作树”是指工作目录吗?
这里的“一棵树”是什么意思?它与提交对象或树对象相同吗?(从字面上看,我认为它意味着一个树对象。但我想通过将“DESCRIPTION”部分与“NAME”部分进行比较,它可能意味着一个提交对象。)
如何指定“一棵树”作为命令行参数git diff?
如果我还想问,如何指定“blob 对象”作为命令行参数git diff?
“树”这个词在 Git 中相当多(嗯,而且在一般计算中)。
\n\n工作树或工作树(或该拼写的其他变体)是指您进行工作的地方。在这里,文件具有正常的日常形式,并且是可读的并且\xe2\x80\x94OS愿意\xe2\x80\x94可写。(在 Unix 系统上,如果你chmod -w拥有文件,你将无法写入它们。但这不是 Git 的错。)
Git 中的树对象是记录目录树或子树的内部数据结构。它包含每个文件或子目录的一个条目(或者,对于子模块,该子模块的gitlink条目)。每个条目都列出了文件的可执行模式位,作为一种奇怪编码的是或否标志,1加上文件的名称和 blob 哈希 ID。对于子树,该条目列出了目录的名称和子树对象哈希 ID。然后,Git 可以递归地处理子树对象,以根据需要查找更多文件和更多子树。每个文件条目都为 Git 内部blob对象提供一个哈希 ID,该对象是文件数据的冻结(只读)压缩副本。
\n\n每次提交都会保存一 (1) 个内部 Git 树对象哈希 ID。该树对象包含提交包含的快照\xe2\x80\x94,因此提交的快照实际上是这些树之一,其中包含文件和子树的条目。由于每个提交只有一棵树,Git 可以从提交说明符转换为树对象:
\n\n$ git rev-parse master\n3c31a203fbeedb4d746889dc77cbafc395fc6e92\n$ git rev-parse master^{tree}\n5c4b695f5d5606976f5b72e1a901ed17db30a359\nRun Code Online (Sandbox Code Playgroud)\n\n在这种情况下,由 标识的提交master是第一个丑陋的大哈希,但该提交用于保存文件的内部树对象是第二个。
因此,工作树包含具有真实数据的真实文件,并且 Git树对象允许 Git 找到某个提交的所有冻结文件,前提是您给出与某个提交相对应的树对象。该git diff命令需要比较两个事物。这两件事可以是两个单独的文件\xe2\x80\x94(这是一种退化情况\xe2\x80\x94)或两个文件树。当比较两棵树时,无论它们是树对象还是充满文件的工作树,git diff都会:
这仍然只是一个概述,因为git diff可以做的不仅仅是这些事情,但这些都是基础知识。
还有一个非常重要的问题:git diff可以检查索引并将其视为一棵树。索引保存从某处获取的文件的副本。最初,某个地方就是你git checkout所做的任何承诺。但是,您可以将git add工作树中的文件复制到索引中,替换提交时存在的版本。您可以git add从工作树中提取从未在提交中的文件,因此对于索引来说是新的。并且,您可以git rm使用或不使用 files--cached将文件从索引中取出。
由于 Git 会在运行时从索引中的任何内容构建新的git commit提交,因此将索引内容与提交中的某些东西\xe2\x80\x94a 冻结树进行比较,或者工作树\xe2\x80\x94 是一个非常确实有用的东西。
1实际的树条目存储(模式、路径、哈希)三元组。这mode是一个字符串:100755对于可执行文件,100644对于非可执行文件,40000对于子树,120000对于符号链接,160000对于 gitlink。这些原本是 Linux 的stat st_mode字段,例如 Git 允许100664,rw-rw-r--但结果证明这是一个错误,所以普通的树只使用有限子集之一。Git 仍然支持100664,因为可能有一些 Git 存储库仍然有这样的条目,但除非你找到一个非常旧的存储库,否则你不会找到任何 100664。除了gitlink 条目之外,哈希始终是 blob 哈希,其中哈希是子模块中所需的提交哈希。
| 归档时间: |
|
| 查看次数: |
3361 次 |
| 最近记录: |