JavaRush /Курси /Claude Code SELF /Сейф для проєкту: git

Сейф для проєкту: git

Claude Code SELF
Рівень 13 , Лекція 3
Відкрита

1. Команди git зубрити не потрібно

— Льохо, — Тьома махає блокнотом. — Дід мені тут вісім команд надиктував, із прапорцями. Каже: напамʼять. Я це в житті не запамʼятаю — git reset --hard, git checkout -b, де який прапорець… У мене від одного вигляду голова пухне.

— А давай подивимося, хто їх узагалі має вводити, — Льоха хмикає, уперше за день майже весело. — Дід правий щодо моделі — золото тобі дав. А ось щодо «напамʼять» — це він із власної молодості, тоді інакше було не можна. Тобі заучувати не треба. Відкрий агента й попроси словами: «заведи для проєкту сейф». Просто словами, не командою — проханням.

Тьома пробує. Пише в чат людське «заведи в проєкті git, щоб можна було відкотитися». І агент сам, у терміналі, виконує рівно те, що Олег набирав руками:

● git init
  Ініціалізовано порожній Git-репозиторій у /portal/.git/

— Ось і все, сейф створено, — каже Льоха. — Та сама команда, яку дід набирав пальцями. Тільки він — із голови, а ти — словами. Зверни увагу: git init набрав агент, не ти. Ти сказав, чого хочеш, — він перевів це в команду.

Тьома коситься на рядок у терміналі:

— Тобто весь блокнот діда я можу… не вчити?

— Не будеш. — Льоха хитає головою. — Усі ці команди виконує сам ШІ-агент через термінал. Жодних окремих «git-кнопок» у Claude Code немає: git для нього — звичайний інструмент, як і все, чим він у тебе в терміналі орудує. Тобі треба знати модель — main, гілка, точка, відкат, — а перевести її в команди попросиш словами. Дідів синтаксис із прапорцями — його турбота, не твоя.

Тьома помітно видихає. Найстрашніше — що доведеться заучувати блокнот із прапорцями — відпало.

— Але модель діда тримай міцно, — додає Льоха. — Прохання словами працює лише тоді, коли ти розумієш, ЩО просиш. Скажеш туманно — агент і набере туманно. Дід тобі дав розуміння, я даю зручність. Разом — сила.

Сейф створено, перша точка (робочий портал до правок) уже стоїть — Олег її поставив, поки показував команди. Тьома її перевіряти не поліз, повірив дідові.

2. Бойовий прохід: гілка → правка → відкат, main неушкоджений

— Ну а тепер, — підганяє Льоха, — захистимо твою правку reward-flow по-дорослому, крок за кроком. Усе, що ти дописав у бланку, зараз стане справжніми діями. І зверни увагу на різницю з дідом: він команди набирав сам, а ти говориш словами, а команду під капотом виконує агент.

Крок 1. Ізолюємо роботу в гілці — щоб main залишився недоторканим. Тьома пише агенту словами:

Перед завданням створи гілку fix-reward і працюй у ній, main не чіпай.

Агент перекладає прохання в команду і виконує:

● git checkout -b fix-reward
  Перемкнуто на нову гілку 'fix-reward'

— Усе, — коментує Льоха. — Термінал так і написав: «перемкнуто на нову гілку fix-reward». Тепер агент порається в ній. Що б він там не накоїв — твій робочий main стоїть осторонь і навіть не в курсі.

Крок 2. Даємо правку — і дивимося, що агент змінив, ДО прийняття/коміту. Агент наробив змін у reward-flow. Але перш ніж сказати «прийнято», Тьома відкриває перегляд змін:

/diff

На екрані — построкова картина правки. Зеленим позначено те, що агент додав, червоним — те, що прибрав:

  reward-flow.js
+   const reward = base * multiplier;    // рядки, які агент додав
-   const reward = base;
  leaderboard.js
+   sortByScore(players);                // ← а це вже зайве

Тьома вдивляється — і насуплюється.

— Слухай, а чого він тут… він же не тільки нарахування зачепив. Оце, у leaderboard.js, — воно звідки? Я про лідерборд ані слова не казав.

— Ось для цього і дивляться, — киває Льоха. — Прохід вийшов кривий: агент зачепив сусідню ділянку. Добре, що глянув ДО, а не прийняв наосліп. До речі, ці самі правки видно і прямо у відкритому файлі в редакторі — там, де агент змінював, рядки підсвічені так само. Диф і файл показують одне й те саме, дивіться де зручніше.

Крок 3. Відкочуємо гілку до чистої точки — криве зникає. Тьома не лізе вичищати leaderboard.js руками. Раз прохід кривий — просить скинути гілку цілком:

Скинь гілку до останньої зафіксованої точки, почнемо заново.

