Git:“工作树”到底是什么?与“工作目录”相同吗?

2024-03-04

我正在阅读大量有关 Git 的文档,最近我一直在寻找“工作树​​”概念,但我不明白“工作树”到底是什么。

我找到了这样的描述:什么是工作树? https://mijingo.com/blog/what-is-the-working-tree-in-git这似乎是最容易理解的。但我并不完全理解它。

在链接中我可以读到:

Git 中的工作树是一个目录(及其文件和子目录)在您的文件系统上

据我所知,工作树是我计算机上的一个文件夹。正确的?具体是哪个文件夹?

解释如下...

与一个相关联存储库.

The term repository in the explanation is refering to the local repository as anyone can see in the following picture (the blue-green rectangle)? enter image description here

在 stackoverflow 中寻找类似的问题,我发现了这个:工作树与工作目录 https://stackoverflow.com/questions/39128500/working-tree-vs-working-directory

格雷格回答的第二个答案说:

工作树是指包含.git文件夹的目录,包括所有子目录和文件。

所以我知道工作树与工作目录相同。正确的? 我的意思是,我拥有项目源代码的目录,例如 C:\Richard\Projects\Calc\ ,这是我执行命令的位置git init(在 \Calc 内)。

我的理解正确吗?


The 官方术语定义了工作树 https://git-scm.com/docs/gitglossary#def_working_tree as:

实际检出文件的树.
工作树通常包含 HEAD 提交树的内容,以及您已进行但尚未提交的任何本地更改。

它没有提到“工作目录”。

我的意思是,我的项目源代码所在的目录,例如C:\Richard\Projects\Calc\这就是我执行命令的地方git init(里面\Calc).

不总是。

工作树不always have a .git in it:

  • 要么因为环境变量GIT_DIR is set https://git-scm.com/book/en/v2/Git-Internals-Environment-Variables#_repository_locations(并引用实际路径.git子文件夹,可以是其他任何地方)

  • 或者因为您已经使用了git worktree https://git-scm.com/docs/git-worktree命令,它允许您从多个单独的工作目录中签出多个分支one克隆存储库:请参阅“Git 的多个工作目录? https://stackoverflow.com/a/30185564/6309".

但是,正如最后一个命令所示,“工作目录”用作“工作树”的同义词。

第二种是首选:在 Git 一开始,提交 2a29da7 https://github.com/git/git/commit/2a29da7c6d6103c4719c71f6cce88e853260912c(Git v0.99.5,2005 年 8 月),Junio C. Hamano 提到:

一致使用“工作树”、“对象名称”、“存储库”作为规范术语。


“工作树”和“每个工作树引用”在术语表中,但“工作树”本身不在术语表中,这一点已在 Git 2.36(2022 年第 2 季度)中得到纠正。

