git-add[-all|-A]和git-add.之间有什么区别。?
此答案仅适用于Git 1.x版本。有关Git 2.x版本,请参阅其他答案。
摘要:
gitadd-A阶段所有更改git添加。暂存新文件和修改,而不删除(在当前目录及其子目录上)。gitadd-u阶段修改和删除,无需新文件
详细信息:
git-add-A相当于git-add。;git-add-u。
关于gitadd的要点。它查看工作树,并将所有这些路径添加到已阶段的更改中,如果这些更改已更改或是新的且未被忽略,则不会阶段任何“rm”操作。
gitadd-u查看所有已跟踪的文件,如果这些文件不同或已被删除,则对这些文件进行更改。它不添加任何新文件,只对已跟踪的文件进行更改。
gitadd-A是实现这两个目的的便捷快捷方式。
您可以使用以下方式测试差异(注意,对于Git 2.x版本,您的Git-add.Git状态输出将不同):
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
根据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工作目录中删除已删除的文件。
这在2.0中不再适用。添加等于为同一路径添加-A,唯一的区别是树的其他路径中是否有新文件
在Git2.0中,gitadd-A是默认值:gitadd。等于git add-A。。
gitadd<path>现在与“gitadd-A<path>”相同,因此“git-add-dir/”将注意到您从目录中删除的路径记录移除情况。在旧版本的Git中,“gitadd<path>”忽略了删除。您可以对如果确实需要,请在<path>中只添加添加或修改的路径。
gitadd-A类似于gitadd:/(从顶部git repo文件夹添加所有内容)。注意,git2.7(2015年11月)将允许您添加名为“:”的文件夹!参见Junio C Hamano(gitster)的承诺29abb33(2015年10月25日)。
注意,在谈论gitadd时,从git2.0开始(2014年第一季度或第二季度)。(工作树中的当前路径),必须使用“.”在其他gitadd命令中也是如此。
这意味着:
“git-add-A.”等同于“git-add.;git-add-u”
(注意git-add-A和git-add-u的额外“.”)
因为git add-A或git add-u将在整个工作树上运行(仅启动git 2.0),而不仅仅是在当前路径上运行。
这些命令将在Git2.0中的整个树上运行,以与“gitcommit-a”和其他命令保持一致。由于没有机制使“git-add-u”的行为类似于“git-add-u”,所以对于那些习惯于“git add-u”(没有路径规范)只更新当前子目录中路径的索引的人来说,在git 2.0到来之前开始训练他们的手指明确说出“git add-u”是很重要的。当这些命令在没有路径规范的情况下运行时,以及当您在当前目录之外进行本地更改时,会发出警告,因为Git2.0中的行为会有所不同从今天的版本来看,在这种情况下。
一个更精炼的快速答案:
两者都在下面(与git add--all相同)
git add -A
暂存新的+修改的文件
git add .
阶段已修改+已删除文件
git add -u
Git版本1.x
Command | New Files | Modified Files | Deleted Files | Description |
---|---|---|---|---|
git add -A |
✔️ | ✔️ | ✔️ | Stage all (new, modified, deleted) files |
git add . |
✔️ | ✔️ | ❌ | Stage new and modified files only in current folder |
git add -u |
❌ | ✔️ | ✔️ | Stage modified and deleted files only |
Git 2.x版
Command | New Files | Modified Files | Deleted Files | Description |
---|---|---|---|---|
git add -A |
✔️ | ✔️ | ✔️ | Stage all (new, modified, deleted) files |
git add . |
✔️ | ✔️ | ✔️ | Stage all (new, modified, deleted) files in current folder |
git add --ignore-removal . |
✔️ | ✔️ | ❌ | Stage new and modified files only |
git add -u |
❌ | ✔️ | ✔️ | Stage modified and deleted files only |
长格式标志:
gitadd-A相当于gitadd--allgitadd-u等同于gitadd--update
进一步阅读:
初学者Git:权威实用指南学习Git的资源学习Git分支用D3解释Git
Git 2.0改变了一切(2014-05-28):
-A现在是默认值旧的行为现在可以使用--ignore删除。命令行上没有路径的子目录中的gitadd-u和gitadd-A对整个树进行操作。
因此,对于Git 2,答案是:
git添加。和git-add-A。在当前目录中添加新的/修改的/删除的文件gitadd—忽略删除。在当前目录中添加新的/修改的文件git add-u。在当前目录中添加修改/删除的文件如果没有圆点,则添加项目中的所有文件,而不考虑当前目录。
我希望这可以增加一些清晰度。
!The syntax is
git add <limiters> <pathspec>
! Aka
git add (nil/-u/-A) (nil/./pathspec)
限制器可以是-u或-A或nil。
路径规范可以是文件路径或点“”以指示当前目录。
有关Git如何“添加”的重要背景知识:
Git永远不会自动识别不可见的文件(以点为前缀的文件)。它们甚至从未被列为“未追踪”。Git从不添加空文件夹。它们甚至从未被列为“未追踪”。(解决方法是向跟踪的文件中添加一个可能不可见的空白文件。)Git状态不会显示子文件夹信息,即未跟踪的文件,除非跟踪该子文件夹中的至少一个文件。在此之前,Git认为整个文件夹超出了范围,是一个“空的”。它没有跟踪的项目。指定filespec='.'(dot)或当前目录不是递归的,除非同时指定了-A。Dot严格指的是当前目录-它省略了上面和下面的路径。
现在,有了这些知识,我们可以应用上面的答案。
限制器如下。
-u=--update=跟踪文件的子集=>Add=否;更改=是;删除=是。=>如果项目被跟踪。-A=--all(没有这样的-A,这会导致语法错误)=所有未跟踪/跟踪文件的超集,除非在2.0之前的Git中,其中如果给定了点文件规范,则只考虑该特定文件夹。=>如果项目被识别,gitadd-A将找到并添加它。
路径规范如下。
在2.0之前的Git中,对于两个限制器(update和all),新的默认值是对整个工作树进行操作,而不是当前路径(Git1.9或更早版本),然而,在v2.0中,操作可以限制为当前路径:只需添加显式的点后缀(在Git1.9或更早版本中也有效);
git add-A。
git add-u。
总之,我的政策是:
确保所有要添加的块/文件都以git状态进行说明。如果由于文件/文件夹不可见而缺少任何项目,请单独添加它们。拥有一个好的.gitignore文件,这样通常只有感兴趣的文件才能被跟踪和/或识别。从存储库的顶层,“gitadd-A”添加所有项目。这适用于所有版本的Git。如果需要,从索引中删除任何所需项目。如果存在大错误,请执行“gitreset”以完全清除索引。
git添加。等于git add-A。仅将当前文件夹和子文件夹中的文件添加到索引中。
gitadd-A将工作树中所有文件夹的文件添加到索引中。
注:有关Git 2.0的信息(2014-05-28)。
在Git 2.x中:
如果您直接位于工作目录,那么gitadd-A和gitadd。工作没有区别。如果您在工作目录的任何子目录中,gitadd-A将添加整个工作目录中的所有文件,gitadd。将从当前目录中添加文件。
仅此而已。
-A选项添加、修改和删除索引项以匹配工作树。
在Git 2中,-A选项现在是默认选项。
当。根据Git文档,添加了将更新范围限制为当前所在的目录
如果在使用-A选项时未指定<pathspec>,则会更新整个工作树中的所有文件(旧版本的Git用于限制对当前目录及其子目录的更新)。
我要补充的一点是,如果使用--interactive或-p模式,那么gitadd的行为就像使用了update(-u)标志一样,不会添加新文件。
两个git add。gitadd-A将在更新版本的git中暂存所有新的、修改的和删除的文件。
不同之处在于,git add-A将文件存放在属于您工作的git存储库的“更高、当前和子目录”中。但做一个git加法。仅暂存当前目录及其后的子目录中的文件(而不是位于外部的文件,即更高的目录)。
下面是一个示例:
/my-repo
.git/
subfolder/
nested-file.txt
rootfile.txt
如果您当前的工作目录是/my repo,并且您执行rm rootfile.txt,然后是cd子文件夹,然后是git add。,则它将不暂存已删除的文件。但是,无论您从何处执行命令,执行git add-A肯定会进行此更改。
我讨厌git的分段机制,这在其他SCM工具中找不到。所以我总是使用:
\gitadd--all&&\gitcommit--all
(即使使用\git add--all,\git commit也足够了)
用于添加:
--no-ignore-removal --all | add, modify, and remove index entries to match the working tree
--ignore-removal --no-all | add, modify index entries to match the working tree
--intent-to-add | add an entry for the path to the index, with no content
-A是--all的缩写
gitadd<pathspec>等于:
对于Git 2.35.1版本:Git add--all<pathspec>Git:Git-add的旧版本--无所有<pathspec>
但是gitadd后面跟nothing,不等于gitadd--all,并且不会做任何事情:
gitadd--all(省略<pathspec>):处理整个工作树中的所有文件(旧版本的git用于将更新限制到当前目录及其子目录)。
gitcommit--全部
告诉命令自动暂存已修改和删除的文件,。你没有告诉Git的新文件不会受到影响
推荐文章
- Bower: ENOGIT Git未安装或不在PATH中
- Bitbucket上的Git:总是要求密码,即使上传了我的公共SSH密钥
- Git别名-多个命令和参数
- 如何添加一个“打开git-bash这里…”上下文菜单到windows资源管理器?
- 是否可以在Git中只提取一个文件?
- 当我做“git diff”的时候,我怎么能得到一个并排的diff ?
- 在git中如何将提交移动到暂存区?
- 如何缩小。git文件夹
- 如何在本地删除分支?
- 找到包含特定提交的合并提交
- Windows上Git文件的权限
- 如何从一个枝头摘到另一个枝头
- 如何获得在两次Git提交之间更改的所有文件的列表?
- 什么是跟踪分支?
- 如何在不稳定的连接上完成一个大项目的git克隆?