我是Git的新手。基本上,当我在一个分支机构工作时,有3个地方我需要考虑。
如果我能了解以下内容,许多概念就会变得清晰起来。
- 索引中的文件内容(不仅仅是文件条目)
- 在当前分支顶端的文件内容
- 文件内容在我的工作树中
我可以很容易地在文件系统中检查3。
如何检查1和2?
或者至少在1、2和3之间存在差异?
检查它们之间的差异更容易:
CCD_ 1显示1和3的差异。
CCD_ 2表示2和1的差。
CCD_ 3用于2和3的差。
不是一个完整的解决方案,但cat 2
应该能够使用一些shell技巧(先实现git find-object-in-head
,然后实现git cat-file
)。
如果我能了解以下内容,许多概念就会变得清晰起来。
- 索引中的文件内容(不仅仅是文件条目)
索引不包含任何文件内容
您可以使用git ls-files
查看索引中的内容;使用--stage
可以获得最完整的信息。请注意,索引中实际上只是散列,加上阶段号、模式和ls-files
省略的不太有趣的项目(内部时间戳和其他缓存信息):
100644 3ccb06a84f29b059df24a6c579d3be262bd33167 0 .gitignore
[snip]
要查看内容,必须使用哈希,这是Git的内容标识符。使用git diff
0,您可以漂亮地打印任何Git对象,包括";blob";保存文件数据的对象:
$ git cat-file -p 3ccb06a84f29b059df24a6c579d3be262bd33167
# Object files
*.o
[snip]
在当前分支顶端的文件内容。
当前提交称为HEAD
。
正如今天实现的那样,HEAD
是一个实际的文件,因此:
$ cat .git/HEAD
ref: refs/heads/master
在这种情况下,HEAD
告诉我们(和Git);在分支上";,正如git status
所说,该分支的名称是master
。我们之所以知道这一点,是因为HEAD
是一个符号引用——它的内容以文字字符串ref:
开始,包括空格——而它的其余内容是refs/heads/master
,这是refs/heads/
命名空间中引用的名称,也是分支名称所在的命名空间。
通常,确定您是否在分支上的方法是使用git diff --cached
0。如果你不在分支上,你必须在特殊的匿名分支上,Git称之为"匿名"分支;拆下的头";。
同时,分支master
的提示提交的ID存储在一个或多个文件中,可以使用git rev-parse
命令找到,该命令定位正确的文件。(如果你想得到一个潜在的错误答案,你可以查看.git/packed-refs
和.git/refs/heads/master
,这两个文件目前是名为master
的分支的两个适用文件。但最好运行git rev-parse
。)
$ git rev-parse master
708de7734417df0f6ec44e8b06d8ce566f08f191
这是提交的ID;再次,git cat-file -p
将很好地打印它:
$ git cat-file -p master
tree 624403f4492cd5cbd3c0ab75059ea0229a45d908
[snip]
如果HEAD
已分离,则HEAD
文件将包含提交的原始ID。例如,如果我将git diff HEAD
0从master
分离,则.git/HEAD
将包含708de7734417df0f6ec44e8b06d8ce566f08f191
。
在我的工作树中文件内容。
这是您在普通命令行实用程序中看到的所有内容,除了包含Git存储库的.git
的内容。例如,在类似Unix的shell中,可以运行ls -R
来查看文件名。文件的内容是通过像往常一样打开和读取文件来获得的。