GIT仓库的工作目录是什么?

5
根据我对GIT的了解,Working Directory这个术语有点重载。有时候人们指的是硬盘上的目录,其中一个分支被检出,例如克隆仓库时,该分支被检出到新克隆的仓库的目录中。
但有时人们只是指包含未跟踪文件修改过的文件等抽象位置,即输入git status后红色文本所在的位置。
我希望有人能给我一个关于工作目录的官方定义。即使是在线Pro Git书也似乎有点模糊不清。
注意:我每天都在使用它,我只想知道它是什么。
干杯!

你在这两者之间看到了什么区别?你所工作的硬盘上的目录是包含你修改的内容的。但我认为术语应该是“工作副本”。 - Thilo
@Thilo 是的,我也读过那个术语。所以,不同的概念和不同的术语,都是重载的。两者之间的区别在于第二个概念不包括正在被跟踪的未修改文件,只包括已修改的文件。 - onefootswill
3个回答

7
git commit-tree一棵树代表着工作目录的特定状态
因此,工作目录代表了存储库被检出的位置,而 工作树 则代表了其状态。
git status 显示了 "工作树",表示 工作目录的状态工作目录引用 "where",工作树引用 "what"(它包含的内容,其跟踪或未跟踪的文件)。
请注意,git 2.5(2015年第二季度)将允许一个本地repo使用多个工作树。
这意味着您可以使用多个工作目录(使用git worktree add <path> [<branch>]),每个工作目录可以包含不同的工作树:例如,您可以为每个路径检出不同的分支,这意味着每个目录都包含同一repo的不同状态:多个工作树。

我认为我会将这个标记为答案,因为它真正命中了要点并回答了问题。顺便说一下,工作树是工作副本的同义词吗? - onefootswill
1
@onefootswill 我想是这样的,但我总是使用工作树,因为你可以在git命令中添加--work-tree选项。 - VonC
不错,我正在尝试整理这些术语。我认为我也会使用"工作树"。 - onefootswill

4
也许这会有所帮助。
当你在使用git仓库时,本地计算机上基本上有三件事:
1)仓库本身。包含项目的整个更改历史记录。提交、树、blob。这些存储在.git目录中。
2)你的工作副本。当你从仓库“checkout”代码(通常是一个分支)时创建它。它开始时拥有你从仓库检出的所有文件,但你可以对它们进行操作。这些存储在.git目录之外的常规文件中。
3)称为“index”的暂存区。当你向仓库提交时,你首先将你的更改“add”到索引中。这基本上是获取你要提交的文件的快照。然后你可以原子性地提交所有这些更改。或者查看它们。或者添加一些更多。索引也存储在.git目录中。
未跟踪的文件:那些只存在于你的工作副本中而不属于仓库的文件。
修改过的文件:那些在你的工作副本中与仓库中内容不同的文件。它们可以已经“staged”(即添加到索引)或没有。
当你运行类似于git status或git diff的命令时,工具会查看你的工作副本中文件的内容,并将它们与仓库(和索引)进行比较。文件状态不是在任何地方“存储”的东西,它是即时计算出来的。

我已经了解了1和3,2对我来说很有意义。这是所有检出的文件。我认为它包括未修改的文件,尽管人们说它仅涉及未跟踪和修改的文件。这是一个令人困惑的领域,因为人们在语言上不够准确。或者可能是他们自己不理解细节。 - onefootswill
还要注意的是,当你执行 git status 命令时,它指的是工作目录,而不是工作副本。有趣的发现。 - onefootswill
“Working Directory” 是指哪里?我的 “git help status” 显示的是 “Working Tree”,这并没有让事情变得更好…… - Thilo
如果您想放弃更改,请使用checkout命令。 - onefootswill

1
< p > .git 目录所在的目录及其下所有(未排除的)目录。


这与我加粗的第一个概念相关(不包括“工作目录”一词)。因此,它绝对不同于未跟踪和修改的文件? - onefootswill
这并不一定是正确的,因为可以通过GIT_DIR环境变量或--git-dir命令行选项更改.git目录的位置。 - Magnus Bäck

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