Папка «финал_2_точно»
Почти каждый, кто писал код или длинный документ, видел такую папку: «проект», «проект_новый», «проект_финал», «проект_финал_2_точно». Через неделю никто не помнит, чем они отличаются, какая из них рабочая и что было сломано в той, которую удалили.
Система контроля версий решает ровно эту задачу — только аккуратно и автоматически. Она даёт четыре вещи:
- историю — каждое сохранённое состояние проекта, по порядку, с датой и автором;
- откат — вернуть файл или весь проект к любому прошлому состоянию;
- параллельную работу — несколько человек меняют один проект и не затирают друг друга;
- ответ на вопрос «зачем» — к каждому изменению приложено сообщение, почему его сделали.
Самая распространённая система контроля версий — Git. Ею пользуются почти все команды разработки, от двух человек до тысяч. Код открытых проектов, сайты, документация, конфигурации серверов — всё это обычно живёт в Git.
В этом курсе мы разберём Git так, чтобы его команды перестали быть заклинаниями. Команд немного, и за каждой стоит простая идея. Когда идея понятна, команду легко вспомнить, а главное — легко понять, что пошло не так.
Коммит — снимок проекта
Как Git хранит историю? Главное слово — коммит. Коммит — это снимок всего проекта в момент, когда вы решили его сохранить. Не список изменённых строк, а именно снимок: как выглядели все файлы.
К каждому снимку Git прикладывает:
- автора и дату;
- сообщение — что и зачем изменено, его пишете вы;
- ссылку на предыдущий коммит — так снимки выстраиваются в цепочку;
- идентификатор — длинную строку из цифр и букв вроде
3f9a1c2…, по которой коммит можно найти. Обычно хватает первых семи знаков.
Цепочка коммитов и есть история проекта. Её можно посмотреть одной командой:
git log --oneline
d41e7b0 Добавить форму обратной связи
c92f3a1 Исправить опечатку в заголовке
b5e0d44 Сверстать страницу «О нас»
a17c9e2 Начальная версия сайта
Сверху — последний коммит. Отметка HEAD на схеме означает «где вы сейчас»: обычно это последний коммит текущей ветки. О ветках поговорим в пятом уроке.
Git и сервисы
Важно различать Git и сервисы для репозиториев. Их часто путают, и от этого непонятно, где что лежит.
Git — программа на вашем компьютере. Папка проекта, в которой Git ведёт историю, называется репозиторий. Вся история хранится прямо в ней, в скрытой служебной папке .git. Интернет для работы не нужен: коммиты, история, откат — всё локально.
Сервисы для репозиториев — например, GitHub или GitLab — хранят копию репозитория на сервере. Через неё участники обмениваются коммитами, там же обсуждают изменения и делают ревью. Но сам Git — у каждого свой.
Такое устройство называют распределённым: у каждого участника полная копия истории, а не только последняя версия. Если сервис недоступен, работа не останавливается — коммитить можно и так, а обменяться изменениями — позже.
Как понять, что вы внутри репозитория? Команда git status расскажет, в какой ветке вы находитесь и что изменилось. Если папка не репозиторий, Git так и скажет. Это первая команда, которую стоит набирать по привычке — к ней мы вернёмся в следующем уроке.
Три правила курса
Весь курс держится на трёх правилах. Они короткие, и почти каждая беда с Git — нарушение одного из них.
Первое: коммит — одно законченное изменение с понятным сообщением. Не «сохранил всё за день», а «исправил расчёт скидки». Такой коммит легко понять, легко проверить и легко откатить, не задев остального. Этому посвящён третий урок.
Второе: общую историю не переписывают. Git позволяет менять прошлое: переписать коммит, выбросить его, переставить. В своих, ещё не отправленных коммитах — можно. В тех, что уже ушли в общий репозиторий, — нельзя: у коллег эти коммиты уже есть, и переписанная история сломает им работу. Для отката общего есть безопасный способ — о нём в четвёртом уроке.
Третье: смотри, что отправляешь. Перед коммитом и перед отправкой — git status и git diff: какие файлы изменены и что именно в них. Так в историю не попадают случайные файлы, отладочный мусор и, что хуже всего, пароли и ключи.
Дальше курс идёт по порядку работы: как делать коммиты, как смотреть и откатывать историю, как работать в ветках, как обмениваться изменениями с командой и как проходить ревью.