Разница между "git add-A" и "git add."

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

9 ответов


этот ответ относится только к git версии 1.x. Для Git версии 2.х, см. другие ответы.


резюме:

  • 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 Версия 1.x: enter image description here

Git Версия 2.x: enter image description here

флаги длинной формы:

  • 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 (Nov. 2015) позволит вам добавить папку с именем ":"!
См.совершить 29abb33 (25 окт 2015) by Junio C Hamano (gitster).


отметим, что запуск git 2.0 (Q1 или Q2 2014), когда речь идет о git add . (текущий путь в рабочем дереве), вы должны использовать '. в другой git add команд.

это значит:

"git add -A ." эквивалентно "git add .; git add -u ."

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


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

# 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 add -A 

как ниже (то же git добавить --все)

git add . 

этапы новые + измененные файлы

git add -u 

этапы изменения + удаленные файлы


что изменилось С 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 . добавляет измененные/удаленные файлы в текущей директории
  • без запятой, добавьте все файлы в проект независимо от текущего каталога

наконец-то я думаю, что я получил это, большое спасибо всем вам. Надеюсь, это добавит ясности.

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

ограничители могут быть-u или-A или nil.

Pathspec может быть путь к файлу или точка,'.- чтобы указать текущий каталог.

важные фоновые знания о том, как git "добавляет".

  • невидимые файлы, с префиксом точки, (dotfiles) никогда не распознаются автоматически Git. Они никогда даже не перечислены как "не отследили".
  • пустые папки никогда не добавляются git. Они даже никогда не упоминаются как "не отслеженные". (Обходной путь-добавить пустой файл, возможно невидимый, к отслеживаемым файлам.)
  • git status не будет отображать информацию о подпапке, т. е. не отслеженные файлы, если не отслеживается хотя бы один файл в этой подпапке. До этого времени git считает всю папку вне области видимости, а-ля "пустой". Он пуст отслеживаемых элементов.
  • указание filespec = '.' (точка), или текущий каталог не является рекурсивным, Если также не указан-A. Точка относится строго к текущему каталогу-она опускает пути, найденные выше и ниже.

Теперь, учитывая эти знания, мы можем применить вышеуказанные ответы.

ограничители следующим образом.

  • - u = -- update = подмножество отслеживаемых файлов => Add = No; Change = Yes; Delete= Yes. => iff элемент отслеживается.
  • - A = --all (нет такого-a, который дает синтаксическую ошибку) = надмножество всех неотслеживаемых / отслеживаемых файлов, если только в Git если элемент распознан, git add-A найдет его и добавит.

pathspec выглядит следующим образом.

  • в Git
  • однако, в v2.0, the операция может быть ограничена текущим путем: просто добавьте явный суффикс точки (который также действителен в Git

git add -A .

git add -u .

В заключение, моя политика ;

  • 1.Убедитесь, что все добавляемые скряги/файлы учитываются в состоянии git.
  • 1A.Если какие-либо элементы отсутствуют, из-за невидимых файлов/папок добавьте их отдельно.
  • 2.Есть хороший пример, так что обычно только файлы интерес не отслеживается и / или не признается.
  • 3.С верхнего уровня РЕПО "git add-A", чтобы добавить все элементы. Это работает во всех версиях git.
  • 4.При необходимости удалите все нужные элементы из индекса.
  • 6.Если есть большая ошибка, сделайте "git reset", чтобы полностью очистить индекс.

git add . равна git add -A . добавляет файлы в индекс только из текущих и дочерних папок.

git add -A добавляет файлы в индекс из всех папок в рабочее дерево.

С. П.: информация относится к Git 2.0.


на Git 2.x:

  • если вы находитесь непосредственно в рабочий каталог, потом git add -A и git add . Работа без разницы.

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

и вот все.