Рейтинг:13

В чем разница между git add * и git add .?

флаг us

В чем разница между командами git добавить * и git добавить . когда я ставлю параметры * и . соответственно? Какой список файлов система возвращает в обоих случаях?

флаг in
eis
См.: [stackoverflow: git add * (звездочка) против git add . (период)] (https://stackoverflow.com/questions/26042390/git-add-asterisk-vs-git-add-period)
флаг ag
Это зависит от того, какой интерпретатор команд вы используете для выполнения git.
Рейтинг:32
флаг jp
Dan
  • * является баш-глобусом. Он расширится на все файлы в каталоге, в котором вы находитесь, за исключением точечных файлов (файлов, начинающихся с точки (.)).
  • . означает текущий каталог.

Результат может сильно различаться в зависимости от содержимого вашего каталога и наличия .gitignore файл.

Предположим, что в вашем каталоге есть следующие файлы и каталоги:

.dotfile-который-должен-быть-зафиксирован
.git/
.gitignore
какой-то-файл-находится-в-gitignore
какой-то другой файл

Когда вы бежите git добавить *, глобус расширяется до запуска команды git. Итак, команда git получает следующее:

git добавить какой-то файл, который находится в git, игнорировать какой-то другой файл

Это вызывает четыре проблемы здесь.

  1. Git будет жаловаться, что какой-то-файл-находится-в-gitignore не может быть добавлен и попросит вас добавить силу (-f) аргумент, если вы действительно хотите его добавить.
  2. обе .dotfile-который-должен-быть-зафиксирован и .gitignore не были добавлены как * не расширяется до dotfiles.
  3. Если вы удалили файлы в каталоге, в котором находитесь, * никогда не может расширяться до них, поэтому удаленные файлы не будут помещены в промежуточные файлы.
  4. Если вы переименовали файлы в каталоге, в котором находитесь, * никогда не может расшириться до старого имени, но он расширится до нового. Итак, git увидит, что вы добавили новый файл, и, поскольку старое имя не было подготовлено, вы получите один и тот же файл, существующий дважды, со старым именем и новым именем.

Тем не менее, бег git добавить . говорит git добавить текущий каталог, в котором вы находитесь, не указывая, какой файл добавить. В этом случае git проверит .gitignore файл и рекурсивно добавить все файлы, не упомянутые в .gitignore.

В итоге:

  • Вы должны использовать git добавить . нет git добавить *.

Даже лучше:

  • Использовать git добавить полный/файл/пути так что вы не добавляете по ошибке материал, который не готов к добавлению.

И даже намного лучше:

  • Использовать git добавить -p чтобы просмотреть ваши изменения и выбрать, какие исправления вы хотите добавить.
флаг in
Еще лучше: `git add be/explicit`. Вы не должны использовать ни `git add *`, ни `git add .`, потому что вы должны гораздо более обдуманно относиться к тому, что вы добавляете в git.
флаг st
Хотя лично я являюсь большим поклонником `git add -p` и использую его все время, следует отметить, что с ним связана большая опасность, а именно то, что вы инсценируете состояние, которого никогда не существовало в этом форме на диске, и поэтому, вероятно, никогда не тестировался. По этой причине он запрещен в некоторых руководствах по использованию Git в некоторых организациях.
John C avatar
флаг tr
Я также согласен с использованием `git add .`, но отмечу, что это текущий каталог и ниже, поэтому, если вы оказались в подкаталоге (скажем, в командной строке, а не в инструменте с графическим интерфейсом), вы бы не не добавлять какие-либо изменения в каталоги верхнего уровня. Далее я делаю `git status`, просто чтобы убедиться, что ничего не пропустил.
David Z avatar
флаг es
@ JörgWMittag Интересно ... хотя я бы сказал, что опасность возникает только в том случае, если вы не вернетесь и не протестируете полученный коммит.Проведение этого теста — вполне разумная вещь, которую нужно делать и ожидать от людей. Итак, лично я не согласен с тем, что это следует отметить; Я думаю, что это будет больше отвлекать, чем стоит добавить это к ответу.
флаг in
eis
этот ответ относительно длинный и по-прежнему не учитывает все важные вещи. наиболее важными вариантами использования точки являются 1) все подкаталоги и 2) все удаления/переименования, которые здесь даже не упоминаются.
флаг jp
Dan
@eis Вы правы насчет удаления/переименования. Я добавлю подробности о тех. Но что касается подкаталогов, `git add .` и `git add *` ведут себя одинаково для них, если в их имени нет точки.
Рейтинг:3
флаг in

Что-то еще, на что не указывают текущие ответы, было бы тем, что git добавить * не заметит, если вы удалили или переименовали какие-либо файлы, но git добавить . будет.

Рейтинг:2
флаг my

Краткое содержание

git добавить * означает добавить все файлы в текущий каталог, кроме файлов, имена которых начинаются с точки. Это функциональность вашей оболочки, и Git получает только список файлов.


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


Ответ адаптирован из stackoverflow

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.