# Навіщо командам історія: контроль версій без страху

> Що таке система контролю версій, чим Git відрізняється від GitHub і чому роззиратися в репозиторії цілком безпечно.

- Курс: [Git і GitHub для продактів](https://productovi.com/uk/courses/git-for-product.md)
- Модуль: Git простими словами
- Урок 1/15, ~28 хв
- Джерело: https://productovi.com/uk/courses/git-for-product/why-teams-keep-history

## Де ти працюєш

**Alex Tutor:** Вітаю на курсі. Тебе щойно взяли до продуктової команди **Котокорму**: це невеликий онлайн-магазин кормів, ласощів і наповнювачів для котів, де працює близько тридцяти людей. Тут ти навчишся читати роботу команди на GitHub (історію, гілки, pull requests — запити на внесення змін, релізи) і навіть внесеш невелику зміну власноруч.

## Ціна, яку ніхто не пам'ятає, як змінили

**Alex Tutor:** Сайт магазину живе в репозиторії на GitHub. Розробники щотижня щось у ньому змінюють, і поза їхньою командою мало хто може сказати, що саме змінилося і чому. Тепер доступ є і в тебе. Як відчуття?

**Sofia:** Чесно? Трохи лячно. Здається, один неправильний клік, і весь магазин ляже.

**Alex Tutor:** Цей страх ми розберемо в цьому модулі. Але спершу реальне питання від підтримки: чому доставка тепер коштує 59 грн, а не 49? Маркетинг каже, що вони тут ні до чого. Без спільної історії це тиждень розпитувань, а з Git — пошук на дві хвилини.

## Що таке система контролю версій? Почнімо з final-v3

**Alex Tutor:** Уяви прайс у спільній папці: `prices.xlsx`, потім `prices-new.xlsx`, потім `prices-final-v3.xlsx`. Двоє редагують водночас, один затирає правки іншого, а старі цифри зникають назавжди.

![Стіл завалений майже однаковими паперовими копіями одного прайс-листа з різнокольоровими закладками; розгублена людина порівнює дві з них.](https://productovi.com/courses/git-for-product/inline/why-teams-keep-history-illustration-2.webp)

*Багато копій і жодної історії: котра справжня і хто що змінив?*

**Sofia:** Болісно знайомо. І ніхто не знає, котрий файл справжній.

**Alex Tutor:** **Система контролю версій** (version control) розв'язує саме це. Вона зберігає кожен стан проєкту окремим кроком, і кожен крок пам'ятає, хто його зробив, коли і коротку примітку, навіщо.

**Alex Tutor:** Кожен такий крок називається **коміт** (commit), а ланцюжок комітів це **історія** проєкту. Один проєкт із пам'яттю замість десяти напівкопій.

![Кіт іде стежкою й лишає сліди лап; у кожному сліді — крихітний знімок тієї самої вебсторінки в інший момент.](https://productovi.com/courses/git-for-product/inline/why-teams-keep-history-illustration-3.webp)

*Кожен коміт — один збережений крок, а весь слід із них — історія проєкту.*

> **Вправа:** Що дає команді контроль версій такого, чого не дає спільна папка з файлами?

## Git і GitHub: не одне й те саме

**Sofia:** А що таке GitHub і чим він відрізняється від Git? Люди кажуть «Git» і «GitHub» так, ніби це одне слово.

**Alex Tutor:** Вони пов'язані, але різні. **Git** це сама система контролю версій: вона записує коміти. Розробники запускають її на своїх ноутбуках і вводять у терміналі команди на кшталт `git commit`.

**Alex Tutor:** **GitHub** це сайт, який зберігає Git-проєкти й додає до них командну роботу: pull requests, рев'ю, issues, релізи. Git це двигун, а GitHub це офіс, збудований навколо нього.

![Git — система контролю версій, що записує коміти на ноутбуках розробників; GitHub — сайт навколо неї з pull requests, рев'ю, issues і релізами.](https://productovi.com/courses/git-for-product/diagrams/m1-l1-git-vs-github-uk.png)

**Sofia:** Скажи, будь ласка, що термінал мені не знадобиться.

**Alex Tutor:** Не знадобиться. Усе в цьому курсі відбувається у вебінтерфейсі GitHub, просто в браузері. Коли розробник згадає команду, я поясню, що вона означає, але вводити її тобі не доведеться.

> **Вправа:** Git і GitHub це дві назви одного й того самого інструмента.

## Що пам'ятає репозиторій

**Alex Tutor:** Проєкт разом з усією історією називається **репозиторій** (repository), коротко «репо». Наш це `catchow/website`: шаблони сторінок, тексти, зображення й конфігураційний файл із цінами.

**Alex Tutor:** Ось шматок його основної гілки, `main`. На наших схемах час іде згори донизу: найстаріший коміт угорі, найновіший унизу. Кожна точка це коміт із його повідомленням.

```text
Граф комітів, від найстарішого: Недавня історія `main` у catchow/website
1. коміт 1c2e7d0 у main "Add delivery page"
2. коміт 5b8f3a2 у main "Update cat food photos"
3. коміт 9d04e61 у main "Fix typo in footer"
4. коміт a41c09e у main "Raise delivery price to 59 UAH" (виділено)
5. коміт e7c3b19 у main "Add summer promo banner"
```

*П'ять комітів, від найстарішого. Виділений змінив ціну доставки.*

**Sofia:** Четвертий: «Raise delivery price to 59 UAH». Ось і наша загадка, розгадана за секунди!

**Alex Tutor:** Зверни увагу, що повідомлення англійською. Більшість команд пишуть їх так, хоч би якою мовою говорили в офісі. І одне застереження: власний список комітів на GitHub іде навпаки, найновіші вгорі.

> **Вправа:** Який коміт на цій схемі зроблено найпізніше?

## Хто це зробив і навіщо

**Alex Tutor:** Коміт також називає автора: Daniel, один із наших веброзробників. Він якраз у чаті, спитаймо його.

**Daniel:** Привіт! Так, це я, три тижні тому. Кур'єрська служба підняла тарифи, і фінвідділ попросив перекласти це на доставку. Усе є в повідомленні коміту і в пов'язаному pull request.

**Sofia:** Тобто відповідь увесь час лежала в репо. Нікому не треба було її пам'ятати.

**Daniel:** У цьому й суть. Я теж не пам'ятаю, що міняв минулого вівторка. Зате пам'ятає історія.

**Alex Tutor:** Подивись, що містив той коміт: саму зміну, автора, дату й час, повідомлення та унікальний ідентифікатор `a41c09e`, який називають хешем. Git записує це для кожного коміту, завжди.

> **Вправа:** Що з цього Git записує для кожного коміту? Познач усе, що підходить.

**Alex Tutor:** Daniel часто просто кидає в чат хеш замість посилання. Варто знати, що це за рядок.

> **Вправа:** Daniel пише в чат: «Зміна ціни — це `a41c09e`». Що таке `a41c09e`?

## Чому тут безпечно роззиратися

**Sofia:** Гаразд, але страх нікуди не подівся. А раптом я щось натисну, і сайт зламається?

**Alex Tutor:** Читання нічого не зламає. Відкривати файли, коміти й pull requests цілком безпечно. Сайт змінюється, лише коли хтось зливає зміну в `main`, тобто робить мердж (merge), а в Котокормі перед цим завжди буде рев'ю.

![Відвідувач, заклавши руки за спину, спокійно розглядає крихітну вебсторінку у вітрині музею; поруч сидить кіт.](https://productovi.com/courses/git-for-product/inline/why-teams-keep-history-illustration-4.webp)

*Читання файлів, комітів і pull request нічого не змінює на сайті.*

**Alex Tutor:** І навіть невдала зміна це не катастрофа. Git ніколи не викидає історію, тож команда може скасувати коміт новим комітом або повернутися до будь-якого попереднього стану. Ми потренуємося в цьому в останньому модулі.

**Daniel:** Реальна історія: якось я зламав кнопку оформлення замовлення. Виправлення: кнопка `Revert` у моєму pull request, швидке рев'ю відкату і два рядки вибачень у Slack.

**Sofia:** Це дивним чином заспокоює.

> **Вправа:** Відкриваючи файли, коміти й pull requests на GitHub, можна змінити робочий сайт Котокорму.

**Alex Tutor:** Історія Daniel про кнопку оформлення ставить слушне питання: як правильно скасувати зміну, яка вже в `main`?

> **Вправа:** Коміт у `main` зламав кнопку оформлення замовлення. Який спосіб скасування зберігає історію чесною?

## Що історія дає продуктовій команді

**Alex Tutor:** Підсумуймо, що історія дає тобі як продакту, а не лише розробникам.

**Alex Tutor:** Можна **порівняти** будь-які дві версії, знайти, **хто** змінив рядок і навіщо, **повернути** попередній стан і дати кільком людям **працювати паралельно**, не затираючи правок одне одного.

**Sofia:** У випадку з доставкою ми використали друге: знайшли, хто і навіщо.

**Alex Tutor:** Саме так. Здебільшого на GitHub ти займатимешся такою детективною роботою, а редагуватимеш значно рідше.

> **Вправа:** Зістав кожну ситуацію в Котокормі з тим, що дає команді контроль версій.

## Чотири іконки, які варто знати

**Alex Tutor:** Наостанок. На кожній сторінці репозиторію трапляються чотири об'єкти, кожен зі своєю іконкою. Запам'ятай їх зараз, вони постійно повертатимуться.

```text
Чотири об'єкти на сторінці репозиторію
- [Repository] catchow/website: Проєкт з усією його історією
- [Commit] a41c09e Raise delivery price: Один збережений крок з автором, часом і повідомленням
- [Branch] main: Лінія комітів; `main` це прийнята версія
- [Tag] v2.4.0: Постійна назва одного коміту, зазвичай версія
```

**Sofia:** Гілка й тег для мене нові. Репозиторій і коміт уже зрозумілі.

**Alex Tutor:** Гілкам буде присвячено цілий модуль. Поки що так: **гілка** (branch) це паралельна лінія роботи, а **тег** (tag) це постійна назва одного коміту, зазвичай версія на кшталт `v2.4.0`.

**Sofia:** Тобто тег це спосіб команди сказати: «ось саме цей коміт ми й випустили в реліз».

**Alex Tutor:** Саме так. А тепер спробуй упізнати всі чотири без підписів, як вони трапляються у списках і меню.

> **Вправа:** Зістав кожну пронумеровану іконку з об'єктом, який вона позначає.

## Поясни колезі

**Alex Tutor:** Найкраща перевірка розуміння: пояснити комусь іншому.

**Sofia:** Наша контент-маркетологиня тримає тексти для сайту в спільному документі з версіями на кшталт «v5-final». Дуже хочеться її переконати.

**Alex Tutor:** Тоді напиши їй два-три речення: що команда виграє, якщо тексти сайту житимуть в історії репозиторію.

**Alex Tutor:** Простими словами: без команд і без жаргону, який їй довелося б гуглити.

> **Вправа:** Напиши 2–3 речення контент-маркетологині, яка тримає тексти сайту в спільному документі («v5-final»): чому краще тримати їх в історії репозиторію сайту?

**Alex Tutor:** Наступного уроку відкриємо саму сторінку репозиторію й прочитаємо її згори донизу: файли, останній коміт, гілки й README.

**Sofia:** І дізнаємося всю історію цих 59 грн.

- Наступний урок: [Репозиторій і коміти: як читати сторінку репозиторію](https://productovi.com/uk/courses/git-for-product/reading-a-repository-page.md)

---
Productovi Learning. Безкоштовно, читати можна без реєстрації.
