该命令git add [--all|-A]
似乎与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:权威的实用指南
有15分钟,想学习Git?(以互动方式)
http://pcottle.github.io/learnGitBranching/
http://www.wei-wang.com/ExplainGitWithD3/
使用Git 2.0,git add -A
默认git add .
值为:equalsgit add -A .
.
git add
与"git add -A
"现在相同,因此"git add dir/
"将注意到您从目录中删除的路径并记录删除.
在旧版本的Git中,"git add
"用于忽略删除.如果你真的想要,你可以说"
git add --ignore-removal
"只添加添加或修改的路径.
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 -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中的行为将与今天的版本不同.
所以从上面的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
此链接也可能有助于了解可能应用这些命令的情况:从Git工作目录中删除已删除的文件.
迟到了,但这个问题也值得更快速的回答.
git add -A
下面两者(与git add --all相同)
git add .
暂存新的+修改过的文件
git add -u
阶段已修改+已删除的文件
用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 2.x中:
如果您是直接位于工作目录,然后git add -A
和git add .
工作没有区别.
如果您位于工作目录的任何子目录中,git add -A
将添加整个工作目录中的所有文件,git add .
并将添加当前目录中的文件.
就这样.
最后我想我得到了这个,非常感谢大家.我希望这可以增加更多的清晰度.
!The syntax is git add! Aka git add (nil/-u/-A) (nil/./pathspec)
限制器可以是-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'以完全清除索引.
git add .
equals git add -A .
仅将文件添加到当前和子文件夹的索引中.
git add -A
将文件添加到工作树中所有文件夹的索引中.
PS:信息与Git 2.0有关.
两者git add .
和git add -A
都会在较新版本的Git中暂存所有新的,修改的和删除的文件。
区别在于,git add -A
暂存属于您工作的Git存储库的“较高,当前和子目录”中的文件。但是,git add .
仅执行阶段操作会将文件放在当前目录及其后的子目录中(而不是位于外部的文件,即更高目录)。
这是一个例子:
/my-repo .git/ subfolder/ nested-file.txt rootfile.txt
如果您当前的工作目录是/my-repo
,并且您执行rm rootfile.txt
,然后是cd subfolder
,接着是git add .
,那么它将不会暂存已删除的文件。但是,git add -A
无论您从何处执行命令,执行操作都一定会登台此更改。