git暂存区如何存储文件?

git暂存区如何存储文件?

问题描述:

我想了解当将文件移动到“暂存”状态时,Git实际存储的内容。git暂存区如何存储文件?

考虑以下顺序:

一个新文件添加和提交到本地仓库:

touch file.txt 
git add file.txt 
git commit 

我更改了文件:

echo text1 > file.txt 
git add file.txt 

然后我在提交之前再次编辑该文件:

echo text2 > file.txt 

一个Git状态显示:

# On branch master 
# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
#  modified: file.txt 
# 
# Changed but not updated: 
# (use "git add <file>..." to update what will be committed) 
# (use "git checkout -- <file>..." to discard changes in working directory) 
# 
#  modified: file.txt 
# 

我然后提交文件:

git commit file.txt 

如何是混帐能够处理分期新的,第二次更新file.txt的而不告诉? “状态”输出看起来好像它会尝试检查第一个修订版本,但是在不检查它们的情况下保留未执行的更改。

在这种情况下是否存在隐式阶段?

认为Git是两件事 - 提交(文件快照)和标签(分支等)。

Git实际上创建一个提交时,当你git add,而不是当你git commit。因此,当您在更改的文件上执行git add时,它会使用这些更改创建一个提交,并将“分段”标签分配给该特定提交。

当你执行git commit之前再次更改的文件,它现在已经在“上演承诺”(即一直没有git commit它尚未执行),并已加入既不也不文件提交的新变化。这就是git status能够向你展示两者的方式。

当你git commit,它实际上是移动你当前的分支标签到该特定的提交(并删除“分段”标签),所以提交不再标记为“分级”,但“主”(或任何分支你目前在)。

+0

我在运行上述测试时观察到的行为是,它将文件的非分离内容(“text2”)提交到回购库中。这个解释是否正确?我认为它会提交文件的“stage”版本(“text1”)。我通过做一个“git checkout file.txt”来确认这是什么。 – 2012-04-26 07:23:52

+1

我刚做了一个测试,但没有得到你的结果。 'git test''cd gittest''git init''echo text 1> test.txt''git add。''git commit -m'初始提交''echo text 2> test.txt''git add .' 'echo text 3> test.txt'此时,存在分阶段更改(“文本2”)和未分离更改(“文本3”)。现在,'git checkout test.txt'和'cat test.txt'。我得到“文本2”。随着阶段性变化,本地更改被废弃。 – redhotvengeance 2012-04-26 07:39:36

+0

我得到与您的测试序列相同的结果。但是,如果我在'echo text 3> test.txt'步骤之后执行'git commit'(类似于我在原始文章中的步骤),那么当我观察git隐式地分级“text 3”内容并将其提交给回购。为了清楚起见,我在这里做的序列是:'mkdir gittest''cd gittest''git init'' echo text 1> test.txt''git add。''git commit -m'初始提交'' echo文本2 > test.txt''git add .'' echo text 3> test.txt''git commit -m'new'' git checkout test.txt''cat test.txt',result a output of“text 3 ”。 – 2012-04-26 07:52:30

git commit <somefiles>相当于git add <somefiles>其次是git commit。如果你只是做git commit,git会提交所有的分阶段更改,但不会提交自上次上演有问题文件以来所做的修改。