Відповіді:
Ця відповідь стосується лише версії 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 --all
git 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 *
?