Angular IDPStrong Junior
Модулі / Процес: Git, PR, CI / Конфлікти й історія
🔥 0

Модуль 9 · урок 7 з 9

Конфлікти й історія

Конфлікт — це не поломка, а питання: двоє змінили той самий рядок, і Git не знає, чия версія правильна. Він чесно каже про це й чекає рішення. Страшно виглядає лише перший раз.

Як він виглядає

<<<<<<< HEAD
  readonly pageSize = 25;
=======
  readonly pageSize = 50;
>>>>>>> feature/12-status-filter

Угорі — версія з гілки, на яку ти вливаєш (зазвичай main). Унизу — твоя. Треба лишити правильний варіант і прибрати всі три маркери. Забутий >>>>>>> у коді — класика, яка потім падає з незрозумілою синтаксичною помилкою.

git status                 # покаже, які файли в конфлікті
# … правиш файли руками …
git add src/app/config.ts  # позначаєш вирішеним
git rebase --continue      # або git merge --continue
Найважливіше правило

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

Merge чи rebase

MERGE — ІСТОРІЯ РОЗГАЛУЖУЄТЬСЯ видно, що робота йшла паралельно плюс окремий коміт злиття REBASE — ПРЯМА ЛІНІЯ твої коміти перенесено на свіжу основу але вони переписані: у них нові ідентифікатори Звідси й головне правило: rebase лише для своєї гілки, яку ніхто інший не використовує. Переписати історію спільної гілки — означає зламати роботу всім, хто її вже завантажив.
Обидва підходи дають однаковий код, але різну історію. Rebase переписує коміти, тому й обмежений власними гілками.
# підтягнути свіжий main у свою гілку
git fetch origin
git rebase origin/main         # історія лишиться прямою

# якщо щось пішло не так — завжди можна скасувати
git rebase --abort
Найцінніша команда в цьому уроці

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

Як не створювати конфліктів

  • Маленькі гілки. День-два життя — і перетинів майже не буває.
  • Регулярний rebase origin/main. Раз на день, а не раз на тиждень: один конфлікт із двох рядків замість двадцяти з двохсот.
  • Домовленість про зони. Якщо двоє переробляють один файл — краще домовитись голосом, а не в Git.
  • Форматування окремо. Автоформатування всього проєкту гарантує конфлікт у кожній відкритій гілці.

Коли зламав щось у себе

git reflog                          # історія ВСІХ переміщень HEAD, навіть «втрачених»
git reset --hard HEAD@{3}           # повернутись до стану три кроки тому

git restore src/file.ts             # скасувати зміни у файлі
git reset --soft HEAD~1             # скасувати останній коміт, лишивши зміни
git revert <hash>                   # окремий коміт, який скасовує інший — безпечно для спільних гілок

git reflog — це страховка від майже будь-якої помилки. Git не видаляє коміти одразу, тож «утрачена» робота зазвичай знаходиться. Якщо здається, що все пропало — спершу reflog, і лише потім паніка.

reset проти revert

reset переписує історію — доречний лише у власній невідправленій гілці. revert створює новий коміт, який скасовує зміни, — і саме його використовують у main. Якщо треба відкотити щось уже влите в спільну гілку, відповідь завжди revert.

≈ 40 хв · +25 XP за урок