Фиксация изменений

Фиксация изменений#

В этом уроке:

  • узнаем, что нужно сделать, чтобы начать фиксировать изменения;

  • познакомимся с индексом и научимся добавлять в него файлы командой git add;

  • следить за состоянием файлов рабочей копии командой git status;

  • познакомимся с командой git commit и научимся фиксировать изменения в хранилище;

  • узнаем про опции -a, -m, -v команды git commit;

  • узнаем, как оформляют сообщение коммита.

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

Для начального понимания нужно помнить, что коммит – это объект, содержимое которого можно поделить на две групппы: описание и содержание. Содержание включает изменения в файлах, а описание – информационное сообщение, дату и время фиксации, имя и электронную почта автора.

../_images/commit-structure.png

Команде git commit должна быть доступна вся эта информация для создания коммита. Начнем от простого к сложному.

Информацией о дате и времени фиксации Git снабжает ОС. Локальное системное время должно быть синхронизировано с мировым, чтобы не возникло противоречий в данных при обмене коммитами с другими хранилищами.

Имя и электронную почту автора указывают Git перед началом работы. Нами они были заданы при настройке Git.

Warning

Фиксация не произойдет, если не были указаны имя и электронная почта автора.

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

../_images/git-index.png

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

Остается последнее поле – сообщение коммита. Сообщение задается перед фиксацией двумя способами:

  • из командной строки опцией -m "сообщение";

  • в текстовом редакторе, если сообщение не указано в командной строке.

Зафиксируем изменения, вызвав команду git commit. Команда откроет текстовый файл с информационным содержимым команды git status:

# Пожалуйста, введите сообщение коммита для ваших изменений. Строки,
# начинающиеся с «#» будут проигнорированы, а пустое сообщение
# отменяет процесс коммита.
#
# Текущая ветка: main
# Изменения, которые будут включены в коммит:
#   изменено:      main.cpp
#

Как подсказывает содержимое файла, начинающие с символа # строки отбрасываются. Они показывают содержимое коммита. Полезно просмотреть содержимое коммита перед его созданием. Но вывод выше показывает только состояния файлов. Если передать команде git commit опцию -v, то в комментарий включаются также патч коммита.


# Пожалуйста, введите сообщение коммита для ваших изменений. Строки,
# начинающиеся с «#» будут проигнорированы, а пустое сообщение
# отменяет процесс коммита.
#
# Текущая ветка: main
# Изменения, которые будут включены в коммит:
#   изменено:      main.cpp
#
# ------------------------ >8 ------------------------
# Не изменяйте или удаляйте строку выше этой.
# Всё, что ниже — будет проигнорировано.
diff --git a/main.cpp b/main.cpp
index ad5fe9b..1703fca 100644
--- a/main.cpp
+++ b/main.cpp
@@ -2,6 +2,7 @@

 int main(int argc, char** argv)
 {
+    printf("Hello, World!\n");
    return 0;
 }

В первую пустую строку файла помещают сообщение коммита. Текстовый редактор удобен тем, что позволяет оформить многострочное сообщение. Если же сообщение коммита однострочное, то его быстрее передать команде опцией -m:

git commit -m "сообщение к коммиту"

Перед фиксацией измененные и неотслеживаемые файлы помещаются в индекс. Но можно поступить по-другому, попросив команду git commit добавить измененные файлы в индекс опцией -a (--all).

В больших и организованных проектах обращают особое внимание на сообщение и содержание коммитов. Сообщение должно как можно яснее и подробнее описывать проделанную работу. Поэтому сообщение разделяют на две части: заголовок и тело. Заголовок состоит из одной строки и доносит общую суть изменений. Подробности изменений помещают в тело сообщения. Тело может состоять из нескольких строк. Тело от заголовка разделяют одной пустой строкой.

Требования к коммитам прописывают в специальном документе, называемом “соглашением о коммитах”. Рекомендации об оформлении коммитов на английском языке можно найти тут. Этому документы должны следовать все участники проекта. Одно из требований гласит, что коммит должен содержать конкретное завершенное изменение, касающееся одной задачи. Это упрощает участникам изучение проекта. Из того факта, что работа над задачей завершилась, еще не следует, что все измененные файлы пригодны для фиксации. Изменения:

  • распределяют по нескольким коммитам;

  • исключают те изменения, которые попали случайно или не относятся к решенной задаче.