Різниця між "git add -A" та "git add".


2917

git add [--all|-A]Здається, що команда ідентична git add .. Це правильно? Якщо ні, то чим вони відрізняються?

Відповіді:


4240

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

41
Як щодо різниці між git add *?
— Джаред

3
занадто погано git add -A -pне працює, як можна було б очікувати (інтерактивно запитайте про відслідковувані файли)
— Ерік Каплун

2
Будь ласка, оновіть відповідь. Це має бути: git add -A :/абоgit add -A .
— Габріель Ллама

5
Для інформації, у нових версіях git git add -uстав git add -u :/з останнім параметром шлях, що дозволяє -u певні каталоги, :/обробляє все дерево.
— Брізе

15
@CharlesBailey, Git дуже любить робити речі складними без поважних причин. Чи є реальний випадок використання при якому хто - то конкретно потрібно буде git add -uабо git add .і тим самим , що це робить його життя легше , навіть після врахування додаткових ментальної податку на додану для того , щоб не ви ніяких проблем синхронізації? Цікаво, чому Git не розбиває add -uна дві окремі команди, add -u1і add-u2одна працює для файлів, що починаються з цифр, а інша для файлів, що починаються з цифр
— Pacerier

946

Ось таблиця для швидкого розуміння:

Версія Git 1.x :

Введіть тут опис зображення

Версія Git 2.x :

Введіть тут опис зображення

Прапори довгої форми:

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

Подальше читання:


1
Дякую за стіл. Чи є спосіб додати лише ті файли, які були змінені. Немає нових файлів чи видалених файлів
— Gokul NK

3
@Gokul: Відповідно до цієї публікації , ви можете git diff-files -z --diff-filter=M --name-only | xargs -0 git addдодавати лише модифіковані файли, але не нові файли чи видалення.
— Віль

93
Це не зовсім вірно, оскільки git add .додає лише нові файли, які знаходяться на поточному шляху. Тобто, якщо у вас є новий каталог ../foo, його git add -Aбуде стадіювати, git add .не буде.
— Міло Вілондек

2
Отже, git add .еквівалентно git add -A ., що еквівалентноgit add "*"
— flow2k

Я все ще плутаю про git add "*", чи можете ви детальніше розібратися?
— HS Umer farooq

176

У 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 буде відрізнятися від сьогоднішньої версії в такій ситуації.


3
@NickVolynkin Це чудово! Радий бачити, як міжнародна спільнота ТО працює за призначенням. Довідково: ru.stackoverflow.com/a/431840
— VonC

@VonC, Ніцца, люди з Git насправді мали щоку сказати, що їх оновлення "зробить речі більш послідовними". Те, що вони зробили, створює більше плутанини та неузгодженості. Там є 26 алфавітів, і їм довелося повторно використовувати прапор, який уже використовується.
— Pacerier

136

З інструкцій Чарльза після перевірки запропонованого нами розуміння було б наступне:

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


6
це вже не відповідає дійсності в 2.0. додати. дорівнює додавання -A для того ж шляху, різниця лише в тому, що в інших шляхах дерева є нові файли
— Claudiu Creanga

41

Все змінилося з 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 . додає змінені / видалені файли в поточний каталог
  • Без крапки додайте всі файли в проект незалежно від поточного каталогу.

4
Я не думаю, що це правильно. Використання git v2.10.windows.2 'git add' повертає 'Нічого не вказано, нічого не додано'. 'git add -A' додає всі змінені файли. Що говорить про те, що "-A" не є типовим.
— Нейтрино

34

Більш дистильована швидка відповідь:

Чи обидва нижче (те саме, що git add - всі )

git add -A

Етапи нових + модифікованих файлів

git add .

Етапи модифіковані + видалені файли

git add -u

5
Привіт, що робити, якщо ви просто хотіли виставляти лише змінені файли? Як би ти це зробив?
— TheGrapeBeyond

2
Привіт, добре питання. Для цього немає простого прапора, наскільки я знаю .. git diff-files -z --diff-filter = M - тільки ім'я | xargs -0 git add from -> stackoverflow.com/questions/14368093/…
— К. Кіліан Ліндберг

2
Насправді це git add :/+git add -u :/
— Нік Волинкін

27

У Git 2.x :

  • Якщо ви знаходитесь безпосередньо в робочому каталозі , тоді git add -Aі git add .працюйте без різниці.

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

І це все.


12

Я сподіваюся, що це може додати ще ясності.

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

Обмежувачі можуть бути -u або -A або нульовими.

Pathspec може бути файловим шляхом або крапкою, '.' щоб вказати поточний каталог.

Важливі основні знання про те, як Git "додає":

  • Git ніколи не розпізнає автоматично невидимі файли, файли з префіксом крапки (dotfiles). Вони ніколи навіть не перелічені як "без нагляду".
  • Порожні папки ніколи не додаються Git. Вони ніколи навіть не перелічені як "без нагляду". (Вирішення проблеми полягає в тому, щоб додати до відстежених файлів порожній файл, можливо, невидимий.)
  • Стан Git не відображатиме інформацію про папки, тобто не відстежені файли, якщо не відстежується хоча б один файл у цій папці. До цього часу Git вважає всю папку поза межею, a la 'порожньою'. Він порожній від відслідковуваних предметів.
  • Вказівка ​​filepec = '.' (крапка) або поточний каталог не є рекурсивним, якщо -Aтакож не вказано. Dot відноситься строго до поточного каталогу - він опускає шляхи, знайдені вище та нижче.

Тепер, враховуючи ці знання, ми можемо застосувати відповіді вище.

Обмежувачі наступні.

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

Шлях пройде наступним чином.

  • У Git до 2.0 для двох обмежувачів (оновлення та всіх) новий за замовчуванням повинен працювати на всьому робочому дереві, а не на поточному шляху (Git 1.9 або раніше),
  • Однак у v2.0 операція може бути обмежена поточним шляхом: просто додайте явний суфікс крапки (який також дійсний у Git 1.9 або раніше);

git add -A .

git add -u .

На закінчення, моя політика:

  1. Переконайтеся, що всі записи / файли, які потрібно додати, обліковуються в git status.
  2. Якщо якісь елементи відсутні, через невидимі файли / папки додайте їх окремо.
  3. Майте хороший .gitignoreфайл, щоб зазвичай не відстежувались та / або не розпізнавалися лише цікаві файли.
  4. З верхнього рівня сховища "git add -A", щоб додати всі елементи. Це працює у всіх версіях Git.
  5. Видаліть будь-які бажані елементи з індексу за бажанням.
  6. Якщо є велика помилка, зробіть "git reset", щоб очистити індекс повністю.

12

git add .дорівнює, git add -A .додає файли до індексу лише з поточних та дочірніх папок.

git add -A додає файли до індексу з усіх папок робочого дерева.

PS: інформація стосується Git 2.0 (2014-05-28).


9

І вони, 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, безумовно, поетапно змінить, незалежно від того, звідки ви виконуєте команду.


3

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

У Git 2 -Aтепер параметр за замовчуванням.

Коли .додається a , що обмежує область оновлення до каталогу, в якому ви зараз перебуваєте, відповідно до документації Git

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

Одне, що я хотів би додати, це те, що якщо використовується --interactiveабо -pрежим, то він git addбуде вести себе так, ніби використовується -uпрапор update ( ) і не додавати нові файли.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.