Git - 当你切换分支时,文件去了哪里?

5
我刚开始学习git,非常喜欢它的概念。但是有一件事情让我感到有些奇怪,我在搜索中也找不到答案。当我输入git checkout branchName 切换到我想要的分支时,当我查看Finder窗口时,可以根据我所在的分支直观地看到文件/文件夹出现或消失在repo中。
下面的两张图片展示了我如何处于一个分支,然后转到另一个分支(这是从Lynda.com课程中学到的)。左边显示了Finder以及文件夹_fonts因为在另一个分支中不存在而消失的情况。
但是它们(以及其他更改的文件)到底在哪里?从这里看,我无法同时查看来自不同分支的文件,但我只是好奇当我切换分支时,它们实际上去了哪里。

Inside one branch with a _fonts folder

Inside a different branch that does not have the _fonts folder

2个回答

6
我从这里看到,我不能同时查看不同分支的文件,但我很好奇当我更改分支时它们实际上在系统中去哪里。

是的,你可以做到

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

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)都有它自己的三种状态,所以你不能在多个工作树上使用同一个分支(branch)。
例如:
git worktree add <second path>

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

git worktree 会创建两个独立的工作文件夹,并指向同一个仓库。

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

以下是如何创建新工作树以及其结果的示例:

enter image description here


4
Git将你可以看到的文件称为“工作树”。除了这个工作树,Git还创建了一个名为.git/的文件夹,其中存储了几乎所有的配置和数据。如果你好奇,你可以使用OS X上的Finder打开此文件夹进行查看,使用open命令,或者在终端中查看它(专业提示:将-a传递给ls命令以列出隐藏的文件)。立即就能看到Git的内部运作方式,所以我一定鼓励你自己去查看。
在这个文件夹中,有一个叫做objects/的文件夹,Git用来存储文件、文件变更、提交和关联。你可以使用git cat-file探索它们的内容。关于这些对象的更多信息,请参见书中的章节; https://git-scm.com/book/en/v2/Git-Internals-Git-Objects。 < p > git 命令提供了一个良好的前端界面来处理这些对象和文件夹中的其他内容,以便您可以轻松地评估和管理工作树状态。

如果您还想了解更多信息,我强烈建议您花时间阅读我一直在链接的整本书。最后一节标题为 "Git Internals" 很好地详细介绍了 Git 的内部工作原理。


1
我认为问题是“文件去哪里了”,但你只提到了包含哈希快照的文件夹,这相当简化了。在这个转换过程中,有更多的魔法发生在幕后,这将成为一个更好的答案。 - Jeff Puckett
是的,你说得对。那个回答很粗糙。我花了更多的精力来解释.git/中还发生了什么,以及如何深入查看对象。你认为还有什么需要改进的吗? - pnovotnak
@pnovotnak 阅读《Git 内部原理》是回答这里许多问题的最佳方法。 - ElpieKay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接