Git 存储库混乱
Git repository confusion
昨天我开始学习 git。但是看到两个相互矛盾的存储库定义,我感到很困惑。
1st: A repository is a directory which contains your project. A
repository is made up of commits.
2nd: A repository is the .git folder inside your project.
这两种说法实际上表达的是同一件事吗?那他们怎么办?
我看到了 .git 隐藏文件夹,这肯定不是我的项目。
这两个定义都过于关注存储库在您的本地文件系统上的样子。
从概念上讲,存储库是版本控制的文件树。包含同一项目不同时间点、不同开发分支的快照(或"commits")
在本地克隆存储库时,所有内容都包含在一个文件夹中。重建所有不同快照所需的数据位于 .git 子文件夹中。文件夹的其余部分代表项目的某个快照,以及您当前对其所做的任何未提交的更改。您可以随时决定通过执行 "commit" 创建新快照。用户可以通过 pushing/pulling 他们 to/from 远程存储库共享快照。
快照链接在一起,所以如果你得到一个快照,那么你也会递归地得到它所基于的所有其他快照。这使您可以检查导致该状态的项目的整个历史。
与 一样,第二个定义——存储库是 .git
目录中的内容——关注 组织。
但是,从形式上讲,我不得不同意第二个定义。其余区域——您进行工作的区域——不属于存储库本身。它只是存储库旁边。
这是因为.git
文件夹里面的东西是Git的。您可以查看它,如果您了解 Git 的内部结构——从一个 Git 版本到另一个版本的变化,随着 Git 随着时间的推移而演变——您甚至可以直接在此处编辑内容。但一般来说,你应该把这些东西留给 Git 自己。
不在 .git
文件夹中的文件是你的。你可以随心所欲地使用它们。 Git 将 填写 你的工作区,当你要求时,从提交中。
简而言之,你 在你的 工作树中工作。这片区域是你的,想干什么就干什么。然后你在不同的时间点告诉 Git:做某事。 某事可以:
- 将文件从您的工作树复制到 Git 的存储库中;或者
- 将文件从 Git 的存储库复制到您的工作树;或者
- 做许多其他事情之一,例如比较特定提交、查看过去的提交、调用 另一个 Git 存储库并与之交换提交,等等.
您的 工作区(不是存储库本身的一部分)和 Git 的区域(实际上包含存储库)之间的区别变得均匀如果您使用 git worktree
命令,则更重要,该命令首先在 Git 2.5 中添加。特别是,您可以使用 git worktree add
创建额外的工作树。每个这样的工作树不在存储库中,事实上,当你完成它时,你可以简单地删除这样的工作树.
(Git 将您的工作区称为 working tree 或 work-tree。这就是添加命令的原因一个新的工作树是 git worktree add
.)
Git 本身的主题是 Git 存储 提交 。每个提交依次存储文件。事实上,每次提交都包含 所有 文件的完整快照。 Git 的存储文件使用重复数据删除,因为大多数提交大多与其他提交保存相同版本的文件。它们还以一种特殊的、只读的、仅 Git 的格式存储。实际上只有 Git 可以 读取 这些文件。这就是 Git 将文件提取到您的工作树的原因。
特别奇怪的部分是,当 Git 进行新提交时——这就是你 Git 存储更新文件的方式,在你更新它们之后——它从副本中创建它们不是您工作树中的副本!如果您曾经使用过 Mercurial,它在其他方面很像 Git,这可能有点令人费解。在 Mercurial 中,hg commit
从工作树中的文件进行新提交。这很简单明了。但是 git commit
从 Git 的 index 中的文件而不是工作树中的文件进行新提交。您必须继续使用 git add
将您更新的任何文件复制回 Git 的索引。
因此,Git的索引——Git也称为暂存区——是什么持有你提议的下一次提交。在易于使用的 Mercurial 中,您的工作树包含您提议的下一次提交。在 Git 中,建议的下一次提交开始与当前提交相匹配。当您更改工作树中的文件时,您必须将更改的文件复制回 Git 的索引,以更改建议的下一次提交。
(Git 进行新提交的方法为您提供了在 Mercurial 中更难实现的灵活性,代价是需要大量 git add
命令。)
注意:在现代 Git 中,可以使用 git init --separate-git-dir
将 Git 的存储库(.git
文件夹)与您的工作树分开。不过,我不知道有谁在日常工作中使用过它。
昨天我开始学习 git。但是看到两个相互矛盾的存储库定义,我感到很困惑。
1st: A repository is a directory which contains your project. A repository is made up of commits.
2nd: A repository is the .git folder inside your project.
这两种说法实际上表达的是同一件事吗?那他们怎么办?
我看到了 .git 隐藏文件夹,这肯定不是我的项目。
这两个定义都过于关注存储库在您的本地文件系统上的样子。
从概念上讲,存储库是版本控制的文件树。包含同一项目不同时间点、不同开发分支的快照(或"commits")
在本地克隆存储库时,所有内容都包含在一个文件夹中。重建所有不同快照所需的数据位于 .git 子文件夹中。文件夹的其余部分代表项目的某个快照,以及您当前对其所做的任何未提交的更改。您可以随时决定通过执行 "commit" 创建新快照。用户可以通过 pushing/pulling 他们 to/from 远程存储库共享快照。
快照链接在一起,所以如果你得到一个快照,那么你也会递归地得到它所基于的所有其他快照。这使您可以检查导致该状态的项目的整个历史。
与 .git
目录中的内容——关注 组织。
但是,从形式上讲,我不得不同意第二个定义。其余区域——您进行工作的区域——不属于存储库本身。它只是存储库旁边。
这是因为.git
文件夹里面的东西是Git的。您可以查看它,如果您了解 Git 的内部结构——从一个 Git 版本到另一个版本的变化,随着 Git 随着时间的推移而演变——您甚至可以直接在此处编辑内容。但一般来说,你应该把这些东西留给 Git 自己。
不在 .git
文件夹中的文件是你的。你可以随心所欲地使用它们。 Git 将 填写 你的工作区,当你要求时,从提交中。
简而言之,你 在你的 工作树中工作。这片区域是你的,想干什么就干什么。然后你在不同的时间点告诉 Git:做某事。 某事可以:
- 将文件从您的工作树复制到 Git 的存储库中;或者
- 将文件从 Git 的存储库复制到您的工作树;或者
- 做许多其他事情之一,例如比较特定提交、查看过去的提交、调用 另一个 Git 存储库并与之交换提交,等等.
您的 工作区(不是存储库本身的一部分)和 Git 的区域(实际上包含存储库)之间的区别变得均匀如果您使用 git worktree
命令,则更重要,该命令首先在 Git 2.5 中添加。特别是,您可以使用 git worktree add
创建额外的工作树。每个这样的工作树不在存储库中,事实上,当你完成它时,你可以简单地删除这样的工作树.
(Git 将您的工作区称为 working tree 或 work-tree。这就是添加命令的原因一个新的工作树是 git worktree add
.)
Git 本身的主题是 Git 存储 提交 。每个提交依次存储文件。事实上,每次提交都包含 所有 文件的完整快照。 Git 的存储文件使用重复数据删除,因为大多数提交大多与其他提交保存相同版本的文件。它们还以一种特殊的、只读的、仅 Git 的格式存储。实际上只有 Git 可以 读取 这些文件。这就是 Git 将文件提取到您的工作树的原因。
特别奇怪的部分是,当 Git 进行新提交时——这就是你 Git 存储更新文件的方式,在你更新它们之后——它从副本中创建它们不是您工作树中的副本!如果您曾经使用过 Mercurial,它在其他方面很像 Git,这可能有点令人费解。在 Mercurial 中,hg commit
从工作树中的文件进行新提交。这很简单明了。但是 git commit
从 Git 的 index 中的文件而不是工作树中的文件进行新提交。您必须继续使用 git add
将您更新的任何文件复制回 Git 的索引。
因此,Git的索引——Git也称为暂存区——是什么持有你提议的下一次提交。在易于使用的 Mercurial 中,您的工作树包含您提议的下一次提交。在 Git 中,建议的下一次提交开始与当前提交相匹配。当您更改工作树中的文件时,您必须将更改的文件复制回 Git 的索引,以更改建议的下一次提交。
(Git 进行新提交的方法为您提供了在 Mercurial 中更难实现的灵活性,代价是需要大量 git add
命令。)
注意:在现代 Git 中,可以使用 git init --separate-git-dir
将 Git 的存储库(.git
文件夹)与您的工作树分开。不过,我不知道有谁在日常工作中使用过它。