如何在'index'和"当前分支的提示"中显示文件内容?

  • 本文关键字:提示 显示文件 index 分支 git
  • 更新时间 :
  • 英文 :


我是Git的新手。基本上,当我在一个分支机构工作时,有3个地方我需要考虑。

如果我能了解以下内容,许多概念就会变得清晰起来。

  1. 索引中的文件内容(不仅仅是文件条目)
  2. 在当前分支顶端的文件内容
  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)。

如果我能了解以下内容,许多概念就会变得清晰起来。

  1. 索引中的文件内容(不仅仅是文件条目)

索引不包含任何文件内容

您可以使用git ls-files查看索引中的内容;使用--stage可以获得最完整的信息。请注意,索引中实际上只是散列,加上阶段号、模式和ls-files省略的不太有趣的项目(内部时间戳和其他缓存信息):

100644 3ccb06a84f29b059df24a6c579d3be262bd33167 0   .gitignore
[snip]

要查看内容,必须使用哈希,这是Git的内容标识符。使用git diff0,您可以漂亮地打印任何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 --cached0。如果你不在分支上,你必须在特殊的匿名分支上,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 HEAD0从master分离,则.git/HEAD将包含708de7734417df0f6ec44e8b06d8ce566f08f191

在我的工作树中文件内容。

这是您在普通命令行实用程序中看到的所有内容,除了包含Git存储库的.git的内容。例如,在类似Unix的shell中,可以运行ls -R来查看文件名。文件的内容是通过像往常一样打开和读取文件来获得的。

最新更新