我是Git的新手。基本上,当我在分支机构工作时,我需要考虑3个地方。
如果我能够了解下面的内容,很多概念都会变得清晰。
我可以在文件系统中轻松检查3。
如何检查1和2?
或至少在1,2和3之间差异?
答案 0 :(得分:1)
在它们之间检查差异更容易:
git diff
显示1和3的差异。
git diff --cached
显示差异为2和1。
git diff HEAD
。
不是一个完整的解决方案,但cat 2
应该可以使用一些shell技巧(实现git find-object-in-head
然后git cat-file
)。
答案 1 :(得分:1)
如果我能够了解下面的内容,很多概念都会变得清晰。
- 索引中的文件内容(不仅仅是文件条目)。
醇>
索引不包含任何文件内容。
您可以使用git ls-files
查看索引中的内容;使用--stage
获取最完整的信息。请注意,索引中的内容实际上只是哈希值,加上阶段号,模式以及ls-files
省略的有趣内容(内部时间戳和其他缓存信息):
100644 3ccb06a84f29b059df24a6c579d3be262bd33167 0 .gitignore
[snip]
要查看内容,您必须使用哈希,这是Git的内容标识符。使用git cat-file -p
,你可以漂亮地打印任何Git对象,包括" blob"保存文件的对象'数据:
$ git cat-file -p 3ccb06a84f29b059df24a6c579d3be262bd33167
# Object files
*.o
[snip]
当前分支顶端的文件内容。
当前提交称为HEAD
。
正如今天所实施的那样,HEAD
是一个实际文件,所以:
$ cat .git/HEAD
ref: refs/heads/master
在这种情况下,HEAD
告诉我们(和Git)我们是"在分支上#34;正如git status
所说的那样。该分支的名称为master
。我们知道这是因为HEAD
是一个符号引用 - 它的内容以文字字符串ref:
开头,包括空格 - 其余内容是refs/heads/master
,它是引用的名称在refs/heads/
命名空间中,这是分支名称所在的位置。
通常,查明您是否在分支机构的方法是使用git symbolic-ref HEAD
。如果你不在分支机构,你必须在特殊的匿名分支上,Git称之为"分离的HEAD"。
同时,分支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。例如,如果我从HEAD
分离master
,则.git/HEAD
将包含708de7734417df0f6ec44e8b06d8ce566f08f191
。
我工作树中的文件内容。
这是您使用普通命令行实用程序看到的所有内容,但.git
的内容除外,其中包含Git的存储库。例如,在类Unix的shell中,您可以运行ls -R
来查看文件名。文件'通过打开和阅读文件获得内容。