Агент перекладає це в команду відкату:

● git reset --hard HEAD
  HEAD тепер на a1b2c3d робочий портал до правок

Термінал підтвердив: гілка повернулася до тієї самої точки, яку ви зафіксували на початку. Увесь кривий прохід — і правильне нарахування, і зайвий хвіст у лідерборді — стерто разом, ніби нічого й не було.

Крок 4. Чистовий прохід — і фіксуємо точку повернення. Тепер Тьома дає правку заново, уже з жорсткішим ТЗ («чіпати тільки нарахування, сусіднього не торкатися»). Цього разу /diff показує лише reward-flow.js, нічого зайвого. Тьома приймає зміни й просить зафіксувати точку:

Зафіксуй правку: нарахування в reward-flow.
● git commit -m "fix: нарахування в reward-flow"
  [fix-reward e4f5g6h] fix: нарахування в reward-flow

— І зверни увагу на головне, — Льоха підбиває підсумок. — Увесь цей час твій main був недоторканим. Ти зламав у гілці, відкотив гілку, переробив, поставив точку — і робочий портал жодного разу не постраждав. Ось воно, «зламав → відкотив → ніби й не було». Тільки тепер не на рівні розмови, а на рівні самого репозиторію. Глибше. Надійніше.

3. Ті самі команди простими словами

— Погоди, — Тьома гортає назад термінал. — Я дивлюся, за весь прохід я сам не набрав ані однієї команди з блокнота. Я говорив словами, а checkout та reset зʼявлялися самі.

— Оце і є головна навичка роботи зі ШІ, — Льоха пожвавлюється. — Не команди. Як попросити. У діда в блокноті — ліва колонка в твоїй голові: main, гілка, точка, відкат. А праву колонку, синтаксис із прапорцями, тепер тримає агент. Давай я перепишу дідовий блокнот на людську мову — щоб у тебе був під рукою.

Він загинає пальці — на кожну дію та сама команда, яку Олег набирав руками, тільки тепер це просто прохання словами:

  • Завести сейф (один раз на проєкт): «заведи в проєкті git» → агент робить git init.
  • Зафіксувати точку повернення: «зафіксуй поточний стан» або «збережи точку, тут усе працює» → агент робить git commit.
  • Винести роботу в окрему гілку: «створи гілку під цю правку, main не чіпай» → агент робить git checkout -b.
  • Подивитися, що змінилося, до прийняття: тут навіть простіше — у Claude Code своя команда /diff, набереш сам. Це той самий дідовий git diff, тільки під рукою в сесії, інтерактивний.
  • Відкотити кривий прохід цілком: «скинь гілку до останньої зафіксованої точки» → агент робить git reset --hard.

— Зверни увагу на закономірність, — каже Льоха. — Ліворуч — те, що ви хочете за моделлю. Праворуч — команда, яку не треба знати напамʼять. Ваша половина — ліва. Ви формулюєте намір, а переклад у синтаксис бере на себе агент. Чим точніше ви скажете, чого хочете, тим менше він наплутає.

— Тобто якщо я скажу туманно — він і зробить туманно, — ловить Тьома.

— Саме так. «Слухай, ну зроби там із гілками нормально»погане прохання, агент здогадується навмання. «Створи гілку fix-reward, працюй лише в ній»добре, тут гадати нічого. Той самий навик, що ти відпрацьовував із ТЗ: сказав чітко — отримав чіткий результат.

4. Навіщо саме диф, якщо main і так захищений

— А ось цей диф, — Тьома не вгамовується. — Я ж тепер у гілці, main захищений. Може, і дивитися не треба? Накосячить — відкотю, і все.

— Можна і так, — Льоха не сперечається одразу. — Але дивись, у чому різниця. Відкат — це вже після того, як накосячив. А диф — це до того, як ви прийняли. Це ваш перший барʼєр між «агент запропонував» і «потрапило в проєкт». Звичка проста: перш ніж сказати «ок, приймаю», гляньте, що саме він змінив. Що додав, що прибрав.

Він трохи тисне:

— Ти сам щойно в бойовому проході спіткнувся на тому, що агент торкнувся зайвого. Якби ти прийняв наосліп — це зайве поїхало б у гілку, потім, може, і в main. А ти глянув диф — і зловив. Відкат рятує від записаного. А диф ловить ще до запису. Це різні моменти.

— Тобто це мене відучує кивати «роби» не дивлячись.

— Саме так. І дивитися — це не «пробігти очима для галочки». — Льоха повертається до того дифу. — Диф показує вам рівно дві речі: що агент додав і що прибрав. Зелене і червоне, рядок за рядком. Ваше завдання на цьому етапі — не оцінювати, чи добрий код (це справа Сани), а лише звірити: усе, що він зачепив, — із вашої задачі? Ви просили полагодити нарахування. Отже, у дифі має бути лише нарахування. Зʼявилося ще щось, з іншого файла, з іншої зони, — ось і дзвіночок.

