Разница между "git add -A" и "git add".
Команда git add [--all|-A]
кажется идентичным git add .
, Это правильно? Если нет, чем они отличаются?
13 ответов
Этот ответ относится только к Git версии 1.x. Для 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 Version 1.x:
Git Version 2.x:
Длинные флаги:
git add -A
эквивалентноgit add --all
git add -u
эквивалентноgit add --update
Дальнейшее чтение:
С 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) позволит вам добавить папку с именем " :
"!
См. Коммит 29abb33 (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
"(без указания пути) обновление индекса только для путей в текущем подкаталоге, чтобы начать тренировать свои пальцы явно говорить"git add -u .
"когда они имеют в виду это до Git 2.0.Предупреждение выдается, когда эти команды выполняются без указания пути и когда у вас есть локальные изменения вне текущего каталога, потому что поведение в Git 2.0 будет отличаться от сегодняшней версии в такой ситуации.
Итак, из приведенных выше инструкций Чарльза, после проверки мое предлагаемое понимание будет следующим:
# 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.
В Git 2.x:
Если вы находитесь прямо в рабочем каталоге, то
git add -A
а такжеgit add .
работать без разницы.Если вы находитесь в любом подкаталоге рабочего каталога,
git add -A
добавит все файлы из всего рабочего каталога, иgit add .
добавит файлы из вашего текущего каталога.
И это все.
С 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 .
добавляет измененные / удаленные файлы в текущий каталог- без точки, добавьте все файлы в проект независимо от текущего каталога
Поздно на вечеринку, но этот вопрос также заслуживает более искаженного быстрого ответа.
git add -A
Делает оба ниже (так же, как git add --all)
git add .
Этапы новые + измененные файлы
git add -u
Этапы изменены + удаленные файлы
И то и другое 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
безусловно, внесет это изменение независимо от того, откуда вы выполняете команду.
Надеюсь, это устранит разницу.
git add .
равняется git add -A .
добавляет файлы в индекс только из текущей и дочерней папок.
git add -A
добавляет файлы для индексации из всех папок в рабочем дереве.
PS: информация относится к Git 2.0.
Наконец, я думаю, что понял, большое спасибо всем вам. Я надеюсь, что это может добавить больше ясности.
!The syntax is
git add <limiters> <pathspec>
! Aka
git add (nil/-u/-A) (nil/./pathspec)
Ограничителями могут быть -u или -A или ноль.
Pathspec может быть путем к файлу или точкой, '.' указать текущий каталог.
Важные базовые знания о том, как git "добавляет".
- Невидимые файлы с префиксом точки (файлы точек) никогда не распознаются Git автоматически. Они даже не указаны как "неотслеживаемые".
- Пустые папки никогда не добавляются git. Они даже не указаны как "неотслеживаемые". (Обходной путь - добавить пустой файл, возможно, невидимый, к отслеживаемым файлам.)
- Состояние Git не будет отображать информацию о подпапках, то есть неотслеживаемых файлах, если не отслежен хотя бы один файл в этой подпапке. До этого git считает всю папку вне области видимости, а именно "пустой". В нем нет отслеживаемых предметов.
- Указание filespec = '.' (точка) или текущий каталог не является рекурсивным, если также не указан параметр -A. Dot относится исключительно к текущему каталогу - он пропускает пути, найденные выше и ниже.
Теперь, учитывая это знание, мы можем применить ответы выше.
Ограничители заключаются в следующем.
- -u = --update = подмножество отслеживаемых файлов => Добавить = Нет; Изменить = Да; Удалить = Да. => если предмет отслеживается.
- -A = --all (нет такого -a, который дает синтаксическую ошибку) = надмножество всех неотслеживаемых / отслеживаемых файлов, кроме случаев, когда в Git < 2.0, где, если задана точечная спецификация файла, рассматривается только эта конкретная папка. => если элемент распознан, git add -A найдет его и добавит.
Pathspec заключается в следующем.
- В Git <2.0 для двух ограничителей (update и all) новым значением по умолчанию является работа со всем рабочим деревом вместо текущего пути (git <= 1.9),
- Однако в версии 2.0 операция может быть ограничена текущим путем: просто добавьте явный суффикс точки (который также действителен в Git <=1.9);
git add -A .
git add -u .
В заключение, моя политика такова;
- 1. Убедитесь, что любые блоки / файлы, которые будут добавлены, учитываются в состоянии git.
- 1A.Если отсутствуют какие-либо элементы из-за невидимых файлов / папок, добавьте их отдельно.
- 2. Иметь хороший gitignore, так что обычно только интересующие файлы не отслеживаются и / или не распознаются.
- 3. На верхнем уровне репозитория "git add -A" добавьте все элементы. Это работает во всех версиях git.
- 4. При необходимости удалите все нужные элементы из индекса.
- 6. Если есть большая ошибка, выполните git reset, чтобы полностью очистить индекс.
Опция -A добавляет, изменяет и удаляет записи индекса в соответствии с рабочим деревом.
В ГИТ 2 -A
опция теперь по умолчанию.
Когда .
добавлено, что ограничивает область обновления до каталога, в котором вы находитесь в настоящее время, согласно документации Git
Если нет
<pathspec>
дается, когда используется опция -A, обновляются все файлы во всем рабочем дереве (старые версии Git использовали для ограничения обновления текущим каталогом и его подкаталогами).
Я бы добавил, что если --interactive
или же -p
режим используется тогда git add будет вести себя так, как будто обновление (-u
) использовался флаг и не добавлялись новые файлы
Полезно иметь описания того, что делает каждый флаг. Используя бит, подобный CLI, вы получите доступ к описаниям флагов во время ввода.
Я ненавижу промежуточный механизм git, которого нет в других инструментах SCM. Поэтому я всегда использую:
\git add --all && \git commit --all
(Хотя с
\git add --all
,
\git commit
достаточно)
за
add
:
--no-ignore-removal --all | add, modify, and remove index entries to match the working tree
--ignore-removal --no-all | add, modify index entries to match the working tree
--intent-to-add | add an entry for the path to the index, with no content
-A
сокращение от
--all
git add <pathspec>
равно:
для версии 2.35.1 Git:
git add --all <pathspec>
Старые версии Git:
git add --no-all <pathspec>
Но
git add
за которым следует ничего, не равно и ничего не делает:
git add --all
(опуская
<pathspec>
): обрабатывать все файлы во всем рабочем дереве (старые версии Git ограничивали обновление текущим каталогом и его подкаталогами).
git совершить --все
Укажите команду для автоматической подготовки файлов, которые были изменены и удалены. новые файлы, о которых вы не сообщили Git, не затрагиваются