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


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


2398
2018-02-21 06:51


походження




Відповіді:


Для 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

3658
2018-02-21 09:00



Як щодо різниці між git add *? - Jared
@ Jared додала пояснення зірочки, щоб відповісти на ваше запитання - Geo
Для простоти, будь ласка, вилучіть що-небудь вище сумарної частини в цій відповіді. Якщо ні, перемістіть резюме до вершини. - maliayas
Для довідки, у новій версії git git add -u став git add -u :/ причому останній параметр є шлях, що дозволяє вам -u певні каталоги, :/ обробляє ціле дерево. - Brizee
@ЧарлсБейлі, Гіт дійсно кохання робити речі складні без вагомих причин. Чи тут є реальний Використовуйте справи, за якими хтось конкретно потребує git add -u або git add . і, роблячи це, це полегшує його життя навіть після врахування додаткового психічного податку, щоб забезпечити відсутність проблем синхронізації? Я дивуюся чому Git не furthur розкол add -u в дві окремі команди add -u1 і add-u2 за допомогою якого працює файли, починаючи з цифр, а інше - для файлів, що починаються з нецифр - Pacerier


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

Git Version 1.x: enter image description here

Git Version 2.x: enter image description here

Довгі бланки прапори:

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

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


648
2017-09-25 12:45



Дякую за стіл. Чи є спосіб додавання лише файлів, які були змінені. Немає нових файлів або видалених файлів - Gokul N K
@ Гокул: згідно з цей пост, ви можете використовувати git diff-files -z --diff-filter=M --name-only | xargs -0 git add щоб додати лише модифіковані файли, але не нові файли або видалення. - Ville
Це не зовсім так, як git add . лише додає нові файли, які знаходяться на поточному шляху. І.е. якщо у вас є новий каталог ../foo, git add -A почне це, git add . не буде. - 0sh
Так, git add . еквівалентно git add -A ., що еквівалентно git add "*" - flow2k


З 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 року) дозволить вам додати папку під назвою ":"!
Побачити вчинити 29абб33 (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"(без pathspec) оновлення індексу тільки для шляхів у поточному підкаталозі, щоб розпочати навчання пальців, щоб явно сказати"git add -u ."коли вони означають це перед Git 2.0.

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


136
2018-04-23 06:32



Дякуємо за подробиці про .. Включив їх у мою компіляцію про add на RU.SO. - Nick Volynkin
@NickVolynkin Це здорово! Радий бачити, що міжнародне співтовариство СО працюватиме, як передбачено. Для довідки: ru.stackoverflow.com/a/431840 - VonC
@ VonC, Ніцца, людям Git насправді було щоку сказати, що їх оновлення "зробить речі більш послідовними". Те, що вони зробили, створює більше плутанини та невідповідності. Там 26 алфавітів і вони мав щоб повторно використовувати прапор, який вже був використаний. - Pacerier


Отже, з інструкцій Карла, вищесказаного, після тестування моє запропоноване розуміння буде таким:

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


126
2018-06-01 09:27



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


Пізніше до вечірки, але це питання також заслуговує більш швидкої відповіді.

git add -A 

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

git add . 

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

git add -u 

Стадії модифіковані + видалені файли


27
2018-04-06 12:56



Привіт, що, якщо ви просто хочете виставити тільки модифіковані файли? Як би ти це зробив? - TheGrapeBeyond
Привіт, добре, добре. Існує нелегкий прапор, наскільки я знаю .. git diff-files -z --diff-filter = M - тільки ім'я | xargs -0 git додати з -> stackoverflow.com/questions/14368093/... - K. Kilian Lindberg
Насправді це так git add :/ + git add -u :/ - Nick Volynkin


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

23
2017-10-13 15:29



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


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

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

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

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

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

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

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

Обмежувачі виглядають таким чином.

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

Шлях до наступного полягає в наступному.

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

git add -A .

git add -u .

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

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

11
2018-04-06 02:03