Урок курса
Одна задача — один понятный коммит
Git и GitHub с нуля: бесплатный курс с практикойВ прошлом уроке мы научились читать историю: смотреть на список коммитов через git log --oneline и разворачивать содержимое любого из них через git show. Теперь эти инструменты пригодятся не для чтения чужой истории, а для контроля собственной — чтобы убедиться, что каждый коммит содержит ровно то, что должен.
Атомарный коммит: одна задача — один коммит
Коммит атомарен, если он фиксирует ровно одно логически завершённое изменение. Не один файл, не одну строку — а одну задачу. В README.md можно за раз исправить описание проекта и добавить раздел навигации: это два изменения в одном файле, но это две разные задачи, и правильно сохранить их двумя разными коммитами.
Почему это важно? Когда через неделю кто-то (или вы сами) смотрит на историю, каждый коммит должен отвечать на вопрос: «что именно изменилось и зачем?». Если в одном коммите смешаны правка описания и добавление навигации, ответить на этот вопрос нельзя без открытия diff и его разбора. Атомарный коммит делает ответ очевидным из одной строки.
Разделяйте правки, если они дают два независимых результата, которые можно отдельно понять и проверить. Например, уточнение описания и добавление навигации в этом упражнении решают разные задачи. Возможность описать один результат разными словами сама по себе не требует двух коммитов. Количество затронутых строк или файлов роли не играет. Одна строка, исправляющая опечатку в заголовке, — полноценный коммит. Десять строк, добавляющих связанный раздел, — тоже один коммит, если они решают одну задачу.
Сообщение коммита: результат, а не действие
Сообщение коммита — не дневник о том, что вы делали, а описание того, что теперь стало по-другому. Разница на практике:
Редактировал README— описывает действие; из этой строки непонятно, что именно изменилось.Уточнено описание проекта в README— описывает результат; из одной строки ясно, что именно изменилось.
Критерий проверки прост: прочитайте своё сообщение в выводе git log --oneline — не открывая diff. Если из сообщения понятно, что именно стало иначе, формулировка рабочая. Если нет — переформулируйте.
Несколько ориентиров для хорошего сообщения:
- Начинайте с глагола в прошедшем времени или с существительного, описывающего результат: «Добавлен раздел навигации», «Исправлена опечатка в заголовке».
- Не пишите «файл изменён», «обновлено» без уточнения — это шум, а не информация.
- Будьте конкретны настолько, чтобы отличить этот коммит от соседних.
Сообщение передаётся флагу -m в кавычках: git commit -m "Уточнено описание проекта в README". Именно эта строка будет видна в git log --oneline рядом с сокращённым ID коммита.
Последовательность двух независимых коммитов из одного файла
Старт упражнения. Используйте чистый учебный репозиторий git-history после подготовки из секции 2 урока 06: в нём четыре коммита — Init project, Add contacts, Add notes, Update intro; отслеживаются README.md и notes.md. Строк Описание: учебный репозиторий и ## Навигация в README.md ещё нет. Перед началом выполните git status: он должен сообщить nothing to commit, working tree clean; других подготовленных или рабочих правок нет. В этом упражнении notes.md не меняйте.
Если это упражнение уже выполнено или в репозитории есть другие незавершённые правки, подготовьте новый отдельный репозиторий по секции 2 урока 06 в новой папке с незанятым именем. Прежнюю папку и её файлы не перезаписывайте. После четырёх коммитов снова проверьте чистый git status, затем переходите к шагам ниже.
В этом упражнении первую правку коммитим до того, как вносим вторую: так проще сохранить два независимых результата отдельно. Если обе правки уже внесены в файл, один git add README.md захватит их обе — полный add неизменённого файла не разделит их.
Точный порядок действий:
- Открыть README.md в редакторе, добавить строку
Описание: учебный репозиторий, сохранить файл. git diff— убедиться, что в выводе только эта строка.git add README.mdgit diff --staged— подтвердить, что в индексе именно эта правка и ничего лишнего.git commit -m "Добавлено описание проекта в README"- Открыть README.md, добавить строку
## Навигация, сохранить файл. git add README.mdgit commit -m "Добавлен раздел навигации в README"
После шага 5 первая правка уже зафиксирована в коммите. Рабочая папка снова чистая. По выбранному порядку только после этого открываем файл и вносим вторую правку.
Ловушка одновременного внесения обеих правок. Если вы открыли файл и сразу добавили и строку с описанием, и строку с навигацией — а потом выполнили git add README.md, — в индекс попадёт текущее состояние файла целиком. Оба изменения окажутся в одном diff, и один коммит сохранит их вместе. Повторный git add без новой правки ничего не изменит: в индексе уже лежит тот же файл.
Последовательность «внести первую правку → закоммитить → внести вторую» — удобный способ избежать смешивания в этом упражнении. Это не единственная возможность получить два коммита; ограничение относится к полному add файла с двумя уже внесёнными правками без изменения его содержимого.
Проверка атомарности через git show
git show <ID> показывает diff коммита: какие строки добавлены (со знаком +) и какие удалены (со знаком -). Это тот самый инструмент, которым можно убедиться, что коммит содержит ровно одну правку — или обнаружить, что в него попало лишнее.
Порядок проверки. После создания двух коммитов запустите git log --oneline. Вывод будет примерно таким:
a3f1c2b Добавлен раздел навигации в README 7e804d1 Добавлено описание проекта в README ...
Скопируйте ID первого коммита и выполните:
git show 7e804d1
В разделе diff должна быть только одна добавленная строка — та, что с описанием:
+Описание: учебный репозиторий
Затем проверьте второй коммит:
git show a3f1c2b
Здесь должна быть только строка с навигацией:
+## Навигация
Если в diff одного коммита вы видите несвязанные фрагменты — строки из разных правок, которые логически не относятся друг к другу — это признак того, что коммит не атомарен. Один diff, одна задача — вот критерий.
git show работает с любым коммитом в истории, не только с последним. Это делает его удобным инструментом для аудита: можно взять любой старый коммит по ID из git log --oneline и проверить, что именно в нём лежит.
Задача 1
В README одновременно внесли две независимые правки: уточнили описание и добавили навигацию. Их нужно было сохранить двумя понятными коммитами. Как следовало действовать с самого начала изученными командами?
Задача 2
Письменно ответьте коллеге: почему две независимые задачи в одном README стоит разделить и как show помогает проверить результат? Приведите сообщение о результате одной правки, а не о процессе редактирования.
Платформа проверяет только ответ ниже; действия в своём репозитории и письменные ответы вы проверяете самостоятельно.
Разработчик добавляет один связанный раздел навигации из десяти строк. Для него подходят два сообщения: «Добавлен раздел навигации» и «README дополнен навигацией». Нужно ли разделить этот результат на два коммита только из-за наличия двух формулировок?
Задача 3
Практика в отдельном учебном репозитории с чистым состоянием и закоммиченным README: добавьте редактором «Описание: учебный репозиторий», проверьте diff, подготовьте файл, проверьте staged diff и закоммитьте результат. Только затем добавьте «## Навигация» и сохраните её вторым коммитом с конкретным сообщением. Получите оба ID из компактной истории и проверьте каждый через show. Запишите два ID, сообщения и строки изменений каждого коммита.
Платформа проверяет только ответ ниже; действия в своём репозитории и письменные ответы вы проверяете самостоятельно.
При проверке оказалось, что первый из двух новых коммитов добавил обе строки, а второй изменил только опечатку в строке описания. Какой вывод соответствует требованию упражнения?
Продолжить с сохранением прогресса
Перейдите к уроку в учебном кабинете.
