协慌网

登录 贡献 社区

“git add -A”和 “git add” 之间的区别。

命令git add [--all|-A]似乎与git add .相同git add . 。它是否正确?如果没有,它们有何不同?

答案

这个答案仅适用于Git 版本 1.x.对于 Git 版本 2.x,请参阅其他答案。


概要:

  • git add -A分阶段进行所有更改

  • git add .分阶段新文件和修改, 没有删除

  • git add -u阶段修改和删除, 没有新文件


详情:

git add -A相当于git add .; git add -u

关于git add .是它查看工作树并将所有这些路径添加到分阶段的更改,如果它们被更改或是新的而不是被忽略,它不会进行任何 “rm” 操作。

git add -u查看所有已经跟踪的文件,并将这些文件的更改分级,如果它们不同或已被删除。它不会添加任何新文件,只会对已经跟踪的文件进行更改。

git add -A是一个方便的快捷方式,可以同时执行这两个操作。

你可以用这样的东西来测试差异(请注意,对于 Git 版本 2.x 你的git add .输出git status 有所不同):

git init
echo Change me > change-me
echo Delete me > delete-me
git add change-me delete-me
git commit -m initial

echo OK >> change-me
rm delete-me
echo Add me > add-me

git status
# Changed but not updated:
#   modified:   change-me
#   deleted:    delete-me
# Untracked files:
#   add-me

git add .
git status

# Changes to be committed:
#   new file:   add-me
#   modified:   change-me
# Changed but not updated:
#   deleted:    delete-me

git reset

git add -u
git status

# Changes to be committed:
#   modified:   change-me
#   deleted:    delete-me
# Untracked files:
#   add-me

git reset

git add -A
git status

# Changes to be committed:
#   new file:   add-me
#   modified:   change-me
#   deleted:    delete-me

这是快速了解的表格:

Git 版本 1.x在此处输入图像描述

Git 版本 2.x在此处输入图像描述

长形标志:

  • git add -A相当于git add --all
  • git add -u相当于git add --update

进一步阅读:

使用Git 2.0, git add -A是默认值: git add .等于git add -A .

git add <path>现在与 “ git add -A <path> ” 相同,因此 “ git add dir/ ” 会注意到您从目录中删除的路径并记录删除。
在旧版本的 Git 中,“ git add <path> ” 用于忽略删除。

如果你真的想要,你可以说 “ git add --ignore-removal <path> ” 只在<path>添加添加或修改的路径。

git add就像git add :/从顶级 git repo 文件夹中添加所有内容 )。
请注意,git 2.7(2015 年 11 月)将允许您添加名为 “ : ” 的文件夹!
Junio C gitstergitster )的 承诺 29abb33 (2015 年 10 月 25 日


请注意,在谈论git add .时, 启动 git 2.0(2014 年第 1 季度或第 2 季度) git add . (工作树中的当前路径),你必须使用 ' . ' 在其他git add命令中也是如此。

这意味着:

git add -A . ” 相当于 “ git add .; git add -u .

(注意git add -Agit add -u的额外 ' . ')

因为git add -Agit add -u将在整个工作树上运行(仅启动 git 2.0),而不仅仅是在当前路径上运行。

这些命令将在 Git 2.0 中的整个树上运行,以与 “ git commit -a ” 和其他命令保持一致 。因为没有机制让 “ git add -u ” 表现得好像 “ git add -u . ”,对于那些习惯于 “ git add -u ”(没有 pathspec)更新索引的人来说非常重要在当前子目录中开始训练他们的手指明确地说 “ git add -u . ”,当他们在 Git 2.0 出现之前表示它。

在没有 pathspec 的情况下运行这些命令时以及当前目录之外的本地更改时会发出警告 ,因为在这种情况下 Git 2.0 中的行为将与今天的版本不同。