Git Add 是否仅将未跟踪的文件或修改的文件添加到暂存区域



我是 Git 的新手,假设我一次创建了 10 个文件,然后将这 10 个文件添加到舞台区域,然后提交它们。

然后我创建了另一个文件(第 11 个文件),因为这个文件名很长,我不想像 git 命令那样键入 git 命令

git add lllllllllllllongname.txt

相反,我输入了:

git add .

git 是否还会在内部将首次创建的这 10 个文件重新添加到暂存区域? 因为我检查了 Git 文档,它没有说add命令只会将未跟踪的文件或修改的文件添加到暂存区域?

这里重要的是暂存区域已经包含您的所有文件

如果您的存储库不是太大,请尝试运行:

git ls-files --stage

如果您的存储库有很多文件,这将产生大量的输出。 这仍然只是一个看起来的情况,所以没关系,但你可能希望通过寻呼机管道输出——git ls-files不是日常使用的 Git 命令,所以它不会像git loggit diff那样自我分页。

即使在新的结帐时,您也会看到git status说:

On branch master
Your branch is up to date with 'origin/master'.
nothing to commit, working tree clean

您的暂存区域包含大量文件! 重要的是,现在暂存区域中的内容与其他两个区域中的内容相同。

请记住,Git 有时每个跟踪文件都有三个副本。 假设您的跟踪文件之一名为README.md。 它在你的工作树中,在那里你可以看到它并处理它。 但是它有三个副本!

  • HEAD:README.md,这是当前提交中冻结的已提交文件。 使用git show HEAD:README.md查看它。

  • 然后是您的暂存区域中的README.md。 使用git show :README.md查看它。 该文件的副本采用冻结格式,就像当前提交中的格式一样,但与当前提交中的副本不同,您可以通过将其批量替换为工作树中的副本来更改它。

  • 最后,还有README.md,您可以查看和使用。 您不需要任何特殊命令来显示它,因为它只是一个普通文件。

当你运行git commit时,Git 会获取文件暂存区副本中的任何内容,并将其冻结到你所做的提交中。 因此,如果您更改了README.md的工作副本,但尚未接触暂存副本,则下一个git commit将使用旧的、未更改的暂存副本。 如果希望它使用新的,请运行git add从工作树复制到暂存区域。这会将更新的README.md压缩为冻结格式,准备提交。 它实际上还没有提交,它只是准备好了。

如果重新添加未更改的文件,Git 将看到更新的冻结格式文件仍与原始冻结格式文件相同,已在HEAD提交中,并且已在暂存区域中。 是否将未更新的文件复制到暂存区域中未更新、仍然相同、仍准备就绪的文件中并不重要。

实际上,暂存区域是您建议的下一个提交。 它开始匹配您当前的提交。 如果您重新添加文件,那是无害的:要么它们没有变化,所以它们仍然匹配您当前的提交,要么它们被更改了,但您希望它们在建议的下一次提交中被更改。

您唯一不想git add某个特定文件的情况是在工作树中更改该文件时,但您希望:

  • 使其暂存区域中保持不变,或
  • 将其完全保留或取出,以便下次提交时不会缺少它。

如果文件README.md当前提交中,并且您将其从暂存区域中取出,这样它就不会在下一次提交中,那么无论如何,在 Git 看来,您只需删除README.md。 您是否删除了工作树中的README.md并不重要。 工作树不是给Git的,而是给你的。 在工作树中,您可以查看和处理文件。 Git 使用暂存区域副本进行下一次提交,并使用已提交的副本(每次提交中都有一个副本)用于提交的副本。

使用git add .时,git将有更改的文件添加到暂存区域。

如果在初始暂存之后编辑或添加了新文件,则在下一阶段将添加这些更改。 提交在这方面没有区别,但它使取消暂存更加困难。

If you create 10 files first (1.txt,2.txt...…,10.txt) then commit all as below

git add .
git commit "commit message"
git status

如果您执行git status那么它对您来说是可见的,没有什么可提交的。

然后,当您创建下一个文件(即 11.txt)时,现在如果您执行git status那么您将只看到您最近创建的一个文件,因此再次按照上面的 3 命令进行操作,然后您意识到只为提交添加一个文件,即 11.txt

git add . 
git status
git commit "commit message"
git status

pathspecgit add文档描述了 git 在添加目录时的行为。

git add[options…] [<pathspec>…]

<路径规范>...

。也是一个前导目录名称(例如 可以给出添加dir/file1dir/file2dir来更新索引以匹配整个目录的当前状态(例如,指定dir不仅会记录在工作树中修改dir/file1的文件,dir/file2添加到工作树中的文件,还可以记录dir/file3从工作树中删除的文件)。请注意,旧版本的 Git 曾经忽略已删除的文件;如果要添加修改的文件或新文件,但忽略已删除的文件,请使用--no-all[或--ignore-removal] 选项。

在您的情况下,假设是最新版本的 git,git add .将在当前目录子树中暂存更改,这些更改是

  • 新文件
  • 修改的文件
  • 已删除的文件

对于已暂存的更改,这些文件不会显示为已修改,因为工作树中的内容将与索引或暂存区域中的内容相同。


默认情况下,对暂存已删除文件的更改随版本 2.0.0 一起提供。

git add <path>和现在的git add -A <path>一样,所以git add dir/会注意到您从目录中删除的路径,并且 记录删除。 在旧版本的 Git 中,git add <path>使用 以忽略移除操作。 你可以说git add --ignore-removal <path>如果您确实需要,请仅在PATH中添加或修改的路径。

最新更新