Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Запись изменений в репозиторий. Подготовка к коммиту. Основы Git

Видео может быть заблокировано из-за расширений браузера. В статье вы найдете решение этой проблемы.

Рекомендуем перейти в курс Введение в Git

Мы обновили этот курс — добавили новые темы, самостоятельные задания и практические упражнения. Посмотрите этот урок по ссылке: https://ru.hexlet.io/courses/intro_to_git/lessons/workflow/theory_unit


Здравствуйте!

Сегодня мы поговорим про фиксирование ваших изменений в репозитории. Вероятнее всего вы уже догадались, что это одна из самых важны операций в стандартном work-flow. На самом деле, так и есть :)

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

Для того, чтобы зафиксировать изменения - необходимо выбрать то, что нужно сохранить и выполнить коммит. Для выбора нужных изменений из совершенных используется команда git add. На начальном этапе знакомства многие считают, что это команда означает нечто вроде добавить указанный файл или директорию в репозиторий. Это утверждение отчасти верно. Примерно на 10%. Предназначение этой команды не ограничивается этой функциональностью. Возможности команды git add настолько обширны, что знакомство с ними мы разобьем на несколько уроков.

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

Все файлы в рабочей директории могут находиться в 2-х состояниях:

  • Под контролем системы управления версиями
  • Не под контролем системы управления версиями

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

SYNOPSIS

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.

--

Данная опция используется для разделения опций команды и списка файлов. Полезна в случаях, когда названия файлов могут быть ошибочно восприняты, как опция команды.

-u, --update

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

-A, --all, --no-ignore-removal

Если вы хотите добавить в индекс информацию об измененных/новых/удаленных файлах одновременно - вы можете воспользоваться опцией -A. В будущем эта опция будет использоваться 'по умолчанию' при вызове команды git add ...

--no-all, --ignore-removal

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

Таким образом, если посмотреть на сводную таблицу, становится сразу понятно, когда какую опцию стоит использовать:

Content type -u -A -no-all
Новый файл - + +
Измененный файл + + +
Удаленный файл + + -

-N, --intent-to-add

Очень полезная в работе опция, которую на практике применяют очень мало пользователей. Суть ее сводится к тому, что вы сообщаете git о намерениях в будущем добавить новый файл под версионный контроль. Если быть честным - то git добавляет этот новый файл под версионный контроль, но с пустым контентом. Таким образом, когда вы выполняете команду git diff - вы видите изменения, которые могут быть добавлены в индекс. Если файл не отслеживается - у вас такой возможности нет.

-f, --force

Иногда бывает такая ситуация, что файл, который вы хотите добавит в индекс попадает под шаблоны игнорирования, определенные в gitignore файле. Если вы уверены, что вам необходимо добавить файл в индекс, можно либо отредактировать файл gitignore, или воcпользоваться опцией -f.

Следующие опции:

  • -n, --dry-run
  • -v, --verbose
  • --refresh
  • --ignore-errors
  • --ignore-missing

Я не буду рассматривать в рамках этой лекции. В повседневной работе они вам не пригодятся, если вы не пишете скрипты с использованием git.

А про

  • git add -p ...
  • git add -i ...
  • git add -e ...

мы поговорим в отдельной лекции.

Последнее, что хотелось бы сказать - всегда контролируйте то, что вы добавляете в репозиторий :)

На этом мы закончим этот урок. Спасибо за внимание!


Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты.

Ошибки, сложный материал, вопросы >
Нашли опечатку или неточность?

Выделите текст, нажмите ctrl + enter и отправьте его нам. В течение нескольких дней мы исправим ошибку или улучшим формулировку.

Что-то не получается или материал кажется сложным?

Загляните в раздел «Обсуждение»:

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

Об обучении на Хекслете

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно.

  • 130 курсов, 2000+ часов теории
  • 900 практических заданий в браузере
  • 360 000 студентов
Даю согласие на обработку персональных данных, соглашаюсь с «Политикой конфиденциальности» и «Условиями оказания услуг»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff

Используйте Хекслет по максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Даю согласие на обработку персональных данных, соглашаюсь с «Политикой конфиденциальности» и «Условиями оказания услуг»