花费几个小时谷歌搜索,发现每篇文章的作者在对文件进行更改前后都使用“git add”,让我有点困惑。
git commit
之前使用它。git add
的作用是操作这个第三份副本。将它看作处于当前提交(冻结状态,无法更改)和工作树版本(正常文件,你可以看到和编辑它)之间。这个额外的位于中间位置的副本在 Git 中称为索引 (index) 或者暂存区 (staging area)。 (这两个名称指的是同一件事情。)
- git add
命令会获取工作区的副本,然后让暂存区的副本与之匹配。实际上,它是将工作区的副本拷贝到暂存区的副本上。Git 将此称为为提交分阶段准备文件。该文件已经存在,原本就已经在暂存区/索引中了。只是之前版本更新而已。
- 当你git add
一个全新的文件时,新文件会被压缩成特殊的冻结格式,并放入暂存区。还没有提交副本,但现在你有两个副本(如果有提交副本,则有三个副本)。git commit
之前,这个被暂存的副本只是停留在Git的索引/暂存区中。当你运行git commit
时,Git会将暂存区中的每个文件,以它们在那里的当前形式打包成一个新的提交。由于它们已经是冻结的格式,所以这特别快速和容易。git add
,你已经用工作树中的内容替换了暂存区中的暂存副本。如果你再次编辑了工作树中的文件,现在你就有了三个不同的副本:git add
的不同的副本; 和
- 现在你修改后的工作树中的副本。git commit
而没有使用git add
,提交的副本将匹配暂存/索引副本。那通常不是你想要的--虽然有时候也是你想要的;有时候你可以利用有三个版本这个事实来达到很好的效果。git checkout
会写入索引和你的工作树。git checkout
以查看或处理/使用某个新提交时,都必须填写你的工作树,以便你可以查看和操作文件。但为了准备下一个提交,它还必须覆盖每个文件的索引副本。Git中的索引内容没有被提交,而工作树中的内容甚至不在仓库中,因此两者都没有安全地冻结在所有时间上。git add
命令添加当前文件中指定的内容。在执行git add
命令后,你对该文件所做的任何更改都将保存在工作区中,但是当你提交时,实际提交的内容将是你添加的内容。
git add
做两件事情: 将未跟踪的文件暂存起来,同时将已跟踪的文件的改动也暂存起来。如果对一个没有修改的已跟踪文件使用 git add
不会产生任何效果。
Git提交的是你的索引,而不是当前的工作目录。 如果你更改了多个文件并且只想提交其中一个文件,你可以使用git add命令添加该文件到索引中,然后再进行提交,只有被“添加”到索引中的文件才会被提交。
了解什么是工作目录、索引、存储区、仓库和远程仓库。
git add
只是将文件添加到 git 的跟踪列表中。 - PiRocks