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

2377

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

Теги:
git-add

10 ответов

3790
Лучший ответ

Этот ответ относится только к Git версии 1.x. Для Git версии 2.x см. Другие ответы.


Резюме:

  • git add -A ставит все изменения

  • git add. вносит новые файлы и модификации, без удаления

  • git add -u этапы модификации и удаления, без новых файлов


Деталь:

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

Важный момент о git add. является то, что он смотрит на рабочее дерево и добавляет все эти пути к поэтапным изменениям, если они либо изменены, либо являются новыми и не игнорируются, он не выполняет никаких действий 'rm'.

git add -u просматривает все уже отслеженные файлы и вносит изменения в эти файлы, если они отличаются или были удалены. Он не добавляет никаких новых файлов, он только вносит изменения в уже отслеженные файлы.

git add -A - это удобный ярлык для выполнения обеих 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
  • 36
    Как насчет разницы между git add * ?
  • 8
    @Jared, добавил звёздное объяснение, чтобы ответить на твой вопрос
Показать ещё 16 комментариев
676

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

Git Версия 1.x: Изображение 7485

Git Версия 2.x: Изображение 7486

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

  • git add -A эквивалентен git add --all
  • git add -u эквивалентен git add --update

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

  • 1
    Спасибо за стол. Есть ли способ добавить только файлы, которые были изменены. Нет новых файлов или удаленных файлов
  • 3
    @Gokul: Согласно этому посту , вы можете использовать git diff-files -z --diff-filter=M --name-only | xargs -0 git add для добавления только измененных файлов, но не новых файлов или удалений.
Показать ещё 4 комментария
147

С 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" (без pathspec), обновляющего индекс только для путей в текущем подкаталоге чтобы начать тренировать пальцы, чтобы явно сказать "git add -u .", когда они означают его до появления git 2.0.

Предупреждение выдается, когда эти команды запускаются без указания пути и при локальных изменениях за пределами текущего каталога, поскольку поведение в git 2.0 будет отличаться от сегодняшней версии в такой ситуации.

  • 1
    Спасибо за детали о . , Включил их в мой сборник о add на RU.SO.
  • 3
    @NickVolynkin Это здорово! Рад видеть, что международное сообщество SO работает так, как задумано. Для справки: ru.stackoverflow.com/a/431840
Показать ещё 1 комментарий
128

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

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

  • 4
    это больше не верно в 2.0. добавлять . равняется добавлению -A для того же пути, единственное отличие состоит в том, что есть новые файлы в других путях дерева
32

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

git add -A 

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

git add . 

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

git add -u 

Обновлены этапы + удаленные файлы

  • 5
    Здравствуйте, а что если вы просто хотели разместить только измененные файлы? Как бы Вы это сделали?
  • 2
    Здравствуйте, хорошо, хороший вопрос. Насколько мне известно, не существует простого флага для этого .. git diff-files -z --diff-filter = M --name-only | xargs -0 git add from -> stackoverflow.com/questions/14368093/…
Показать ещё 1 комментарий
25

Все изменилось с помощью 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 . добавляет измененные/удаленные файлы в текущий каталог
  • без точки, добавьте все файлы в проект независимо от текущего каталога
  • 2
    Я не думаю, что это правильно. Использование git v2.10.windows.2 «git add» возвращает «Ничего не указано, ничего не добавлено». 'git add -A' добавляет все измененные файлы. Что говорит о том, что «-А» не по умолчанию.
17

В Git 2.x:

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

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

И это все.

11

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

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

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

Pathspec может быть файловой точкой или точкой, '.' для указания текущего каталога.

Знание базовых знаний о том, как git добавляет '.

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

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

Ограничители следующие.

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

Ниже приведен путь.

  • В git < 2.0 для двух ограничителей (обновление и все) новый по умолчанию должен работать во всем рабочем дереве вместо текущего пути (git <= 1.9),
  • Однако в версии 2.0 операция может быть ограничена текущим путем: просто добавьте явный точечный суффикс (который также действителен в git <= 1.9);

git add -A .

git add -u .

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

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

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

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

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

1

Опция -A добавляет, изменяет и удаляет записи индекса в соответствии с рабочим деревом.

В GIT 2 опция -A теперь используется по умолчанию.

Когда а . добавлено, что ограничивает область обновления до каталога, в котором вы находитесь в настоящее время, согласно документации Git

Если при использовании опции -A не <pathspec>, обновляются все файлы во всем рабочем дереве (старые версии Git использовались для ограничения обновления текущим каталогом и его подкаталогами).

Я хотел бы добавить, что если используется режим --interactive или -p, то git add будет вести себя так, как если бы использовался флаг обновления (-u), а не добавлять новые файлы.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню