我已经读过Git object model并阅读了other articles有关git的信息,但对Git staging area
不清楚。
暂存区实际做什么?
当我们执行git add
时,它是否创建blob对象和树对象?当我们执行git commit
时,提交对象链接到父提交和已经链接到它的blob /的对应树对象树对象?
或
它是否只是将信息存储在索引文件中(发生了一些变化,当我们执行git添加时,它说可以提交了),并且当我们执行git commit
时,所有对象的创建和链接都在提交,树,斑点对象?
答案 0 :(得分:2)
“暂存区”是使用该索引的最常见和最受欢迎的便捷术语。您的第一个选择
当我们执行git add并执行git commit时,它是否创建blob对象和树对象?提交对象链接到父提交和已经链接到其blob / tree对象的相应树对象吗?
几乎完全正确:git add
将您添加的内容放入存储库中,并且git commit
将提交对象与父提交和相应的树对象绑定---但该相应的树对象不是尚未进入存储库,git commit
通过查询索引来构建树(将路径名与内容相关联),这正是它所说的:索引,将路径名与内容相关联。
因此,git checkout
更新索引以指向它在每个签出路径中签出的内容,而git add
更新索引以指向它为每个添加的路径添加的内容。 / p>
因此,您可以使用作为“临时区域”,git commit
只关心您添加的内容,而不关心工作树中的内容。这就是git checkout
,git reset
,git commit
和git add
都具有--patch
选项的原因:您已签出的内容,已添加的内容以及其中的内容您的工作树。在任何时候,查看其中的任何差异或“收回”所做更改的一部分可能都是有用的,可能是因为它们属于另一个提交或仅需要进一步的工作。
答案 1 :(得分:1)
暂存区是一个文件,通常包含在您的Git目录中,用于存储有关下一次提交的内容的信息。用Git的话来说,它的技术名称是index
,但是短语staging area
也可以使用。
对于stage
,文件只是为准备提交做好准备。 Git及其索引允许您仅提交自上次提交以来所做更改的某些部分。假设您正在使用两个功能-一个已经完成,一个仍然需要完成一些工作。您想提交并返回主页,但不希望提交第二项功能的各个部分,但尚未完成。您上演您知道属于第一个特征的零件并提交。现在,您的提交就是您的项目,其中第一个功能已完成,而第二个功能仍在工作目录中正在进行的工作中。
git add
将修改后的文件添加到队列中,以便稍后提交。文件未提交
git commit
提交已添加的文件并创建带有日志的新修订...如果不添加任何文件,则git将不提交任何内容。您可以将两个动作与git commit -a
git push
将您的更改推送到远程存储库。
您执行一次提交,该提交将按阶段区域中的文件原样获取文件并将该快照永久存储到您的Git目录中。阅读更多信息:https://git-scm.com/book/en/v2/Getting-Started-Git-Basics