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


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


2398
2018-02-21 06:51


起源




答案:


对于 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

3658
2018-02-21 09:00



两者之间的区别如何 git add *? - Jared
@Jared,添加了星号解释来回答你的问题 - Geo
为简单起见,请删除此答案中摘要部分上方的任何内容。如果没有,请将摘要移至顶部。 - maliayas
有关信息,请在较新版本的git中使用 git add -u 已经成为 git add -u :/ 后一个参数是一个路径,允许你-u某些目录, :/ 处理整棵树。 - Brizee
@CharlesBailey,Git真的 爱 让事情变得复杂无缘无故。有没有 真实 用户特别需要的用例 git add -u 要么 git add . 通过这样做,即使考虑到额外的精神税,以确保没有同步问题,这使他的生活更轻松?我想知道为什么Git不会分裂 add -u 分成两个单独的命令 add -u1 和 add-u2 其中一个适用于以数字开头的文件,另一个适用于以非数字开头的文件 - Pacerier


这是快速了解的表格:

Git版本1.x.enter image description here

Git版本2.x.enter image description here

长形标志:

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

进一步阅读:


648
2017-09-25 12:45



谢谢你的表。有没有办法只添加修改过的文件。没有新文件或已删除的文件 - Gokul N K
@Gokul:根据 这个帖子, 您可以使用 git diff-files -z --diff-filter=M --name-only | xargs -0 git add 仅添加已修改的文件,但不添加新文件或删除。 - Ville
这并不完全正确 git add . 仅添加当前路径上的新文件。即如果你有一个新目录 ../foo, git add -A 将上演, git add . 将不会。 - 0sh
所以, git add . 相当于 git add -A .,相当于 git add "*" - flow2k


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月)将允许您添加名为“:“!
看到 提交29abb33 (2015年10月25日)by Junio C Hamano(gitster


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

这意味着:

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

(注意额外'.'为 git add -A 和 git add -u

因为 git add -A 要么 git 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中的行为会有所不同   在这种情况下从今天的版本。


136
2018-04-23 06:32



感谢您的详细信息 .。将它们包含在我的编辑中 add 在RU.SO. - Nick Volynkin
@NickVolynkin那真棒!很高兴看到SO的国际社会按预期工作。以供参考: ru.stackoverflow.com/a/431840 - VonC
@VonC,很好,Git的人真的有脸,说他们的更新将“让事情变得更加一致”。他们所做的事情造成了更多的困惑和不一致。这里有26个字母和它们 有 重用已经使用过的标志。 - Pacerier


所以从上面的Charles说明中,经过测试,我提出的理解如下:

# For the next commit
$ git add .   # add to index only files created/modified and not those deleted
$ git add -u  # add to index only files deleted/modified and not those created
$ git add -A  # do both operation at once, add to index all files

此链接也可能有助于了解可以应用这些命令的情况: 从Git工作目录中删除已删除的文件


126
2018-06-01 09:27



这在2.0中已不再适用。加。等于为同一路径添加-A,唯一的区别是树中其他路径中是否有新文件 - Claudiu Creanga


迟到了,但这个问题也值得更快速的回答。

git add -A 

两者都在下面(与...相同) git add --all

git add . 

暂存新的+修改过的文件

git add -u 

阶段已修改+已删除的文件


27
2018-04-06 12:56



您好,如果您只想暂存仅修改过的文件怎么办?你会怎么做? - TheGrapeBeyond
你好,问题好。据我所知,没有一个简单的标志.. git diff-files -z --diff-filter = M --name-only | xargs -0 git add from - > stackoverflow.com/questions/14368093/... - K. Kilian Lindberg
实际上是 git add :/ + git add -u :/ - Nick Volynkin


事情变了 使用Git 2.0:

  • -A 现在是默认值
  • 旧的行为现在可用 --ignore-removal
  • git add -u 和 git add -A 在命令行上没有路径的子目录中,对整个树进行操作

所以对于git 2,答案是:

  • git add . 和 git add -A . 在当前目录中添加新/已修改/已删除的文件
  • git add --ignore-removal . 在当前目录中添加新/修改的文件
  • git add -u . 在当前目录中添加已修改/已删除的文件
  • 如果没有点,则无论当前目录如何,都要添加项目中的所有文件

23
2017-10-13 15:29



我不认为这是正确的。使用git v2.10.windows.2'git add'返回'没有指定,没有添加'。 'git add -A'添加了所有已更改的文件。这表明'-A'不是默认值。 - Neutrino


最后我想我得到了这个,非常感谢大家。我希望这可以增加一些清晰度。

!The syntax is
git add <limiters> <pathspec>
! Aka
git add (nil/-u/-A) (nil/./pathspec)

限制器可以是-u或-A或nil。

Pathspec可以是文件路径或点,'。'指示当前目录。

关于git'如何添加'的重要背景知识。

  • Git不会自动识别不可见文件,前缀为点(dotfiles)的文件。它们甚至从未被列为“未跟踪”。
  • git永远不会添加空文件夹。它们甚至从未被列为“未跟踪”。 (解决方法是向跟踪的文件添加一个可能不可见的空白文件。)
  • Git状态不会显示子文件夹信息,即未跟踪文件,除非跟踪该子文件夹中的至少一个文件。在此之前,git认为整个文件夹超出了范围,一个'空'。它没有跟踪的项目。
  • 指定filespec ='。' (点)或当前目录不是递归的,除非还指定了-A。 Dot严格指当前目录 - 它省略了上面和下面找到的路径。

现在,鉴于这些知识,我们可以应用上面的答案。

限制器如下。

  • -u = --update =跟踪文件的子集=>添加=否;改变=是;删除=是。 => iff跟踪项目。
  • -A = --all(没有这样的-a,这给出了语法错误)=所有未跟踪/跟踪文件的超集,除非在Git <2.0中,其中如果给出了dot filespec,则只考虑该特定文件夹。 =>如果项目被识别,git add -A将找到并添加它。

pathspec如下。

  • 在Git <2.0中,对于两个限制器(更新和全部),新的默认值是在整个工作树上运行,而不是当前路径(git <= 1.9),
  • 但是,在v2.0中,操作可以限制为当前路径:只需添加显式点后缀(在Git中也有效<= 1.9);

git add -A .

git add -u .

总之,我的政策是;

  • 1.确保要添加的任何数据库/文件都以git状态进行计算。
  • 1A。如果由于不可见的文件/文件夹而丢失任何项目,请单独添加。
  • 2.有一个好的gitignore,所以通常只有感兴趣的文件没有跟踪和/或无法识别。
  • 3.从repo的顶层,“git add -A”添加所有项目。这适用于所有版本的git。
  • 4.如果需要,从索引中删除任何所需的项目。
  • 6.如果有一个大错误,请执行'git reset'以完全清除索引。

11
2018-04-06 02:03