Git - 当你改变分支时文件去哪里了?

Git - Where do files go when you change branches?

刚开始了解 git,我喜欢它的概念。到目前为止,有一件事对我来说有点奇怪,我似乎无法在搜索中找到它。当我键入 git checkout branchName 以更改到我想要的任何分支时,当我查看 Finder window 时,我可以直观地看到 files/folders 根据我所在的分支在回购中出现或消失英寸

下面的 2 张图片展示了我如何在一个分支然后转到另一个分支(这是来自 Lynda.com 课程)。左侧显示 Finder 以及文件夹 _fonts 如何消失,因为它不存在于另一个分支中。

但是它到底在哪里(以及其他有变化的文件)?从我在这里看到的情况来看,我无法同时查看来自不同分支的文件,但我很好奇当我更改分支时它们在系统中的实际位置。

Git调用的文件可以看到“working tree”。除了这个工作树,Git 创建了一个名为 .git/ 的文件夹,它存储了几乎所有 repo 的配置和数据。如果您好奇,可以使用 open 命令在 OS X 上使用 Finder 打开此文件夹进行查看,或者使用您的终端细读它(提示:将 -a 传递给 ls 命令列出隐藏文件)。 git 的一些内部工作原理立即变得显而易见,所以我绝对鼓励您自己检查一下。

在此文件夹中,有一个文件夹 objects/,其中 Git 存储文件、文件更改、提交和关系。您可以使用 git cat-file 浏览它们的内容。有关这些 objects 的更多信息,请参阅书中的章节; https://git-scm.com/book/en/v2/Git-Internals-Git-Objects.

git 命令提供了一个很好的前端来处理这些 objects 和该文件夹的其他内容,以便您可以轻松评估和管理工作树状态。

如果您仍然好奇并想了解更多信息,我强烈建议您花时间阅读我一直链接到的整本书。最后一部分,标题为“Git Internals”,详细介绍了 Git 的内部工作原理。

From what I see here, I can't physically view files from different branches at one time, but I'm just curious where they actually go in the system when I change branches.

是的你可以做到

您只需按照以下步骤操作:

Git 早在 2007 年就以 git workdir 的名义公开了此功能。它位于 git contrib 文件夹下多年。

在 git 2.5 版中它被公开为 git worktree。它允许您同时在多个分支上工作。

怎么做?

# create a new working directory
# the path will be added and the given branch name will be checkout out
git worktree add <path to the new working directory/ branch name> 

# now you have 2 folders with different branches in each one of them.
# if you used something like `git worktree /tmp/aaa` than you will have 
# branch aaa checked out in the new folder and you can switch to any branch
# you wish

每个 worktree 都有自己的 3 态,因此 您不能 多个工作树上的同一分支。

例如:

git worktree add <second path>

将在您的计算机上创建另一个文件夹,允许您同时在不同的分支上工作。

git worktree 将创建 2 个相互独立的工作文件夹,同时指向同一个存储库。

这将允许您在新工作树上进行任何实验,而不会对存储库本身产生任何影响。在附图中,您可以看到有 2 个单独的 工作文件夹,但它们都使用一个存储库并共享内容。

这是一个关于如何创建新工作树及其结果的示例: