git临时区域如何存储文件?

Nic*_* S. 8 git

我想了解Git在将文件移动到"暂存"状态时实际存储的内容.

请考虑以下顺序:

添加新文件并将其提交到本地存储库:

touch file.txt
git add file.txt
git commit
Run Code Online (Sandbox Code Playgroud)

我对文件进行了更改:

echo text1 > file.txt
git add file.txt
Run Code Online (Sandbox Code Playgroud)

然后我再次编辑该文件,然后再提交它:

echo text2 > file.txt
Run Code Online (Sandbox Code Playgroud)

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
#
Run Code Online (Sandbox Code Playgroud)

然后我提交文件:

git commit file.txt
Run Code Online (Sandbox Code Playgroud)

git如何能够处理新的第二次更新到file.txt而不被告知?"status"输出看起来好像会尝试检查第一个修订版,但是在不检查它们的情况下保留未分级的更改.

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

red*_*nce 9

将Git视为两件事 - 提交(文件快照)和标签(分支等).

Git实际上是在你git add而不是你的时候创建一个提交git commit.因此,当您git add对更改的文件执行时,它会创建一个包含这些更改的提交,并为该特定提交分配"staging"标签.

当您在执行之前再次更改文件时git commit,它现在具有"暂存提交"(git commit尚未对其执行),以及对既未添加也未提交的文件的新更改.这就是如何git status向你们展示的.

当你git commit,它实际上是将你当前的分支标签移动到那个特定的提交(并删除"staging"标签),所以提交不再被标记为"staging"而是"master"(或者你当前所在的任何分支) .

  • 这不是很正确,或者可以说它是正确的但是以一种特殊的方式使用"提交"这个词.每个文件`git add`-ed用git的术语创建一个新的"blob",而不是新的"commit".`git commit`然后基于"索引"(又称缓存又是暂存区域)写"树",如果一切顺利,则"提交"包含提交消息文本,提交的父项和顶级"树"."树"会让你获得"blob"(加上可以获得更多斑点的子树等). (2认同)