Разница между "git add -A" и "git add".

Команда git add [--all|-A] оказывается идентичной git add .. Это верно? Если нет, то как они отличаются?

Ответ 1

Этот ответ относится только к Git версии 1.x. Для Git версии 2.x см. Другие ответы.


Резюме:

  • git add -A ставит все изменения

  • git add. вносит новые файлы и модификации, без удаления

  • git add -u этапы модификации и удаления, без новых файлов


Деталь:

git add -A эквивалентен git add.; git add -u git add.; git add -u.

Важный момент о git add. является то, что он смотрит на рабочее дерево и добавляет все эти пути к поэтапным изменениям, если они либо изменены, либо являются новыми и не игнорируются, он не выполняет никаких действий 'rm'.

git add -u просматривает все уже отслеженные файлы и вносит изменения в эти файлы, если они отличаются или были удалены. Он не добавляет никаких новых файлов, он только вносит изменения в уже отслеженные файлы.

git add -A - это удобный ярлык для выполнения обеих 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

Ответ 2

Вот таблица для быстрого понимания:

Git Version 1.x:

Enter image description here

Git версии 2.x:

Enter image description here

Длинные флаги:

  • git add -A эквивалентно git add --all
  • git add -u эквивалентен git add --update

Дальнейшее чтение:

Ответ 3

С Git 2.0, git add -A по умолчанию: git add . равно 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 :/ (добавить все из верхней папки git repo).
Обратите внимание, что git 2.7 (ноябрь 2015) позволит вам добавить папку с именем ":"! См. передать 29abb33 (25 октября 2015 г.) Junio ​​C Hamano (gitster).


Обратите внимание, что начало git 2.0 (Q1 или Q2 2014), когда речь идет о 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.

Предупреждение выдается, когда эти команды запускаются без указания пути и при локальных изменениях за пределами текущего каталога, поскольку поведение в git 2.0 будет отличаться от сегодняшней версии в такой ситуации.

Ответ 4

Из инструкций Чарльза, после проверки мое предлагаемое понимание будет следующим:

# 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.

Ответ 5

Более дистиллированный быстрый ответ:

Делает ли оба ниже (так же, как git add --all)

git add -A

Этапы новые + измененные файлы

git add .

Этапы изменены + удаленные файлы

git add -u

Ответ 6

Вещи изменились с 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 . добавляет измененные/удаленные файлы в текущий каталог
  • Без точки добавьте все файлы в проект независимо от текущего каталога.

Ответ 7

В Git 2.x:

  • Если вы находитесь прямо в рабочем каталоге, то git add -A и git add. работать без разницы.

  • Если вы находитесь в каком-либо подкаталоге рабочего каталога, git add -A добавит все файлы из всего рабочего каталога и git add. добавит файлы из вашего текущего каталога.

И это все.

Ответ 8

Я надеюсь, что это может добавить больше ясности.

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

Ограничителями могут быть -u, -A или ноль.

Pathspec может быть путем к файлу или точкой, '.' чтобы указать текущий каталог.

Важные знания о том, как Git "добавляет":

  • Невидимые файлы с префиксом точки (файлы точек) никогда не распознаются Git автоматически. Они даже не указаны как "неотслеживаемые".
  • Пустые папки никогда не добавляются Git. Они даже не указаны как "неотслеживаемые". (Временное решение: добавить пустой файл, возможно, невидимый, в отслеживаемые файлы.)
  • Состояние Git не будет отображать информацию о подпапках, то есть неотслеживаемых файлах, если не отслежен хотя бы один файл в этой подпапке. До этого Git считает всю папку вне области видимости а-ля "пустая". В нем нет отслеживаемых предметов.
  • Указание filespec = '.' (точка) или текущий каталог не является рекурсивным, если только не указано -A. Точка относится только к текущему каталогу - она не содержит пути, найденные выше и ниже.

Теперь, учитывая это знание, мы можем применить ответы выше.

Ограничители следующие.

  • -u = --update = подмножество отслеживаемых файлов => Добавить = Нет; Изменить = Да; Удалить = Да. => если элемент отслеживается.
  • -A = --all (нет такого -a, который дает синтаксическую ошибку) = надмножество всех неотслеживаемых/отслеживаемых файлов, за исключением случаев, когда в Git до 2.0, где, если задана точечная спецификация файла, рассматривается только эта конкретная папка. => если элемент распознан, git add -A найдет его и добавит.

Pathspec выглядит следующим образом.

  • В Git до 2.0 для двух ограничителей (update и all) новым значением по умолчанию является работа со всем рабочим деревом вместо текущего пути (Git 1.9 или более ранней версии),
  • Однако в версии 2.0 операция может быть ограничена текущим путем: просто добавьте явный суффикс точки (который также действителен в Git 1.9 или более ранней версии);

git add -A .

git add -u .

В заключение, моя политика:

  1. Убедитесь, что любые фрагменты/файлы, которые будут добавлены, учтены в git status.
  2. Если какие-либо элементы отсутствуют, из-за невидимых файлов/папок добавьте их отдельно.
  3. Иметь хороший файл .gitignore, чтобы обычно только интересующие его файлы не отслеживались и/или не распознавались.
  4. На верхнем уровне хранилища "git add -A", чтобы добавить все элементы. Это работает во всех версиях Git.
  5. При желании удалите все нужные элементы из индекса.
  6. Если есть большая ошибка, выполните git reset, чтобы полностью очистить индекс.

Ответ 9

git add . equals git add -A . добавляет файлы к индексу только из текущей и дочерних папок.

git add -A добавляет файлы к индексу из всех папок в рабочем дереве.

P.S.: информация относится к Git 2.0.

Ответ 10

Оба 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 определенно внесет это изменение независимо от того, откуда вы выполняете команду.

Ответ 11

Опция -A добавляет, изменяет и удаляет записи индекса в соответствии с рабочим деревом.

В Git 2 опция -A теперь используется по умолчанию.

Когда добавлен ., который ограничивает область обновления каталогом, в котором вы находитесь в настоящее время, согласно документации Git

Если при использовании опции -A значение <pathspec> не задано, обновляются все файлы во всем рабочем дереве (старые версии Git использовались для ограничения обновления текущего каталога и его подкаталогов).

Я хотел бы добавить, что если используется режим --interactive или -p, то git add будет вести себя так, как если бы использовался флаг обновления (-u), а не добавлять новые файлы.