“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
进一步阅读:
- Git初学者:明确的实践指南
- 有15分钟,想学习Git? (以交互方式)
- http://pcottle.github.io/learnGitBranching/
- http://www.wei-wang.com/ExplainGitWithD3/
所以从上面的查尔斯说明来看,经过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 gitster
( gitster
)的 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 -A
和git 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 -u
和git 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。