Відповіді:
Ця відповідь стосується лише версії 1.x Git . Для 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 1.x :

Версія Git 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) Хуніо С Хамано ( 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 буде відрізнятися від сьогоднішньої версії в такій ситуації.
З інструкцій Чарльза після перевірки запропонованого нами розуміння було б наступне:
# 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, де, якщо надається файл filepec точок, розглядається лише ця конкретна папка. => якщо елемент розпізнається, git add -Aзнайде його та додасть.Шлях пройде наступним чином.
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
Якщо
<pathspec>при використанні параметра -A не вказано, усі файли у всьому робочому дереві оновлюються (старі версії Git використовуються для обмеження оновлення до поточного каталогу та його підкаталогів).
Одне, що я хотів би додати, це те, що якщо використовується --interactiveабо -pрежим, то він git addбуде вести себе так, ніби використовується -uпрапор update ( ) і не додавати нові файли.
git add *?