在 Git 中,暂存区也称为索引。似乎是说,当您在工作目录中进行更改并将这些更改添加到“暂存”时,git 会将这些文件添加到索引文件中。打开项目 /.git/index 文件时,我看到一个文件,其中包含在我键入时显示的文本:
git status
Run Code Online (Sandbox Code Playgroud)
我可能会得到如下所示的输出:
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: Gemfile
#
no changes added to commit (use "git add" and/or "git commit -a")
Run Code Online (Sandbox Code Playgroud)
但是在其他地方,例如Git Index Contents,他们通过键入以下内容来表示:
git ls-files --stage
Run Code Online (Sandbox Code Playgroud)
您可以看到索引的内容.. 虽然这显然不是 /.git/index 中的内容。.git 目录中的哪个文件实际上包含此索引?我怀疑,我可能是错的.. .git/index 将更改信息存储在“修改”行中,然后在键入 git ls-files --stage 时,它正在构建文件列表基于工作目录中的文件和在此索引文件中列为已修改的文件进行暂存及其散列。这是正确的吗?
我的Git目录中的大多数文件都是纯文本文件(压缩的松散对象和packfiles除外).这样我就可以猫和编辑文件,如.git/HEAD或.git/refs/heads/master与检查库,如果它被破坏.
但这.git/index是一个二进制文件.纯文本文件不是更有用,因为它可以很容易地手工修改吗?
Scott Chacon在他的演讲中展示了以下图片(幻灯片278):

在我看来,这很容易被放到一个纯文本文件中.
那么为什么它是二进制文件而不是纯文本文件?
我一直认为git index只是一个临时区域,即 当git commit之后什么也没有上演时,index为空,其中head为从head到达的所有先前提交索引的总和。
显然,这种心态是错误的,关于如何git reset --soft <ref>根据doc保存索引。当我从干净的工作目录软重置为较早的提交时,较晚的提交中引入的更改将自动进行,即添加到索引中。更准确地说,它们没有添加到当前提交的索引上,但是整个索引都已传输。
这是否意味着干净提交目录的索引实际上包含前一次提交的更改,以及头部是否包含?提交是否确实提交了head和index之间的差异?工作目录的整洁和差异是否意味着索引的差异,而不是头部的差异?索引作为数据结构到底是什么,它是如何进行git add或git commit更改的?提交后如何演变提交,它与快照和增量的概念有何关系?
在对分支进行一些更改后,master我决定从一个新的分支工作.我做git checkout -b new_branch_name了,创建了一个新的分支并检查出来.git status显示了我所做的改变master.
我很好奇,如果我的更改现在在两个分支(master和new_branch_name)或只是new_branch_name.所以我检查了一下master,注意到我的变化也在那里.所以我用这些改变了git checkout -- fileThatChanged.这些变化确实已经消失了master.
不幸的是,检查new_branch_name和运行git status显示我的更改也从该分支还原.
我想了解发生了什么,以后如何避免这种情况.
一种解决方案是在开始工作之前创建/签出新分支.