首页 文章

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

提问于
浏览
2480

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

10 回答

  • 698

    此答案仅适用于 Git version 1.x . 对于Git版本2.x,请参阅其他答案 .


    Summary:

    • git add -A 阶段 all changes

    • git add . 分阶段新文件和修改, without deletions

    • git add -u 阶段修改和删除, without new files


    Detail:

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

    关于 git add . 的重要一点是它查看工作树并将所有这些路径添加到分阶段更改中(如果它们已更改或是新的且未被忽略),它不会进行任何'rm'操作 .

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

    git add -A 是执行这两者的便捷捷径 .

    您可以使用类似的方法测试差异(请注意,对于Git版本2.x, git add . git status will 的输出不同):

    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
    
  • 143

    这是快速了解的表格:

    Git Version 1.x
    enter image description here

    Git Version 2.x
    enter image description here

    长形标志:

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

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

    Further reading:

  • 31

    随着Git 2.0, git add -A is default: git add . equals git 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 :/add everything from top git repo folder) .
    请注意,git 2.7(2015年11月)将允许您添加名为“ : ”的文件夹!
    Junio C Hamano (gitster)(2015年10月25日)Junio C Hamano (gitster) .


    注意starting git 2.0 (Q1 or Q2 2014),在谈到 git add . (工作树中的当前路径)时,您必须在其他 git add 命令中使用' . ' .

    这意味着:

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

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

    因为 git add -Agit add -u 将在 entire working tree 上运行(仅启动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中的行为将与今天的版本不同 .

  • 24

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

    # 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
    

    此链接也可能有助于了解可以应用这些命令的情况:Removing Deleted Files from your Git Working Directory .

  • 128

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

    git add -A
    

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

    git add .
    

    暂存新修改的文件

    git add -u
    

    阶段修改了已删除的文件

  • 14

    Things changed与Git 2.0:

    • -A 现在是默认值

    • 旧行为现在可用 --ignore-removal

    • git add -ugit add -A 在命令行上没有路径的子目录中对整个树进行操作

    所以对于git 2,答案是:

    • git add .git add -A . 在当前目录中添加新/已修改/已删除的文件

    • git add --ignore-removal . 在当前目录中添加新/已修改的文件

    • git add -u . 在当前目录中添加了已修改/已删除的文件
      没有点的

    • ,无论当前目录如何,都要添加项目中的所有文件

  • 8

    在Git 2.x中:

    • 如果您直接位于工作目录,那么 git add -Agit add . 无差别地工作 .

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

    就这样 .

  • 1

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

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

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

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

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

    • 不可见的文件,以点为前缀的文件(dotfiles)永远不会被Git自动识别 . 它们甚至从未被列为'untracked' .

    • git永远不会添加空文件夹 . 它们甚至从未被列为'untracked' . (解决方法是在跟踪的文件中添加一个可能不可见的空白文件 . )

    • Git状态不会显示子文件夹信息,即未跟踪文件,除非跟踪该子文件夹中的至少一个文件 . 在此之前,git认为整个文件夹超出范围,la 'empty' . 它没有跟踪的项目 .

    • 除非还指定了-A,否则指定filespec = '.'(点)或当前目录不是递归的 . Dot严格指当前目录 - 它省略了上面和下面找到的路径 .

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

    限制器如下 .

    • -u = --update =跟踪文件的子集=>添加=否;改变=是;删除=是 . => iff跟踪项目 .

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

    pathspec如下 .

    • 在Git <2.0中,对于两个限制器(更新和全部),新的默认值是在整个工作树上运行,而不是当前路径(git <= 1.9),

    • 但是,在v2.0中,操作可以限制为当前路径:只需添加显式点后缀(在Git中也有效<= 1.9);

    git add -A .

    git add -u .

    总之,我的政策是;

    • 1.确保要添加的任何数据库/文件都以git状态计算 .

    • 1A . 如果由于不可见的文件/文件夹而丢失任何项目,请单独添加 .

    • 2.有一个好的gitignore,所以通常只有感兴趣的文件没有跟踪和/或无法识别 .

    • 3.从仓库的顶层,"git add -A"添加所有项目 . 这适用于所有版本的git .

    • 4.如果需要,从索引中删除任何所需的项目 .

    • 6.如果有大错误,请'git reset'完全清除索引 .

  • 3773

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

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

    P.S . :信息与Git 2.0有关 .

  • 11

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

    在GIT 2中, -A 选项现在是默认选项 .

    添加 . 时,会将更新范围限制为您当前所在的目录,具体为Git documentation

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

    我要添加的一件事是,如果使用 --interactive-p 模式,那么git add将表现得好像使用了更新( -u )标志而没有添加新文件

相关问题