我对 git 很陌生。
我刚刚了解了工作目录和暂存区域的概念。
我不太清楚暂存区的用途。
如果暂存区域不存在并且我们可以直接从工作目录提交到本地存储库,可能会出现什么问题?
抱歉,如果我的问题很愚蠢。
谢谢并致以问候,
京东
你的问题一点也不傻。它是构建整个 Git 大厦的少数几个基本概念之一。
- The 工作目录是您工作的实际位置,您可以在检出文件时看到它们,其中包含(除其他外)
.git
子目录。这将形成您的 git 存储库,以及远程存储库的本地副本(如果您最初克隆了它)。
- The index是 Git 实际跟踪的文件列表:它由一个单一的平面二进制文件组成,其中包含固定大小的条目
.git
子目录,简单命名index
。这意味着位于工作目录中且 Git 未明确遵循的所有文件将始终保持不变。
您还需要知道 Git 是snapshot基于SCM系统:每次修改文件时,都会重新完整记录。 Git 不会记录版本之间的差异(至少在现阶段不会)。因此,每个提交都是由引用每个提交的当前版本的树状文件列表形成的。
这就是索引开始变得聪明的地方:当您使用以下命令将文件添加到跟踪列表时git add
,您不仅仅是将其名称和路径添加到索引中:Git 还将其当前内容保存在一个对象中,从而开始构建实际的即将到来的提交的有效负载。当你这样做时git commit
,git 只是将该索引的内容保存为新修订版。这就是使de facto该索引是一个“暂存区”。
这会产生几个后果:
- 新提交中实际记录的实际上是文件的状态,就像您所做的那样
git add
, not git commit
;
- 您可以轻松决定实际提交的内容:您不必提交自上次提交以来修改过的每个跟踪文件;
- 要确定存储库的状态,git 只需要比较工作目录、索引和最后一次提交(实际上是 HEAD 当前引用的状态)的状态。
我们可以通过以下方式总结最后一点:
- 所有工作目录、索引和上次提交都引用相同的文件内容:存储库是最新的:
- 索引和提交是相同的,但工作目录包含不同的文件内容:已经进行了一些修改,需要添加:“未暂存的更改”;
- 工作目录和索引相同,但与上次提交不同:已进行一些修改并已标记为记录:“暂存更改”;
- 所有三个实体都是不同的:一些修改已更改,但自上次调用以来您已再次修改文件
git add
(这仍然完全合法)或者您根据补丁块执行了部分添加git add -p
仅选择文件中感兴趣的内容:“暂存更改”和“未暂存更改”都显示在git status
.
最后,这提供了最后但并非最不重要的优点:由于修改检测基于文件内容而不是其上次修改时间,因此您可以轻松取消所做的操作。当文件“不小心”回到开始时,它会自动消失git status
's list.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)