存储本地分支的文件在哪里

时间:2015-11-05 21:34:47

标签: git git-bash

今天我跑到了一个有趣的东西,让我想知道git如何处理本地分支。所以我在我的存储库中遇到了一些问题,并删除了本地文件夹(进入回收站)并重新克隆。(极端可能)之后我意识到我删除了一个我从未推过的本地分支,因为它是一个私人项目。我惊慌了一下,决定从回收站恢复文件夹并将其放在不同的位置,看看我是否可以获取我工作的几个文件并将其推送到远程。起初我只是尝试使用文件浏览器搜索无法找到文件(我很难过)然后我记得我在删除之前我在不同的分支中,所以我将gitbash重定向到项目旧回购的新位置和' git branch'看到我所有的老枝都出现了(git magic#1)。所以我检查了有问题的分支,文件资源管理器恰好打开了我期待文件的位置,看到文件神奇地出现了(git magic#2)

这让我想知道git在哪里存储本地分支的所有数据。我知道有一个隐藏的文件夹,但我搜索了该文件并且它没有显示它是否已压缩并在那里重命名?

1 个答案:

答案 0 :(得分:18)

项目根目录中有一个隐藏文件夹.git(它在您运行git init或初始化存储库时创建),其中git存储所有“魔法位”。它不是非常神奇 - 有一个HEAD文本文件说明“头”所在的位置(例如当前检出分支或提交),refs目录中有更多目录,其中包含与本地文件对应的文件和远程分支名称 - 这些文件中的每一个都只是一个带有提交SHA的文本文件(就像一个字典,当你说“检出主分支!”时,git会去查找相应的文件,读取提交的内容 - 并检查那个提交)。

提交在objects/目录中方便地引用“对象”。那个dir实际上包含了更多带有双字母名称的目录 - 前两个字母是SHA哈希 - 它与目录中的文件名一起构成了完整的哈希(提交,树或blob)。在那个两个字母的目录里面,有实际的“物体”(git magic!)。对象可以是“blob”或“tree”类型,前者对应于文件,后者(松散地)对应于目录。阅读docs中的git对象 - 这是一个简单的阅读,它还为您提供了一些工具来查看单个对象。

因此,如果.git/refs/heads/master是一个内容为a2789da8f918ef26c90e51d05de5723e5ad543a4的文本文件 - 这意味着master在该提交中。该项目的项目“状态”存储在.git/objects/a2/789da8f918ef26c90e51d05de5723e5ad543a4中 - 这是项目目录的树对象,列出所有文件的SHA和&那个项目目录中的目录。

所以,你无法真正浏览并找到来自不同分支的实际文件--git不会以这种方式思考问题,它会将事物视为文件列表&迪尔斯。当您更改文件并提交它时,它会为该文件的内容创建一个新的“对象”,为父目录创建一个新的树对象(更新的文件更新为SHA)并写入一个提交对象(列出所有文件的树对象)项目目录中的&文件夹)。或者至少这是我的理解,或多或少。

希望有助于揭开它的神秘面纱!

2017-12-21编辑:根据@Herman的评论更新了我的旧答案。对于它的价值,这里的答案可能有点“没有足够的背景信息太多”。

较短的答案 - git将所有数据存储在项目根目录的.git目录中,它存储对项目文件夹状态的引用,而不是单独的文件副本。

为了后人,如果有人在将来偶然发现这个答案 - 我强烈推荐这个课程:

https://app.pluralsight.com/library/courses/how-git-works/table-of-contents (您可以找到针对复数的免费试用优惠,并从您的试用中获得很多价值)。