— Як із тим лідербордом, — киває Тьома. — Я про нього не просив, а він у дифі сплив.

— Точно. Ви не розбиралися, чи правильно агент відсортував лідерборд. Ви просто побачили: цього в задачі не було — і вже насторожилися. Ось і весь навик на сьогодні. Не «оцінити якість кожного рядка», а «звірити список зміненого зі списком того, що просили». Одне коротке порівняння перед кожним прийняттям.

Він робить акцент:

— Поки — тільки це: подивитися, що змінюється, і зловити чуже. Глибокий розбір — «а це зайве, а це небезпечне, а це агент тихцем переписав» — буде пізніше, окремо. Зараз базовий рефлекс простий: не приймайте код, не подивившись, чи він із вашої задачі.

5. Чому /rewind не врятував тієї ночі

Тьома відкидається і нарешті ставить запитання, яке мучило його від ранку:

— Слухай, то чому та ніч зламалася? У мене ж був /rewind. Я в нього вдарив — а він не врятував. Тепер у мене git. А в чому різниця між ними? Це ж обидва «відкат».

— Хороше запитання, давно пора. — Льоха розкладає на пальцях. — У вас тепер три різні страхувальні сітки, і вони не дублюють одна одну. Вони працюють у різні моменти й на різних поверхах. Не змішуйте.

— Перша — диф. Ловить помилку до того, як код увійшов у проєкт. Барʼєр на вході.

— Друга — /rewind. Відкочує усередині сесії, просто в живій розмові. Поки ви тут балакаєте з агентом, він відмотує назад правки поточного проходу.

— Третя — git. Повертає вже записане на диск. Гілка, коміт — найглибший поверх. Працює, навіть коли розмова закінчилася і агент узагалі нічого не памʼятає.

Він зупиняється на головному:

— А тепер дивіться, що було тієї ночі. Сесія відпрацювала, ноут заснув, розмова закрилася. Правки давно лягли на диск. І ви бʼєте по /rewind — по сітці, яка живе в сесії. А сесії вже немає, відмотувати нічого. Кнопка не дотягнулася до диска не тому, що погана. Вона просто з іншого поверху. Вона ніколи й не мала тягнути назад увесь репозиторій — для цього є git, нижній поверх. А git тієї ночі у вас не був побудований.

Тьома мовчить. Рятувальне коло з діркою на третьому рівні стає на місце остаточно. Діра — це не поломка кола. Просто коло не може зробити роботу якоря. Різні речі, різні поверхи.

— Тобто мені потрібні всі три, — повільно каже він. — Не одна. Диф — на вході, rewind — у розмові, git — на диску.

— Усі три. Кожна на своєму поверсі. Тієї ночі у вас був лише середній, а провалилися ви на нижньому, де було порожньо.

6. Чесна примітка, щоб не було сюрпризів

— І одна чесна дрібниця наприкінці, — Льоха не дає піти в казку. — Про безпеку відкату. git reset --hard — команда з характером: зносить незафіксоване без запиту. І знайте одразу: чарівного «git-запобіжника», який сам спіймає вас за руку саме на ній, у Claude Code немає — не сподівайтеся на нього. Тримає вас інше, те, що ви вже знаєте: звичайне перепитування перед дією агента. Перш ніж виконати в терміналі щось руйнівне, агент у звичайному режимі питає дозвіл — точно так само, як на правки файлів. Оце перепитування і є ваша страховка: побачили git reset --hard у запиті на підтвердження — пригальмуйте на секунду і подумайте, чи справді скидаєте те, що не шкода. Окремої git-няні зверху немає, є ви і ваше «дозволяю».

— І останнє. Назви команд і точний вигляд екрана з часом можуть трохи змінюватися. Дід їх двадцять років тому заучував — і половина відтоді трохи інакше пишеться. Тому вам важливіше тримати модель — ізоляцію в гілці, точку повернення, відкат, — а не конкретні кнопки. Модель не застаріє, а синтаксис нехай агент підставляє свіжий.

Тьома підсумовує сам:

— Коротше. Сейф — це git. Гілка, щоб агент порався осторонь від робочого. Диф, щоб глянути до прийняття. Коміт — чесна точка на диску. Відкат — повернути гілку до точки, ніби й не було. І все це робить агент, я тільки кажу словами. Три сітки на трьох поверхах, потрібні всі.

— Ось тепер, — підсумовує Льоха, — можна пускати агента в reward-flow по-справжньому. Сейф зібрано.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