Вопрос: Разница между «git add -A» и «git add».


Команда git add [--all|-A]представляется идентичным git add ., Это верно? Если нет, то как они отличаются?


2353


источник


Ответы:


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

3596



Вот таблица для быстрого понимания:

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

Дальнейшее чтение:


630



С 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 (Nov. 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 будет отличаться   от сегодняшней версии в такой ситуации.


135



Итак, из приведенных выше инструкций Чарльза, после тестирования мое предлагаемое понимание будет следующим:

# 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



Поздно к партии, но этот вопрос также заслуживает более дистиллированного быстрого ответа.

git add -A 

Означает ли это ниже (то же, что и git add --all )

git add . 

Стадии новых + измененных файлов

git add -u 

Стадии измененные + удаленные файлы


26



Все изменилось с 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



Finally I think I get this, many thanks to you all. I hope this may add some more clarity.

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

Limiters may be -u or -A or nil.

Pathspec may be a filepath or dot, '.' to indicate the current directory.

Important background knowledge about how git 'adds'.

  • Invisible files, those prefixed with a dot, (dotfiles) are never automatically recognized by Git. They are never even listed as 'untracked'.
  • Empty folders are never added by git. They are never even listed as 'untracked'. (A workaround is to add a blank file, possibly invisible, to the tracked files.)
  • Git status will not display subfolder information, ie untracked files, unless at least one file in that subfolder is tracked. Before such time, git considers the entire folder out of scope, a la 'empty'. It is empty of tracked items.
  • Specifying a filespec = '.' (dot), or the current directory, is not recursive unless -A is also specified. Dot refers strictly to the current directory - it omits paths found above and below.

Now, given that knowledge, we can apply the answers above.

The limiters are as follows.

  • -u = --update = subset to tracked files => Add = No; Change = Yes; Delete= Yes. => iff the item is tracked.
  • -A = --all (no such -a, which gives syntax error) = superset of all untracked/tracked files , unless in Git < 2.0, wherein if the dot filespec is given, then only that particular folder is considered. => iff the item is recognized, git add -A will find it and add it.

The pathspec is as follows.

  • In Git <2.0, for the two limiters (update and all), the new default is to operate on the entire working tree, instead of the current path (git <= 1.9),
  • However, in v2.0, the operation can be limited to the current path: just add the explicit dot suffix (which is also valid in Git <=1.9);

git add -A .

git add -u .

In conclusion, my policy is ;

  • 1.Ensure any hunks/files to be added are accounted for in git status.
  • 1A.If any items are missing, due to invisible files/folders, add them separately.
  • 2.Have a good gitignore so that normally only files of interest are untracked and/or unrecognized.
  • 3.From the top level of the repo, "git add -A" to add all items. This works in all versions of git.
  • 4.Remove any desired items from the index if desired.
  • 6.If there is a big bug, do 'git reset' to clear the index entirely.

11



git add . equals git add -A . adds files to index only from current and children folders.

git add -A adds files to index from all folders in working tree.

P.S.: information relates to Git 2.0.


7



In Git 2.x:

  • If you are located directly at the working directory, then git add -A and git add . work without difference.

  • If you are in any subdirectory of the working directory, git add -A will add all files from the entire working directory, and git add . will add files from your current directory.

And that's all.


1