在对文件进行更改之前还是之后,我应该什么时候使用git add命令?

3
花费几个小时谷歌搜索,发现每篇文章的作者在对文件进行更改前后都使用“git add”,让我有点困惑。

1
你可以选择任何一种方式。git add 只是将文件添加到 git 的跟踪列表中。 - PiRocks
具体的例子会有所帮助。没有上下文,很难准确地说出作者为什么这样做。 - Caleb
4个回答

4
通常应在git commit之前使用它。
你可以在不同的时间使用它,但需要知道它的作用: - Git存储的是提交(commits),而不是文件。 (但提交本身存储着文件,所以没关系。) - 提交中的所有内容均为只读,冻结在某一时间点。这些都将永远存在,或者至少会和提交本身一样长时间存在。但其中的任何内容都无法更改。提交中的文件处于一种特殊的Git-only格式:只有 Git 可以实际使用这些文件。 - 这意味着你无法使用已提交的文件。你必须复制一份进行操作。 Git 会将已提交的文件提取到工作区。这就是你的工作树 (working tree) 或者说工作区 (work-tree)。你可以看到和编辑的所有文件都是这些工作区的副本。它们不在仓库里!它们只是在你的工作区,供你随心所欲地处理。 - 如果你在工作区创建新文件或删除现有文件,则不会影响 Git 的副本。 - Git 保留每个文件的第三个不可见副本。 (从技术上讲,这并不是一个真正的副本——它要复杂得多——但是把它看作一个副本可行。) 第三个副本以 Git 在提交中使用的特殊格式存在,但与提交中文件的副本不同,你可以替换第三份副本。 - 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中的索引内容没有被提交,而工作树中的内容甚至不在仓库中,因此两者都没有安全地冻结在所有时间上。
要确保某个东西真正被安全地保存,请做一次提交!你可以在临时分支上进行临时提交,并对它们进行调整,最终抛弃临时提交。(它们被冻结了,有点难以完全清除,但通常比没有制作需要的提交更好。)

3

git add 命令添加当前文件中指定的内容。在执行git add命令后,你对该文件所做的任何更改都将保存在工作区中,但是当你提交时,实际提交的内容将是你添加的内容。


3

git add 做两件事情: 将未跟踪的文件暂存起来,同时将已跟踪的文件的改动也暂存起来。如果对一个没有修改的已跟踪文件使用 git add 不会产生任何效果。


0

Git提交的是你的索引,而不是当前的工作目录。 如果你更改了多个文件并且只想提交其中一个文件,你可以使用git add命令添加该文件到索引中,然后再进行提交,只有被“添加”到索引中的文件才会被提交。

了解什么是工作目录、索引、存储区、仓库和远程仓库。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接