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

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

13 ответов

Решение

Этот ответ относится только к 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 Version 1.x:

Git Version 2.x:

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

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

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

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

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

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

# 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

Эта ссылка может также помочь понять, в какой ситуации могут применяться эти команды: Удаление удаленных файлов из вашего рабочего каталога Git.

В Git 2.x:

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

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

И это все.

С 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 add -A 

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

git add . 

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

git add -u 

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

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

Надеюсь, это устранит разницу.

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

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

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

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

!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. Dot относится исключительно к текущему каталогу - он пропускает пути, найденные выше и ниже.

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

Ограничители заключаются в следующем.

  • -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.
  • 1A.Если отсутствуют какие-либо элементы из-за невидимых файлов / папок, добавьте их отдельно.
  • 2. Иметь хороший gitignore, так что обычно только интересующие файлы не отслеживаются и / или не распознаются.
  • 3. На верхнем уровне репозитория "git add -A" добавьте все элементы. Это работает во всех версиях git.
  • 4. При необходимости удалите все нужные элементы из индекса.
  • 6. Если есть большая ошибка, выполните git reset, чтобы полностью очистить индекс.

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

В ГИТ 2 -A опция теперь по умолчанию.

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

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

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

Полезно иметь описания того, что делает каждый флаг. Используя бит, подобный CLI, вы получите доступ к описаниям флагов во время ввода.

Я ненавижу промежуточный механизм git, которого нет в других инструментах SCM. Поэтому я всегда использую:

\git add --all && \git commit --all

(Хотя с \git add --all, \git commitдостаточно)


за add:

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

git add <pathspec>равно:

для версии 2.35.1 Git: git add --all <pathspec>
Старые версии Git: git add --no-all <pathspec>

Но git addза которым следует ничего, не равно и ничего не делает:

git add --all(опуская <pathspec>): обрабатывать все файлы во всем рабочем дереве (старые версии Git ограничивали обновление текущим каталогом и его подкаталогами).

git совершить --все

Укажите команду для автоматической подготовки файлов, которые были изменены и удалены. новые файлы, о которых вы не сообщили Git, не затрагиваются

Другие вопросы по тегам