Зачем нужен контроль версий
Прежде чем мы установим Git и разберём, как он устроен внутри, ответим на простой вопрос: зачем он вообще нужен? Если вы хоть раз теряли важный файл или путались в его копиях — у вас уже есть интуитивный ответ. Этот урок превращает интуицию в понимание. Никакой истории, никаких хешей и серверов — только знакомая боль и то, как контроль версий её снимает.
Боль первая: «я перезаписал нужную версию»
Представьте, что вы пишете отчёт или скрипт. Вчера всё работало. Сегодня вы решили «улучшить», поменяли половину текста — и стало хуже. Хотите вернуть вчерашний вариант, а его больше нет: вы сохранили файл поверх старого. Кнопка «Отменить» в редакторе помогает, пока редактор открыт, но стоит его закрыть — и вся история отмен исчезает.
Знакомо? Это происходит постоянно: со студентами, дипломниками, аналитиками, инженерами. Файл — это всегда только его последнее состояние. Прошлого у файла нет, если вы сами его не сохранили.
Интуитивное решение приходит само собой: делать копии. И тут начинается боль вторая.
Боль вторая: папка «финальная_версия_2_финал»
Чтобы не потерять рабочий вариант, вы начинаете копировать файл перед каждым крупным изменением. Через неделю в папке лежит вот это:
ls -1
otchet.docx
otchet_pravki.docx
otchet_final.docx
otchet_final_2.docx
otchet_final_2_FINAL.docx
otchet_final_pravki_ot_borisa.docx
otchet_final_ispravleno_ne_trogat.docx
Вопросы, на которые теперь нет ответа:
- Какой файл свежее:
final_2илиfinal_pravki_ot_borisa? - Что именно изменилось между
finalиfinal_2? Один абзац или половина текста? - Почему вообще появился
final_2? Что я в нём правил? - Можно ли удалить
pravki, или там что-то важное, чего нет в остальных?
Имя файла пытается хранить две вещи сразу: какая это версия и что в ней нового. Но имя — это просто строка. Оно не помнит дату, не помнит причину изменения, не умеет показать разницу между двумя копиями. Чем больше копий, тем хуже: вы тратите время не на работу, а на археологию собственной папки.
note Та же беда поджидает в коде. Скрипт
load_data.py, потомload_data_v2.py, потомload_data_v2_rabochiy.py, потомload_data_NE_UDALYAT.py. Через месяц никто, включая автора, не помнит, какой из них запускать в продакшене.
Боль третья: «а что вообще изменилось?»
Допустим, копии вы аккуратно подписали датами: otchet_2026-05-20.docx, otchet_2026-05-27.docx. Уже лучше — хотя бы видно, что свежее. Но остаётся главный вопрос: что именно изменилось между двумя датами?
Чтобы это узнать, придётся открыть оба файла рядом и глазами искать различия. На двух страницах — терпимо. На тридцати — невозможно. А ведь часто нужно ровно одно: понять, какие три строки я поменял вчера, чтобы откатить именно их, не трогая остального.
Боль четвёртая: работа вдвоём
Теперь добавьте коллегу. Вы оба правите один отчёт. Вы отправляете ему файл по почте, он вносит правки, присылает обратно. Параллельно вы тоже что-то меняли в своей копии. Теперь у вас две разошедшиеся версии, и нужно вручную перенести его правки к себе или наоборот. Кто-то обязательно сотрёт чужую работу. Это та же боль перезаписи, только теперь страдает не только ваше время, но и отношения в команде.
Что такое контроль версий
Контроль версий (version control) — это инструмент, который берёт на себя всю эту возню. Идея простая: вы продолжаете работать с одним файлом, а инструмент сам запоминает каждое его состояние, которое вы попросили сохранить.
Вот что вы получаете взамен папки с копиями:
- Одна папка, один файл. Никаких
_final_2_FINAL. Версии хранятся не как отдельные файлы, а как точки во времени внутри инструмента. - Каждая сохранённая версия подписана. Не «final_2», а «исправил опечатки в выводах» — короткое сообщение от вас, зачем эта версия появилась. Плюс автоматически: дата, время, автор.
- Возврат к любой прошлой версии за секунду. Захотели вчерашний вариант — взяли вчерашний. Прошлое никуда не девается.
- Разница видна автоматически. Инструмент сам покажет, какие строки добавлены, какие удалены между двумя версиями. Глазами искать не надо.
- Двое могут работать вместе. Инструмент умеет аккуратно объединять правки двух людей и предупреждает, если они тронули одно и то же место.
То, что вы сейчас прочитали, и есть весь смысл Git. Git — это конкретная программа для контроля версий, самая популярная в мире. Слово «коммит» (commit), которое вы наверняка слышали, — это и есть одна сохранённая, подписанная версия. Вместо otchet_final_2.docx вы делаете коммит с сообщением «добавил раздел про выручку» — и эта версия навсегда остаётся в истории, помеченная датой и автором.
tip Запомните ощущение: контроль версий — это «бесконечная кнопка отмены», которая переживает закрытие редактора, перезагрузку компьютера и даже передачу проекта другому человеку. Всё, что вы коммитите, можно вернуть.
Попробуй сам
Установка Git и первый коммит — в следующих уроках. А пока сделайте упражнение без всякого Git, чтобы почувствовать проблему руками. Откройте терминал и создайте «ручную» историю версий по-старому:
mkdir -p ~/git-sandbox/lesson-01-pain
cd ~/git-sandbox/lesson-01-pain
echo "Отчёт. Выручка выросла." > otchet.txt
cp otchet.txt otchet_final.txt
echo "Отчёт. Выручка выросла на 12%." > otchet_final.txt
cp otchet_final.txt otchet_final_2.txt
ls -1
Ожидаемый вывод:
otchet.txt
otchet_final.txt
otchet_final_2.txt
А теперь честно ответьте себе на два вопроса, глядя только на имена файлов:
- Чем
otchet_final_2.txtотличается отotchet_final.txt? - Какой из трёх файлов нужно отправить заказчику?
По именам это понять нельзя — придётся открывать и сравнивать. Именно эту боль мы и уберём. В следующем уроке вы сделаете ровно то же самое, но через Git: один файл, подписанные версии, мгновенная разница.