Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git暂存区的功能_Git_Github - Fatal编程技术网

Git暂存区的功能

Git暂存区的功能,git,github,Git,Github,我已经浏览并阅读了git,但对git暂存区的git理解不清楚 暂存区实际上做什么 当我们执行git add和执行git commit时,它是否会创建blob对象和树对象?commit对象链接到父commit和已链接到其blob/tree对象的对应树对象 或 它是否只是将信息存储在索引文件中(即某些内容已更改,当我们执行git添加时,它会显示ready for commit),当我们执行git commit时,所有对象的创建和链接都发生在commit、tree和blob对象之间?暂存区域是一个文件

我已经浏览并阅读了git,但对git暂存区的
git理解不清楚

暂存区实际上做什么

当我们执行
git add
和执行
git commit
时,它是否会创建blob对象和树对象?commit对象链接到父commit和已链接到其blob/tree对象的对应树对象


它是否只是将信息存储在索引文件中(即某些内容已更改,当我们执行git添加时,它会显示ready for commit),当我们执行git commit时,所有对象的创建和链接都发生在commit、tree和blob对象之间?

暂存区域是一个文件,通常包含在git目录中,它存储关于下一次提交的内容的信息。用Git的说法,它的技术名称是
索引
,但短语
暂存区
也同样适用

对文件进行
stage
只需为提交做好准备。Git及其索引只允许您提交自上次提交以来所做更改的某些部分。假设您正在开发两个功能—一个已经完成,另一个仍然需要完成一些工作。您希望提交并回家,但不希望提交第二个功能的部分,这还没有完成。您准备好您知道属于第一个特征的部分,然后提交。现在,您的提交是您的项目,第一个功能已完成,而第二个功能仍在工作目录中进行中

git add
将修改后的文件添加到队列中,以便稍后提交。文件未提交

git commit
提交已添加的文件,并使用日志创建新版本。。。如果不添加任何文件,git将不会提交任何内容。您可以使用git commit-a组合这两个操作

git push
将更改推送到远程存储库

您可以执行一个提交,它将文件保存在暂存区域中,并将快照永久存储到Git目录中。阅读更多信息:

“暂存区”是最常用和流行的索引使用方式的便利术语。你的第一个选择

当我们执行git add时,它是否创建blob对象和树对象?当我们执行git commit时,commit对象是否链接到父commit和相应的树对象,该树对象已经链接到它的blob/tree对象

几乎完全正确:
git add
将您添加的内容放入repo,并且
git commit
将commit对象与父commit和对应的树对象绑定在一起---但是对应的树对象还不在repo中,
git commit
构建树(将路径名与内容绑定在一起)通过查阅索引,这正是它所说的:一个将路径名与内容联系起来的索引

因此,
git checkout
更新索引以指向它在每个签出路径上签出的内容,
git add
更新索引以指向它为每个添加路径添加的内容


因此,您可以将其用作“暂存区”,
git commit
只关心您添加的内容,而不关心工作树中的内容。这就是为什么
git checkout
git reset
git commit
git add
都有
--补丁
选项的原因:有您签出的内容、添加的内容和工作树中的内容。在任何时候,看到其中任何一个之间的差异或“收回”您所做的部分更改都可能是有用的,可能是因为它们属于另一个提交,或者只是需要进一步的工作。

谢谢你的回答,但我已经知道你提到的所有事情。我想从
git对象模型
Perspective中寻找更多的答案来扩展一下:回到git的早期,它是围绕几个核心命令的shell脚本集合,
git commit
是一个shell脚本。它包括:(1)获取提交元数据;(2) 使用
git-write-tree
将索引/暂存区域变为具有子树的顶级
tree
对象;(3) 使用
git提交树
将第1部分的元数据与第2部分的树以及
HEAD
MERGE\u HEAD
中的父提交(如果存在)相结合;(4) 通过
HEAD
将新哈希ID写入分支名称。Modern
git commit
是一个大型C程序,基本上仍然执行这四个步骤。这个东西有三个名称:索引、暂存区、缓存。这可能是它的名字(“索引”)过于泛化的一个症状