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

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

概要:

  • git add -A 所有的阶段

  • git add . 阶段新的和修改的, 没有删除

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


详情:

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

关于git add .的重要一点git add . 是它看着工作树,并将所有这些path添加到阶段性更改,如果它们被更改或是新的而不被忽略,它不会执行任何“rm”操作。

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

git add -A是执行这两个操作的简便快捷方式。

你可以用这样的东西来testing差异(注意,对于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

进一步阅读:

所以从上面的查尔斯说明来看,经过testing我的build议理解如下:

 # 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工作目录中删除已删除的文件 。

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

git add <path>现在与“ git add -A <path> ”相同,所以“ git add dir/ ”会注意到你从目录中删除的path并logging下去。
在旧版本的Git中,用于忽略删除的“ git add <path> ”。

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

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


请注意,在讨论git add .时, 首先启动git 2.0(2014年第一季度或第二季度) git add . (工作树中的当前path),您必须使用' . '在其他git add命令以及。

这意味着:

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

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

因为git add -A或者git add -u会在整个工作树上运行(只启动git 2.0),而不仅仅是当前path。

这些命令将在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中的行为将与当前的版本不同。

在晚会之后,这个问题也值得一提。

 git add -A 

这两个下面(相同的git加–all

 git add . 

阶段新+修改的文件

 git add -u 

阶段修改+删除的文件

Git 2.0 改变了一切 :

  • -A现在是默认值
  • 旧的行为现在可以用--ignore-removal
  • git add -ugit add -A在命令行上没有path的子目录中git add -A操作整个树

所以对于混帐2的答案是:

  • git add .git add -A . 在当前目录中添加新的/修改/删除的文件
  • git add --ignore-removal . 在当前目录中添加新的/修改的文件
  • git add -u . 在当前目录中添加修改/删除的文件
  • 没有点,不pipe当前目录,添加项目中的所有文件

最后,我想我得到这个,非常感谢你们。 我希望这可以增加更多的清晰度。

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

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

Pathspec可能是一个文件path或点,'。' 指示当前目录。

有关如何“添加”的重要背景知识。

  • 不可见文件,以点为前缀的(点文件)永远不会被Git自动识别。 他们甚至从未被列为“未被跟踪”。
  • 空文件夹永远不会被git添加。 他们甚至从未被列为“未被跟踪”。 (解决方法是将一个空白文件(可能不可见)添加到跟踪的文件中。
  • Git状态将不会显示子文件夹信息,即未跟踪的文件,除非该子文件夹中至less有一个文件被跟踪。 在这样的时间之前,git认为整个文件夹超出了范围,一个“空”。 它是空的跟踪项目。
  • 指定filespec ='。' (点)或当前目录不是recursion的,除非-A也被指定。 点严格指的是当前的目录 – 它省略了上面和下面的path。

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

限制者如下。

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

pathspec如下所示。

  • 在Git <2.0中,对于两个限制器(update和all),新的缺省值是对整个工作树进行操作,而不是当前path(git <= 1.9)。
  • 但是,在v2.0中,操作可以限制在当前path:只需添加显式点后缀(这在Git <= 1.9中也是有效的);

git add -A .

git add -u .

总之,我的政策是,

  • 1.确保要添加的任何文件/文件在git状态中被占用。
  • 1A。如果任何项目丢失,由于不可见的文件/文件夹,请分别添加它们。
  • 2.有一个好的gitignore,通常只有感兴趣的文件未被跟踪和/或无法识别。
  • 3.从回购的顶层,“git add -A”添加所有项目。 这适用于所有版本的git。
  • 4.如果需要,从索引中删除所需的项目。
  • 6.如果有一个大错误,请执行'git reset'来完全清除索引。

git add . 等于git add -A . 将文件添加到只从当前和子文件夹索引。

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

PS:信息涉及Git 2.0。