Разница между «git add -A» и «git add». - PullRequest
2618 голосов
/ 21 февраля 2009

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

Ответы [ 11 ]

3917 голосов
/ 21 февраля 2009

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


Резюме:

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

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

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


Detail:

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

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

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
786 голосов
/ 25 сентября 2014

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

Версия Git 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

Дополнительная информация:

158 голосов
/ 23 апреля 2013

С 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 г.) позволит вам добавить папку с именем ":"!
См. commit 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» (без указания пути), обновлять индекс только для путей в текущем подкаталоге. начать тренировать свои пальцы, чтобы явно сказать "git add -u .", когда они имеют это в виду, прежде чем появится Git 2.0.

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

129 голосов
/ 01 июня 2010

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

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

34 голосов
/ 06 апреля 2014

Более быстрый ответ:

Имеет ли и то, и другое (так же, как git add --all )

git add -A

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

git add .

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

git add -u
26 голосов
/ 13 октября 2014

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

In Git 2.x :

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

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

И это все.

11 голосов
/ 06 апреля 2015

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

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

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

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

Важные знания о том, как git «добавляет».

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

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

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

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

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

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

git add -A .

git add -u .

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

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

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

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

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

3 голосов
/ 08 ноября 2018

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

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

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

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

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

...