Distributed Version Control
Кожен розробник має повну копію репозиторію з історією змін. Робота можлива офлайн, а синхронізація відбувається через push/pull з віддаленими репозиторіями.
Комплексний посібник з Git: робочі процеси, стратегії розгалуження, команди для ефективної роботи в команді та інтерактивний симулятор репозиторію.
Git — розподілена система контролю версій, створена Лінусом Торвальдсом у 2005 році. Вона дозволяє відстежувати зміни у коді, працювати паралельно над різними функціями та легко інтегрувати зміни від багатьох розробників.
Кожен розробник має повну копію репозиторію з історією змін. Робота можлива офлайн, а синхронізація відбувається через push/pull з віддаленими репозиторіями.
Гілки дозволяють ізольовано розробляти функції, виправляти баги та готувати релізи. Git Flow, GitHub Flow, Trunk Based — різні підходи до організації роботи з гілками.
Pull/Merge Requests — механізм колаборації через код-рев'ю. CI/CD інтеграція запускає тести автоматично, забезпечуючи якість перед злиттям.
Класичний Git workflow складається з чотирьох зон, через які проходять зміни перед потраплянням до спільного репозиторію.
Файли у робочій директорії можуть бути untracked, modified або staged.
Команда git add переміщує зміни до staging area — індексу наступного коміту.
Можна додавати окремі файли або частини файлів (-p для інтерактивного вибору).
Команда git commit зберігає зміни у локальному репозиторії з унікальним хешем SHA-1.
git push відправляє коміти на віддалений сервер (GitHub, GitLab, Bitbucket).
git pull отримує та інтегрує зміни з віддаленого репозиторію.
Моделювання характеристик репозиторію залежно від параметрів команди: розмір, кількість гілок, частота комітів та розробників.
Найпоширеніші Git команди для роботи з гілками, комітами, злиттям та перебазуванням, а також типова конфігурація GitHub Actions для автоматизації.
# Git Workflow команди
# Створення та переключення на нову гілку
git checkout -b feature/new-feature
# або (Git 2.23+)
git switch -c feature/new-feature
# Перегляд статусу та додавання змін
git status
git add filename.txt # конкретний файл
git add . # всі зміни
git add -p # інтерактивний вибір
# Створення коміту з повідомленням
git commit -m "feat: add user authentication"
# Синхронізація з віддаленим репозиторієм
git fetch origin
git pull origin main
git push origin feature/new-feature
# Злиття та перебазування
git merge feature/new-feature # злиття гілки
git rebase main # перебазування на main
git rebase -i HEAD~3 # інтерактивне перебазування
# Корисні команди
git log --oneline --graph --all # візуальна історія
git stash # тимчасово сховати зміни
git cherry-pick <commit> # скопіювати коміт
git reset --soft HEAD~1 # скасувати останній коміт
# .github/workflows/ci.yml
# GitHub Actions CI/CD конфігурація
name: CI/CD Pipeline
on:
push:
branches: [main, develop]
pull_request:
branches: [main]
jobs:
test:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0 # повна історія для sonar
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Run linter
run: npm run lint
- name: Run tests
run: npm test -- --coverage
- name: Build
run: npm run build
- name: Deploy to staging
if: github.ref == 'refs/heads/develop'
run: npm run deploy:staging
- name: Deploy to production
if: github.ref == 'refs/heads/main'
run: npm run deploy:prod
Вибір стратегії розгалуження залежить від розміру команди, частоти релізів та потреб у стабільності. Ось порівняння трьох найпопулярніших підходів.
| Характеристика | Git Flow | GitHub Flow | Trunk Based |
|---|---|---|---|
| Головна гілка | main + develop | main | trunk (main) |
| Тривалість гілок | Довгоживучі (feature, release) | Короткоживучі (PR) | Дуже короткі (<1 день) |
| Частота релізів | Рідко (тижні/місяці) | Часто (декілька разів на день) | Дуже часто (багато разів на день) |
| Розмір команди | Будь-який | Малий-середній | Досвідчені команди |
| Складність | Висока | Низька | Середня |
| Feature flags | Не обов'язково | Рекомендовано | Обов'язково |
| Коли використовувати | З запланованими релізами, QA процесом | Веб-додатки, SaaS, continuous delivery | High-frequency deployment, DevOps культура |
Базові команди Git (add, commit, push, pull). Робота у feature-гілках. Розуміння PR/MR процесу.
Rebase, cherry-pick, stash, reflog. Code review навички. Понимання branching strategy команди.
Архітектура Git workflow, налаштування захисту гілок. CI/CD інтеграція, Git hooks, automation.
Self-hosted Git (GitLab, Gitea), монорепозиторії. GitOps, infrastructure as code, advanced workflows.
Merge створює коміт злиття та зберігає повну історію. Підходить для: інтеграції завершених фіч у main, збереження контексту паралельної роботи.
Rebase переміщує коміти на нову базу, створюючи лінійну історію. Підходить для: оновлення feature-гілки перед злиттям, чистої історії без зайвих merge-комітів.
Ніколи не використовуйте rebase для публічних гілок, над якими працюють інші!
Squash об'єднує декілька комітів в один перед злиттям. Переваги:
Більшість платформ (GitHub, GitLab) підтримують "Squash and merge" у PR.
Cherry-pick застосовує зміни з конкретного коміту до поточної гілки без повної історії вихідної гілки. Використовується для:
git cherry-pick abc123 — застосує коміт з хешем abc123 до поточної гілки.
Submodules — окремі репозиторії всередині основного. Підходять для:
Monorepo — один репозиторій для всіх проєктів. Переваги:
Якщо ніхто ще не pulled:
git reset --hard HEAD~1 — локальний відкат.git push --force-with-lease — форсований push (безпечніший ніж --force).Якщо вже pulled: використовуйте git revert — створить новий коміт,
що скасовує зміни, зберігаючи історію чистою.
Кроки вирішення конфлікту:
<<<<<<<, =======, >>>>>>>.git add . && git commit для завершення merge.Профілактика: частіше pull з main, менші PR, комунікація в команді.
Знімок стану файлів у репозиторії з унікальним SHA-1 хешем. Містить автора, дату та повідомлення. Базова одиниця історії Git.
Вказівник на коміт, що рухається вперед при нових комітах. Гілки дозволяють паралельну розробку ізольованих фіч чи версій.
Операція об'єднання двох гілок. Створює merge commit з двома батьками або fast-forward, якщо можливо лінійне переміщення.
Перезастосування комітів однієї гілки поверх іншої. Створює "чисту" лінійну історію, але змінює хеші комітів.
Проміжна область (index) між робочою директорією та репозиторієм.
git add поміщає файли в staging для наступного коміту.
Вказівник на поточний коміт чи гілку. HEAD~1 — батьківський коміт,
HEAD~3 — три коміти назад. Від detached HEAD можна створити нову гілку.