Ответы:
Этот ответ относится только к 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 add -A -pне работает, как и следовало ожидать (спросите в интерактивном режиме о неотслеживаемых файлах)
git add -A :/илиgit add -A .
git add -uстало git add -u :/с последним параметром, являющимся путем, позволяя вам -u определенные каталоги, :/обрабатывает все дерево.
git add -uили, git add .благодаря этому, он облегчит свою жизнь даже после учета добавленного дополнительного ментального налога, чтобы гарантировать отсутствие проблем с синхронизацией? Интересно, почему Git не разбивается add -uна две отдельные команды, add -u1и add-u2одна из них работает с файлами, начинающимися с цифр, а другая - с файлами, начинающимися с цифр,
Вот таблица для быстрого понимания:
Git Version 1.x :

Git Version 2.x :

Длинные флаги:
git add -A эквивалентно git add --allgit add -u эквивалентно git add --updateДальнейшее чтение:
git diff-files -z --diff-filter=M --name-only | xargs -0 git addдля добавления только измененные файлы, но не новые файлы или удаления.
git add .добавляет только новые файлы, которые находятся на текущем пути. Т.е. если у вас есть новый каталог ../foo, его git add -Aбудет ставить, git add .не будет.
git add .эквивалентно git add -A ., что эквивалентноgit add "*"
С 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 -Aэто как 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 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 .
С Git 2.0 все изменилось ( 2014-05-28 ):
-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 .
git add -u
git add :/+git add -u :/
В Git 2.x :
Если вы находитесь прямо в рабочем каталоге , то git add -Aи git add .работайте без разницы.
Если вы находитесь в каком-либо подкаталоге рабочего каталога , git add -Aвы добавите все файлы из всего рабочего каталога и git add .добавите файлы из вашего текущего каталога .
И это все.
Я надеюсь, что это может добавить больше ясности.
!The syntax is
git add <limiters> <pathspec>
! Aka
git add (nil/-u/-A) (nil/./pathspec)
Ограничителями могут быть -u или -A или ноль.
Pathspec может быть путем к файлу или точкой, '.' указать текущий каталог.
Важные знания о том, как Git «добавляет»:
-Aне указано иное. Dot относится исключительно к текущему каталогу - он пропускает пути, найденные выше и ниже.Теперь, учитывая это знание, мы можем применить ответы выше.
Ограничители заключаются в следующем.
-u= --update= подмножество отслеживаемых файлов => Добавить = Нет; Изменить = Да; Удалить = Да. => если предмет отслеживается.-A= --all(нет такого -a, что дает синтаксическую ошибку) = надмножество всех неотслеживаемых / отслеживаемых файлов, за исключением случаев, когда в Git до 2.0, где, если задана точечная спецификация файла, учитывается только эта конкретная папка. => если элемент распознан, git add -Aнайдет его и добавит.Pathspec выглядит следующим образом.
git add -A .
git add -u .
В заключение, моя политика:
git status ..gitignore файл, чтобы обычно только интересующие его файлы не отслеживались и / или не распознавались.Оба 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, безусловно, внесет это изменение независимо от того, откуда вы выполняете команду.
-AОпция добавляет, изменяет и удаляет запись индекса для соответствия рабочего дерева.
В Git 2 эта -Aопция теперь используется по умолчанию.
Когда .добавляется a, который ограничивает область обновления до каталога, в котором вы находитесь в настоящее время, согласно документации Git
Если не задано no
<pathspec>при использовании опции -A, обновляются все файлы во всем рабочем дереве (старые версии Git использовались для ограничения обновления текущим каталогом и его подкаталогами).
Одна вещь, которую я хотел бы добавить, это то, что если используется режим --interactiveили -p, то он git addбудет вести себя так, как если бы использовался -uфлаг update ( ), а не добавлять новые файлы.
git add *?