"git add -A"和"git add"之间的区别.

cmc*_*nty 2788 git git-add

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

CB *_*ley 4087

这个答案只适用于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
Run Code Online (Sandbox Code Playgroud)

  • `git add*`之间的区别怎么样? (40认同)
  • @CharlesBailey,Git真的很喜欢*让事情变得复杂无缘无故.是否有一个**真正的**用例,有人特别需要`git add -u`或`git add .`,这样做,即使考虑到额外的精神税,确保那里',这使他的生活更轻松没有同步问题?我想知道为什么Git不会将`add -u`分成两个单独的命令`add -u1`和`add-u2`,其中一个用于以数字开头的文件,另一个用于以非数字开头的文件 (14认同)
  • 有关信息,在较新版本的git`git add -u`已成为`git add -u:/`,后者参数为路径,允许您使用-u某些目录,`:/`处理整个树. (5认同)
  • 太糟糕了`git add -A -p`无法正常工作(交互式询问未跟踪的文件) (2认同)
  • 请更新答案.它应该是:`git add -A:/`或`git add -A .` (2认同)
  • 什么是git add*?没有描述. (2认同)
  • @Pacerier 嗯,我修改了一大堆文件,不想把它们全部输入出来,但我也有一大堆我想保留但不想出现在仓库中的文件。我可以将这些文件名添加到 gitignore,但这也是工作,就我而言,这不是我想要做的。所以是的,我很高兴有“add -u”。 (2认同)

Dev*_*per 867

这是快速了解的表格:

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

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

长形标志:

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

进一步阅读:

  • 这并不完全正确,因为`git add .`只会添加当前路径上的新文件.即如果你有一个新的目录`../ foo`,`git add -A`将使它上演,`git add .`则不会. (78认同)
  • @Gokul:根据[这篇文章](http://stackoverflow.com/a/14368373/134536),您可以使用`git diff-files -z --diff-filter = M --name-only | xargs -0 git add`仅添加修改后的文件,但不添加新文件或删除. (3认同)
  • 谢谢你的桌子。有没有办法只添加被修改的文件。没有新文件或删除的文件 (2认同)
  • 因此,git add。等效于git add -A。等效于git add“ *” (2认同)
  • 这应该是顶部/选定/固定的答案。@cmcginty 如果 12 年后你还在那里 (2认同)

Von*_*onC 165

使用Git 2.0,git add -A默认git add .值为:equalsgit 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 Hamano()提交29abb33(2015年10月25日). gitster


请注意,在谈论(工作树中的当前路径)时,启动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中的行为将与今天的版本不同.

  • @NickVolynkin那真棒!很高兴看到SO的国际社会按预期工作.供参考:http://ru.stackoverflow.com/a/431840 (3认同)

小智 133

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

# For the next commit
$ git add .   # Add only files created/modified to the index and not those deleted
$ git add -u  # Add only files deleted/modified to the index and not those created
$ git add -A  # Do both operations at once, add to all files to the index
Run Code Online (Sandbox Code Playgroud)

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

  • 这在2.0中已不再适用.加.等于为同一路径添加-A,唯一的区别是树中其他路径中是否有新文件 (6认同)

K. *_*erg 34

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

git add -A
Run Code Online (Sandbox Code Playgroud)

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

git add .
Run Code Online (Sandbox Code Playgroud)

暂存新的+修改过的文件

git add -u
Run Code Online (Sandbox Code Playgroud)

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

  • 您好,如果您只想暂存仅修改过的文件怎么办?你会怎么做? (5认同)
  • 你好,问题好.据我所知,没有一个简单的标志.. git diff-files -z --diff-filter = M --name-only | xargs -0 git add from - > http://stackoverflow.com/questions/14368093/simpler-way-to-stage-only-modified-files-in-git-not-deleted (2认同)
  • 实际上它是`git add:/`+`git add -u:/` (2认同)

0xF*_*0xF 29

用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 . 在当前目录中添加已修改/已删除的文件
  • 如果没有点,则无论当前目录如何,都要添加项目中的所有文件

  • 我不认为这是正确的.使用git v2.10.windows.2'git add'返回'没有指定任何内容,没有添加'.'git add -A'添加所有已更改的文件.这表明'-A'不是默认值. (3认同)

sim*_*eco 25

Git 2.x中:

  • 如果您是直接位于工作目录,然后git add -Agit add .工作没有区别.

  • 如果您位于工作目录的任何子目录中,git add -A将添加整个工作目录中的所有文件,git add .并将添加当前目录中的文件.

就这样.


Ann*_*ile 11

最后我想我得到了这个,非常感谢大家.我希望这可以增加更多的清晰度.

!The syntax is
git add <limiters> <pathspec>
! Aka
git add (nil/-u/-A) (nil/./pathspec)
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

限制器如下.

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

pathspec如下.

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

-A

-u

总之,我的政策是;

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


Ale*_*191 9

git add .equals git add -A .仅将文件添加到当前和子文件夹的索引中.

git add -A 将文件添加到工作树中所有文件夹的索引中.

PS:信息与Git 2.0有关.


Yeh*_*rtz 5

-A选项添加、修改和删除索引条目以匹配工作树。

在 Git 2 中,该-A选项现在是默认选项。

当添加 a时,根据Git 文档.,将更新范围限制为您当前所在的目录

如果<pathspec>使用 -A 选项时没有给出,则更新整个工作树中的所有文件(旧版本的 Git 用于限制更新到当前目录及其子目录)。

我要补充的一件事是,如果使用--interactiveor模式,则其行为就像使用 update ( ) 标志一样,而不添加新文件。-pgit add-u


Sab*_*med 5

两者git add .git add -A都会在较新版本的Git中暂存所有新的,修改的和删除的文件。

区别在于,git add -A暂存属于您工作的Git存储库的“较高,当前和子目录”中的文件。但是,git add .仅执行阶段操作会将文件放在当前目录及其后的子目录中(而不是位于外部的文件,即更高目录)。

这是一个例子:

/my-repo
  .git/
  subfolder/
    nested-file.txt
  rootfile.txt
Run Code Online (Sandbox Code Playgroud)

如果您当前的工作目录是/my-repo,并且您执行rm rootfile.txt,然后是cd subfolder,接着是git add .,那么它将不会暂存已删除的文件。但是,git add -A无论您从何处执行命令,执行操作都一定会登台此更改。