1. main — твой чистовик, его не ломают
Олег ставит кружку на край стола, придвигает стул — видно, тема ему в радость, родная.
— Смотри, — начинает он. — Контроль версий, git этот твой, — это не страшный набор команд. Это система, у которой одна задача: чтобы ты мог вернуться назад. Всё, что я сейчас расскажу, — про это одно. Про обратимость. Запомни четыре слова, и вся картина у тебя в голове сложится. Мы, старики, на этом полжизни просидели — так что слушай носителя.
— Давай, дядь Олег.
— Первое слово — main. Главная линия проекта. Это твоё настоящее рабочее состояние — то, что работает и что ты показываешь людям. Твой портал, который ты сегодня пожалел. Главное правило про main одно: его нельзя ломать. Это чистовик, который ты сдаёшь.
Олег подбирает образ из своего:
— Помнишь мой диплом? Была у меня чистовая версия — та, что несёшь на защиту. В ней не экспериментируют, не пробуют «а вдруг так лучше». Её берегут как зеницу ока. Вот main — это твой чистовик. Оригинал проекта, который уходит заказчику.
Тёма кивает. С порталом сходится один в один: вот он, рабочий, его трогать страшно. Это и есть main.
2. Ветка — песочница, где можно ломать
— Стоп, — Тёма сразу ловит противоречие. — Если main ломать нельзя, а мне в reward-flow лезть надо — то где? Я же не могу не трогать рабочее, если задача как раз в рабочем.
— А вот тут второе слово — ветка. — Олег явно ждал вопроса. — Ветка — это изолированная копия-песочница под конкретную задачу. Заводишь ветку и работаешь в ней как хочешь — ломай, пробуй, переписывай. А main всё это время стоит в стороне, нетронутый, и ждёт.
Он возвращается к диплому:
— Хочешь переписать главу по-новому, а вдруг выйдет хуже? Что делает умный человек? Берёт черновую копию и в ней экспериментирует. Чистовик не трогает. Вышло хорошо — перенёс правку в чистовик. Вышло плохо — выкинул черновик к чертям, и всё, чистовик как стоял, так и стоит. Ни царапины.
И тут Тёма сам узнаёт в этом ответ на недавний вопрос Лёхи:
— Так это же мой «провал выбрасываю целиком»! Заход не дочищаю — просто выкидываю черновую ветку вместе со всем мусором, а main даже не заметил, что я там что-то пробовал.
— Сам дошёл, салага. — Олег усмехается. — Вот это и есть защита. Провальный заход выбрасывается вместе с веткой, а main остаётся чистым. Можешь дать своему электронному наворотить в ветке любую дичь — рабочее это не заденет.
3. Коммит — честная точка возврата на диске
— Хорошо, ветка, — кивает Тёма. — А вот эта «точка возврата», к которой я падаю, — это что конкретно?
— Третье слово — коммит. — Олег не торопится. — Пока работаешь в ветке, ты время от времени фиксируешь состояние — ставишь коммит. Коммит — это честная точка возврата, записанная в историю проекта. К любому коммиту потом можно вернуться.
— Это как /rewind? Тоже откат?
— А вот тут не путай, это важно. — Олег поднимает палец. — Твой /rewind живёт в памяти разговора с агентом. Кончилась сессия — отматывать нечего, разговор забыт. А коммит живёт на диске, в истории проекта. Навсегда. Сессия кончилась, ноут уснул, агент всё забыл — а коммит лежит на месте и ждёт. Потому он и надёжнее любой кнопки отмены. Твоя-то ночь на чём накрылась? Кнопка не дотянулась, потому что правки были на диске. А коммит — он сам на диске и есть.
Тёма медленно кивает. Вот оно. Та строка из ночного лога — «ни одной точки возврата» — перестаёт быть технической мелочью прямо на глазах. За всю ночь агент ни разу не поставил коммит. Ни одной честной отметки «тут ещё было цело» на диске. Поэтому и падать было некуда — позади ни одной точки.
— Как на чертежах штамп с датой, — подкидывает Олег образ из своего. — «Ревизия три, всё сходится». Лежит в истории проекта, и ты в любой момент к ней вернёшься. Вот это и есть коммит.
4. Откат и дифф — собираем модель целиком
— И последнее слово — откат. — Олег сводит концы. — Если в ветке всё поехало, ты возвращаешь её к последней чистой точке — к хорошему коммиту — одной операцией. Всё лишнее, что наворочено после неё, стирается. Запорол черновик правками — откатил к последнему хорошему сохранению, продолжаешь оттуда.
— То есть «сломал — откатил — как не было», — Тёма формулирует сам. — Не «сломал — два часа разгребаю руками».
— Именно. И рядом с откатом — ещё одно слово, без которого вся защита дырявая: дифф. Просмотр изменений. Откат спасает уже после того, как агент наворотил. А дифф работает раньше — до того, как ты принял правку. Прежде чем впустить изменения в проект, ты смотришь, что именно меняется: что добавлено, что убрано. Это фильтр между «агент предложил» и «попало в код». Тот самый твой «гляну сперва, что наменял», который ты в бланк записал. Откат — сетка снизу, дифф — фильтр на входе; нужны оба.
Олег чертит пальцем по столу, будто рисует:
main ●────●────● ← ценная рабочая линия (бережём)
└── fix-reward ●──● ← ветка-песочница (эксперименты)
коммиты = точки возврата
← откат вернёт ветку к чистой точке
— Вот и вся модель. main живёт своей чистой жизнью. Под ним — ветка, где ты пробуешь. В ветке — коммиты-точки. Что-то пошло не так — откат к точке, main даже не вздрогнул.
Тёма смотрит на воображаемую схему и подводит итог сам:
— Слушай, так это же мой зоопарк папок, только по-человечески. портал, портал2, портал-финал2 — это я руками пытался делать вот эти самые точки возврата. Только криво: какая из папок настоящая, через день уже не помнишь.
— Вот! — Олег аж оживляется. — Те папки — это была твоя самодельная, дырявая история состояний. Ровно мой диплом с финал_испр2. git делает то же самое, только честно и в одном месте. Никаких финал-точно-3. Одна линия, на ней отмеченные точки, и всегда ясно, где ты и куда откатиться.
— А команды? — Тёма тянется за блокнотом. — Их же, наверное, куча. Показывай, записывать буду.
— О, команды — это отдельный разговор, — Олег хрустит пальцами. — Это ты правильно, что за ручку взялся. Сейчас покажу, как оно делается по-настоящему, руками. Как меня учили.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