Освоение Git: Индексация и коммиты — ваши первые изменения

Узнайте, как работают индексация и коммиты в Git, включая git add, частичное индексирование, просмотр проиндексированных изменений и написание осмысленных сообщений к коммитам.

Освоение Git: Индексация и коммиты — ваши первые изменения

Освоение основ индексации и коммитов в Git — первый реальный шаг к уверенному использованию Git. Индексация позволяет выбрать именно то, что войдёт в следующий снимок, а коммит фиксирует этот снимок с сообщением, понятным будущим читателям.

Если относиться к каждому коммиту как к небольшой, проверяемой единице работы, Git становится гораздо проще в использовании. Вы сможете просматривать изменения, разделять несвязанные правки и исправлять ошибки без паники.

Как работает область индексации

Git не фиксирует автоматически каждый изменённый файл. Он разделяет вашу работу на рабочее дерево, область индексации и историю коммитов.

Рабочее дерево — это папка вашего проекта. Это файлы, которые вы редактируете в редакторе.

Область индексации — это контрольный список Git для следующего коммита. Когда вы выполняете git add, вы ещё не сохраняете историю. Вы выбираете изменения для следующего коммита.

История репозитория — это последовательность уже записанных коммитов.

Начните с проверки статуса:

git status

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

Чтобы проиндексировать новый или изменённый файл:

git add README.md

Чтобы проиндексировать все изменения в текущем каталоге:

git add .

Эта команда удобна, но используйте её осторожно. Она может проиндексировать несвязанные файлы, локальные конфигурации или сгенерированные выходные данные, если ваш .gitignore неполон.

Для более безопасной проверки сначала просмотрите различия:

git diff

Затем индексируйте только то, что должно быть вместе:

git add src/app.js
git add README.md

После индексации проверьте, что будет закоммичено:

git diff --staged

Это покажет точный проиндексированный снимок. Если что-то выглядит неправильно, исправьте это до коммита.

Создание первого коммита

Когда нужные изменения проиндексированы, создайте коммит:

git commit -m "Добавить README проекта"

Сообщение должно описывать изменение, а не действие, которое вы выполнили. "Добавить README проекта" полезнее, чем "изменения" или "обновить файлы".

Хороший коммит обычно имеет одну чёткую цель. Например, предположим, вы обновляете скрипт развёртывания и исправляете опечатку на странице документации. Это разные изменения. Индексируйте и коммитьте их отдельно:

git add scripts/deploy.sh
git commit -m "Добавить проверку работоспособности развёртывания"

git add docs/setup.md
git commit -m "Исправить опечатку в руководстве по настройке"

Это упрощает проверку. Это также упрощает откат, если изменение развёртывания вызывает проблему, а исправление документации в порядке.

Если вы выполните git commit без -m, Git откроет ваш редактор. Это полезно, когда нужно более длинное сообщение:

Добавить проверку работоспособности развёртывания

Проверять конечную точку сервиса перед отметкой развёртывания как завершённого.
Это помогает выявлять неудачные запуски на ранних этапах процесса релиза.

Первая строка должна быть короткой и прямой. Тело может объяснять, почему изменение было необходимо, или упоминать компромиссы.

Чтобы увидеть последние коммиты:

git log --oneline -5

Это даёт компактный обзор последней истории.

Индексация частей файла

Иногда один файл содержит несколько несвязанных правок. Git может проиндексировать только часть файла с помощью режима патча:

git add -p src/config.js

Git показывает каждый блок изменений и спрашивает, что делать. Распространённые варианты:

  • y: проиндексировать этот блок.
  • n: не индексировать этот блок.
  • s: разделить блок на более мелкие части, если возможно.
  • q: выйти из режима патча.

Частичная индексация полезна, когда вы очищаете изменения перед коммитом. Например, у вас может быть файл, в котором вы добавили новый параметр тайм-аута и переформатировали комментарий. Проиндексируйте изменение тайм-аута для одного коммита, а затем проиндексируйте очистку комментария для другого.

Если вы случайно что-то проиндексировали, отмените индексацию без потери работы:

git restore --staged src/config.js

Ваш файл остаётся изменённым в рабочем дереве. Он просто удаляется из области индексации.

Если вы хотите отменить неиндексированные изменения в файле, будьте осторожны:

git restore src/config.js

Эта команда отбрасывает локальные правки в этом файле. Сначала выполните git diff, чтобы знать, что вы теряете.

Дополнительные сценарии восстановления см. в как отменить ошибки Git.

Гигиена коммитов для повседневной работы

Небольшие, целенаправленные коммиты легче проверять, тестировать и откатывать. Они также делают такие инструменты, как git bisect, более полезными, когда нужно найти, где началась ошибка.

Используйте эти привычки:

  • Выполняйте git status перед индексацией.
  • Просматривайте git diff перед git add.
  • Просматривайте git diff --staged перед коммитом.
  • Храните несвязанные изменения в отдельных коммитах.
  • Пишите сообщения, объясняющие, что изменилось.
  • Избегайте коммитов сгенерированных файлов, если проект не ожидает их.
  • Никогда не коммитьте секреты, приватные ключи или локальные значения .env.

Практический рабочий процесс может выглядеть так:

git status
git diff
git add src/server.js
git diff --staged
git commit -m "Обработка отсутствующего ответа проверки работоспособности"
git status

Эта последовательность не блестящая, но она ловит большинство ошибок новичков. Вы знаете, что изменилось, что проиндексировано, что закоммичено и что осталось.

Если ваша команда использует pre-commit хуки или автоматическое форматирование, коммит может завершиться ошибкой, пока вы не исправите форматирование или тесты. Прочитайте сообщение об ошибке, выполните предложенную команду, проиндексируйте полученные изменения и сделайте коммит снова.

Когда обращаться за помощью

Обращайтесь за помощью, если вы случайно проиндексировали или закоммитили секреты, если вы закоммитили в неправильную ветку или если вы не уверены, нужно ли изменять, откатывать, сбрасывать или создавать новый коммит. Эти варианты имеют разные последствия, особенно после отправки.

Вам также следует спросить перед переписыванием коммитов, которые могли быть получены другими людьми. Простая локальная очистка может превратиться в проблему для команды, если она изменит общую историю.

Индексация и коммиты — это основной цикл Git. Просматривайте свои изменения, индексируйте осознанно, коммитьте целенаправленными частями и пишите сообщения, которые будут иметь смысл через месяц.