See commit 2df5387 https://github.com/git/git/commit/2df5387ed04159b188de65dff9654d4aae1062d2 (09 Feb 2022) by Junio C Hamano (gitster) https://github.com/gitster.
(Merged by Junio C Hamano -- gitster -- https://github.com/gitster in commit 9a1d169 https://github.com/git/git/commit/9a1d16989fd8ab14c1831e143c39d29fe9192df1, 18 Feb 2022)

glossary https://github.com/git/git/commit/2df5387ed04159b188de65dff9654d4aae1062d2:描述“工作树”

我们对“per worktree ref”有描述,但术语表中没有描述“worktree”。
不过,我们确实有“工作树”。

简单地说,“工作树”是编辑器和编译器交互的对象。
“工作树”是一种允许将一个或多个“工作树”附加到存储库并用于独立检查不同提交和分支的机制,其中不仅包括“工作树”,还包括存储库元数据,例如 HEAD、索引以支持同时使用它们。
从历史上看,我们可以互换使用这些术语,但我们一直在尝试使用“工作树”,而不是“工作树”。

术语表中大多数现有对“工作树”的引用确实主要指工作树部分,除了 HEAD 和 refs/bisect/* 等引用是每个“工作树”的,但更准确地说它们是每个“工作树”。

glossary-content现在包含在其man page https://github.com/git/git/blob/2df5387ed04159b188de65dff9654d4aae1062d2/Documentation/glossary-content.txt#L672-L680:

worktree

一个存储库可以有零个(即裸存储库)或一个或 更多工作树附加到它。一个“工作树”由 “工作树”和存储库元数据,其中大部分是 在单个存储库的其他工作树之间共享,以及 其中一些是每个工作树单独维护的 (例如索引、HEAD 和伪引用,如 MERGE_HEAD、 每个工作树引用和每个工作树配置文件)。


因此,Git 2.36(2022 年第 2 季度)收紧了文档中围绕“工作树”和“工作树”的语言。

See commit 07d8538 https://github.com/git/git/commit/07d85380b21653b949f2777903e44aaf0fdb6c44, commit f13a146 https://github.com/git/git/commit/f13a146c81e361eab43cd095c80c01562b6016de, commit 7b21582 https://github.com/git/git/commit/7b215826f32f9fd0dc58703f012326dba6006e34, commit a777d4c https://github.com/git/git/commit/a777d4c75061f99ae16246835db9d0750ce01d4c, commit 6036be1 https://github.com/git/git/commit/6036be14581878c42158407a9f3344d63f090057, commit 5997014 https://github.com/git/git/commit/599701441e5e7853339306f56e82cb02543d53a7, commit c57bf8c https://github.com/git/git/commit/c57bf8ce9e6f41947e661fdecef3736aa816c50e, commit 23f832e https://github.com/git/git/commit/23f832e29ec20ddbded431fdf55f49dc0f54e794, commit ace5ac5 https://github.com/git/git/commit/ace5ac533a198e9bb7f634dafa8e7b10a42919c4, commit 8639705 https://github.com/git/git/commit/863970536525f071b29f2ee73ac9ac0a35b32a43, commit 92d9234 https://github.com/git/git/commit/92d92345ce5996933f5cfc357dce1e1744487b6a (23 Feb 2022) by Derrick Stolee (derrickstolee) https://github.com/derrickstolee.
(Merged by Junio C Hamano -- gitster -- https://github.com/gitster in commit aae90a1 https://github.com/git/git/commit/aae90a156de9d84cfe5e2052678d22c18ff285b2, 06 Mar 2022)

worktree https://github.com/git/git/commit/f13a146c81e361eab43cd095c80c01562b6016de:使用“工作树”而不是“工作树”

Signed-off-by: Derrick Stolee

区分“工作树”和“工作树”很有帮助。
工作树包含工作树以及附加元数据。
此元数据包括每个工作树的引用和特定于工作树的配置。

这是对 git-worktree.txt 的多次更改中的第六次,仅限于 DETAILS 部分。

git worktree现在包含在其man page https://github.com/git/git/blob/f13a146c81e361eab43cd095c80c01562b6016de/Documentation/git-worktree.txt#L322:

每个链接的工作树在存储库中都有一个私有子目录
...
链接工作树路径的基本名称,可能附加一个
...

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Git:“工作树”到底是什么?与“工作目录”相同吗? 的相关文章

  • Git 版本控制中忽略父目录

    如何忽略父目录 gitignore 我尝试了这种模式 但似乎它们不起作用 如果您想忽略某个文件夹但不想修改现有的 gitignore 请将 gitignore 放入仅包含星号的文件夹中 下面是一个快速的 BASH 示例 用于完成 idea
  • 获取签出修订版的 git 标签?

    我正在做 git tag current tag example to test task git checkout tag example to test task HEAD is now at 75fdde3 commit commen
  • 全局 git 配置数据存储在哪里?

    使用时git config global要进行设置 它将写入哪个文件 Example git config global core editor blah 我在这些地方找不到它 C Program Files Git etc gitconf
  • Git 显示更改后的相同文件

    当我似乎无法弄清楚更改时 Git 向我显示整个文件已更改 这是 cygwin git 但它也发生在 msysgit 中 git version git version 2 1 1 diff lt git show HEAD File cs
  • 如何列出 Git 1.7+ 中的所有远程分支?

    我试过了git branch r 但这仅列出我在本地跟踪的远程分支 如何找到我没有的列表 命令是否列出对我来说并不重要all远程分支或仅那些未跟踪的分支 For the vast majority 1 of visitors here th
  • 如何在 Android Studio 中比较两个 Git 分支?

    我不确定是否可以将主分支 或任何其他分支 与当前功能分支进行比较 例如GIT does 我想要两个分支 主分支和功能分支 之间的差异 以便我可以在合并之前比较差异 我发现 Git UI 对用户不太友好 就像在 AS 中一样 我可以遍历代码并
  • git:如何查明某个分支是否有拉取请求?

    我在 git 分支上 有没有办法查看该分支是否有拉取请求 在这种特殊情况下 Atlassian Stash 用于管理拉取请求 当然我可以使用Stash的Web界面来搜索拉取请求 但我也可以仅使用 git 命令行工具从脚本执行此操作吗 Cor
  • 命令来确定当前 HEAD 的上游引用?

    我正在寻找我所希望的简单的一行命令确定当前签出分支的正确上游引用 本质上就像是 git branch remote HEAD 如果有效 会将符号模式 HEAD 转换为当前分支名称 然后选项 remote然后将其更改为远程跟踪分支的引用 但它
  • 使用 GIT 自动增加 AssemblyFileVersion

    好吧 我知道这可能不是传统的 但除此之外 我使用 AssemblyFileVersion 作为我的 构建名称 字符串 它的格式如下 File Version information for an assembly consists of t
  • Git:结帐而不运行结帐后挂钩

    我有一个我喜欢的结帐后挂钩 大多数时候 但有时我知道运行它会浪费时间 或者 因为它会删除并重建我的开发数据库 所以我不希望它去做它的事情 有没有跳过钩子的 git 选项 公平地说 我已经开始寻找一个了 我认为没有命令行选项可以完成您想要的操
  • 如何预览 Git 中的隐藏内容?

    我想检查一个存储 并找出如果我将其应用于当前状态的工作树 它会发生什么变化 我知道我可以对存储进行 git diff 但这向我展示了工作树和存储之间的所有差异 而我只是想知道存储应用将改变什么 git stash show将向您显示最近存储
  • 如何重命名 GitHub 网站上的目录/文件夹?

    我在 GitHub 网站上找到了一种方法rename https github com blog 1436 moving and renaming files on github一个文件并成功完成 我也找到了一种方法rename https
  • 警告:您的 git 版本是 1.9.3。存在严重的安全漏洞

    我在部署到 Heroku 期间收到有关 git 1 9 3 严重安全漏洞的警告 我尝试通过 homebrew 更新 git 但发现 git 最初并不是通过 homebrew 安装的 然后我通过自制程序安装了它 brew update bre
  • git在Windows和Linux之间切换后强制刷新索引

    我有一个Windows和Linux共享的磁盘分区 格式 NTFS 它包含一个 git 存储库 约 6 7 GB 如果我只使用Windows or 只使用Linux操作 git 存储库一切正常 但是每次切换系统的时候git status命令将
  • GitHub API:标记提交所属(与 git describe --tag 并行)

    我正在使用 GitHub API 进行实验octokit https github com octokit octokit rb红宝石 我的目标是能够提取提交 SHA 所属的 标签 现在我可以使用命令行轻松地执行此操作 gt git des
  • 具有单独 work_tree 的 Git 子模块

    我按照本页上的教程使通过 Git 部署我的网站变得简单 http toroid org ams git website howto http toroid org ams git website howto 到目前为止一切都很好 但是我最近
  • Windows 版 GitKraken 中的文件名太长

    正如建议的Q22575737 https stackoverflow com a 22575737 6623589 我已经更新了我的注册表并设置了git config system core longpaths true在处理长路径时 问题
  • 相当于“svn update -r”的 git 是什么?

    我是最近的 git 转换者 能够使用 git svn 将我的分支保留在本地而不干扰 svn 服务器真是太棒了 最新版本的代码中存在一个错误 我想确定一个它起作用的时间 以便我可以使用 git bisect 我找不到正确的命令来及时返回 谢谢
  • 运行“git apply”时出错

    当我尝试时 您能否告诉我如何解决 补丁不适用 错误 git 应用补丁 git apply 0001 my patch error patch failed test xml 114 error text xml patch does not
  • 忽略 git 中的本地配置文件

    Rails 应用程序中有一些本地文件 属于我们存储库的一部分 我希望 git 忽略它们 基本上 我希望 git 忽略我对 config environments 目录和 config application rb 文件中的任何内容所做的所有

随机推荐

  • 如何正确地将sqlite框架添加到Xcode项目中?

    我正在尝试将 SQLite 添加到我的项目中 我检查了构建阶段选项卡下的目标依赖项 它是空的 这是真的 我收到以下错误 无法运行命令 Ld SQLite 该目标可能包括其自己的产品 我正在使用 swift 3 你能帮我么 提前致谢 我目前不
  • 在 HSQLDB 2.0.0-rc8 中选择下一个序列值的“正确”方法

    假设我有一个序列 称为 TEST SEQ 选择下一个值的正确方法是什么 这不起作用 select next value for TEST SEQ 可能是因为它需要一个 FROM 子句 在休眠中查看 HSQLDialect getSequen
  • 帕拉米科。按修改时间获取文件

    localpath U utime sftp stat TestBTEC st mtime last modified datetime fromtimestamp utime if datetime now last modified l
  • 使用类为第三方库创建类型

    我有一个第三方库 它具有以下 ES6 类签名 class Machine constructor options static list callback create options callback 我尝试为此类创建类型声明 但出现一些
  • 在 Vim 中打开 NERDTree 和 Tlist 并排放置

    我正在寻找一种方法来 自动 打开左侧正上方的 NERDTree 和 Tlist 以便每个插件占据屏幕高度的一半 我已经找到了这个问题 https stackoverflow com questions 6005874 opening a w
  • Servlet 中的 JSF 托管 Bean

    有没有办法从 servlet 访问 JSF 托管 bean 在 Servlet 中 您可以通过以下方式获取请求范围的 beans Bean bean Bean request getAttribute beanName 和会话作用域的 be
  • Java 数组效率

    我不能 100 确定该机制正在发挥作用 因此我决定在此发帖以进一步澄清 我正在做一个项目 应该用Java处理大量数据 它必须是Java 我希望它尽可能高效 我所说的高效是指内存和计算速度应该放在第一位 可读性应该放在第二位 现在我有两种方法
  • 使用图像(宽高比填充)和视频制作 AVMutableComposition 以适合宽高比

    我正在尝试使用尺寸始终为 CGSize 375 667 的图像制作新视频 但视频尺寸不同 且 contentMode 为 aspectFit 问题是我无法弄清楚如何使整个视频组合具有正确的尺寸 即图像尺寸 而是视频的自然尺寸和一堆奇怪的结果
  • 批量使用 PowerShell 命令的问题

    我使用 PowerShell 命令从云下载 zip 文件 该命令在 PowerShell 和命令行中都能正常工作 但是 如果我将命令行中的命令插入批处理脚本中 则只会下载 html 为什么该命令在命令行中可以正常工作 但在批处理文件中却不能
  • GET 文件上传如何工作?

    有谁知道怎么办GWT文件上传有效吗 我知道关于FileUpload小部件以及如何使用它 我想知道它的内在机制是什么 我们无法从中获取文件内容FileUpload客户端中的小部件以及它如何发送到服务器 我用谷歌搜索但没有得到解决方案 提前致谢
  • 仅当活动未显示时才显示通知

    我有一个想要处理的后台任务 问题是 当任务完成时 我想调用一个新的 Activity 来向用户显示结果 前提是我的主 Activity 正在显示 否则我只想发送一个通知 以便用户可以看到该操作已完成 并且可以随时打开它 我正在考虑使用一个服
  • 强制从 s3 亚马逊服务器下载

    我一直在开发一个新的网络应用程序 它依赖于亚马逊S3服务器作为存储系统 以及代码点火器作为 PHP 框架 我需要在单击链接时强制下载文件 原始网址如下所示 http www our web com download do 1 jpg 它会生
  • 主构造函数内的 Scala 局部变量

    在 Scala 中如何在主构造函数中定义局部变量 我需要解决这个练习Scala for the impatient book 编写一个具有接受字符串的主构造函数的 Person 类 包含名字 空格和姓氏 例如 new 人 弗雷德 史密斯 提
  • Kafka 主题分区

    关于 Kafka 主题和分区的一个简单问题 假设以下场景 Producer1将数据写入Topic1 Producer2向Topic2写入数据 Consumer读取Topic 1和Topic 2的数据 Consumer2仅从Topic2读取数
  • S 的最长平衡子序列

    给出的问题 一串括号据说是 如果字符串中的左括号和右括号可以正确配对 则为平衡 例如 字符串 和 都是平衡的 而字符串 则不是 均衡 给定一个字符串S长度n由括号组成 假设你想找到最长的子序列S这是平衡的 使用动态规划 设计一个算法来找到最
  • 从 Resteasy 服务器返回文件

    你好 我想从 Resteasy 服务器返回一个文件 为此 我在客户端有一个链接 它使用 ajax 调用休息服务 我想在其余服务中返回文件 我尝试了这两段代码 但都没有按照我想要的方式工作 POST Path exportContacts p
  • 仅加载关系的 id(pluck)

    我有一个简单的应用程序 使用 Laravel 5 5 13 public function index return Pet all 这列出了所有宠物 我有多对多关系 其中许多用户可以拥有同一只宠物 宠物的人类家庭 我想加载这些用户 Doi
  • 文件夹如何工作?

    谁能解释一下怎么做foldr http haskell org ghc docs latest html libraries base Prelude html v foldr work 举这些例子 Prelude gt foldr 54
  • 如何在phar文件代码中获取.phar文件真实目录?

    我正在尝试创建一个php可执行文件 phar文件 来生成一些文件 我想知道如何获取phar文件的真实路径 在phar文件代码内 我想要做的是在phar文件的同一级别创建一个文件夹并在那里创建新文件 但是realpath DIR 似乎不起作用
  • Git:“工作树”到底是什么?与“工作目录”相同吗?

    我正在阅读大量有关 Git 的文档 最近我一直在寻找 工作树 概念 但我不明白 工作树 到底是什么 我找到了这样的描述 什么是工作树 https mijingo com blog what is the working tree in gi