Різниця між "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.