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

Pro*_*kat 10 git git-bash

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

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

app*_*Dev 18

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

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

因此,如果in .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 (您可以找到针对复数的免费试用优惠,并从您的试用中获得很多价值).