Мы обновили этот курс — добавили новые темы, самостоятельные задания и практические упражнения. Посмотрите этот урок по ссылке: https://ru.hexlet.io/courses/intro_to_git/lessons/workflow/theory_unit
Здравствуйте!
Сегодня мы поговорим про фиксирование ваших изменений в репозитории. Вероятнее всего вы уже догадались, что это одна из самых важны операций в стандартном work-flow. На самом деле, так и есть :)
Идеологическое отличее git от других систем контроля версий - это то, что при работе с git - вы только добавляете изменения в репозиторий. Не важно, что вы сделали - написали новую строчку кода, отредактировали существующую, или же, удалили файл - при фиксировании изменений, вы всегда добавляете изменения.
Для того, чтобы зафиксировать изменения - необходимо выбрать то, что нужно сохранить и выполнить коммит. Для выбора нужных изменений из совершенных используется команда git add
. На начальном этапе знакомства многие считают, что это команда означает нечто вроде добавить указанный файл или директорию в репозиторий. Это утверждение отчасти верно. Примерно на 10%. Предназначение этой команды не ограничивается этой функциональностью. Возможности команды git add
настолько обширны, что знакомство с ними мы разобьем на несколько уроков.
Я рекомендую сразу пересмотреть ваше восприятие воздействия этой команды. Выполняя ее, вы подготавливаете конкретные изменения к фиксированию в репозитории. Или, можно сказать, что вы говорите о завершенности каких-либо изменений в репозитории на текущий момент времени.
Все файлы в рабочей директории могут находиться в 2-х состояниях:
В случае с новыми файлами - добавление файла под версионный контроль осуществляется командой git add
.
git add [-n] [-v]
[--force | -f]
[--interactive | -i]
[--patch | -p]
[--edit | -e]
[--[no-]all | --[no-]ignore-removal | [--update | -u]]
[--intent-to-add | -N]
[--refresh]
[--ignore-errors]
[--ignore-missing]
[--]
[<pathspec>...]
Если говорить кратко, то основная задача этой команды - фиксирование состояния рабочей директории для последующего коммита. Коммит выполняется на основании индекса, "индекс" - это снимок содержания рабочей директории, и именно этот snapshot, будет использован при выполнения коммита.
Чтобы было проще понять - можно представить, что при выполнении команды git add
git, как будто, копирует все ваши файлы (по определенным правилам) в рабочем каталоге в какое-то секретное место и, при выполнении команды git commit
будет использовать эту копию данных для вычисления выполненных изменений и создания коммита.
Таким образом, после внесения каких-либо изменений в рабочем каталоге, и перед запуском команды git commit
, вы должны использовать команду git add
, чтобы добавить какие-либо новые или измененные файлы в индекс.
Команда git add
может быть использована многократно перед тем, как будет создан коммит.
Для того, чтобы посмотреть на синтаксис команды git add
выполним команду git --help add
. Результатом выполнения этой команды будет страница помощи.
Хочу обратить внимание на формат команды: git add [some_options] [--] path's
Практически все команды git имеют такой формат.
Рассмотрим поподробнее некоторые опции команды git add
. Я умышленно не буду рассказывать про некоторые особенности этих опций. Вы сможете прочесть о них на странице справки по этой команде.
<pathspec>
Путь к файлу, файлам или директории с файлами. Поддрерживает glob-шаблоны. В некоторых случаях может опускаться, что означает, что pathspec будет равен текущей директории, из которой была вызвана команда git add
. Однако в последующих версиях эта возможность опускать указание pathspec будет удалена, поэтому лучше взять за привычку всегда указывать pathspec
.
Данная опция используется для разделения опций команды и списка файлов. Полезна в случаях, когда названия файлов могут быть ошибочно восприняты, как опция команды.
Команда git add может взаимодействовать с файлами, которые находятся под версионным контролем, и теми, которые не находятся под таковым. Если вы не хотите случайно добавит новый файл под версионный контроль, а просто хотите обновить индекс данными, которые относятся только к файлам, которые на текущий момент уже под версионным контролем - то стоит использовать опцию -u
. При ее использовании все файлы, которые не были ранее добавлены в git репозиторий - будут игнорироваться.
Если вы хотите добавить в индекс информацию об измененных/новых/удаленных файлах одновременно - вы можете воспользоваться опцией -A
. В будущем эта опция будет использоваться 'по умолчанию' при вызове команды git add ...
В индекс будут добавлены только измененные и новые файлы. Информация об удаленных файлах добавлена не будет. Эта опция используется сейчас по-умолчанию при вызове команды git add
. В будущем, использование данной опции, как опции по-умолчанию будет упразднено в пользу опции -A
Таким образом, если посмотреть на сводную таблицу, становится сразу понятно, когда какую опцию стоит использовать:
Content type | -u | -A | -no-all |
---|---|---|---|
Новый файл | - | + | + |
Измененный файл | + | + | + |
Удаленный файл | + | + | - |
Очень полезная в работе опция, которую на практике применяют очень мало пользователей. Суть ее сводится к тому, что вы сообщаете git о намерениях в будущем добавить новый файл под версионный контроль. Если быть честным - то git добавляет этот новый файл под версионный контроль, но с пустым контентом. Таким образом, когда вы выполняете команду git diff
- вы видите изменения, которые могут быть добавлены в индекс. Если файл не отслеживается - у вас такой возможности нет.
Иногда бывает такая ситуация, что файл, который вы хотите добавит в индекс попадает под шаблоны игнорирования, определенные в gitignore файле. Если вы уверены, что вам необходимо добавить файл в индекс, можно либо отредактировать файл gitignore, или воcпользоваться опцией -f.
Следующие опции:
Я не буду рассматривать в рамках этой лекции. В повседневной работе они вам не пригодятся, если вы не пишете скрипты с использованием git.
А про
git add -p ...
git add -i ...
git add -e ...
мы поговорим в отдельной лекции.
Последнее, что хотелось бы сказать - всегда контролируйте то, что вы добавляете в репозиторий :)
На этом мы закончим этот урок. Спасибо за внимание!
Вам ответят команда поддержки Хекслета или другие студенты.
Выделите текст, нажмите ctrl + enter и отправьте его нам. В течение нескольких дней мы исправим ошибку или улучшим формулировку.
Загляните в раздел «Обсуждение»:
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно.
Наши выпускники работают в компаниях:
Зарегистрируйтесь или войдите в свой аккаунт