Git / Git workflow (GitFlow, trunk)

Git workflow (GitFlow, trunk)

Workflow гэдэг нь баг хэрхэн branch үүсгэж, merge хийж, release гаргадаг дүрмийн тогтолцоо. Хамгийн өргөн тархсан гурван workflow-г авч үзье.

1. GitFlow

2010 онд Vincent Driessen санал болгосон классик workflow. Олон урт хугацааны branch ашигладаг.

Branch бүтэц

код
main        — Зөвхөн production-д гарсан код
develop     — Хөгжүүлэлтийн үндсэн branch
feature/*   — Шинэ функц бүрт тусдаа branch
release/*   — Release бэлтгэх branch
hotfix/*    — Production дээрх яаралтай засвар

Ажиллах дараалал

код
main ─────────────────────────────────► production
  └─ develop ──────────────────────────► хөгжүүлэлт
        ├─ feature/login ──► develop    шинэ функц
        ├─ feature/payment ► develop    шинэ функц
        ├─ release/1.0 ────► main       release бэлтгэх
        └─ hotfix/crash ───► main       яаралтай засвар
                        └──► develop

Практик команд

bash
# Feature эхлэх
git checkout develop
git checkout -b feature/login

# Feature дуусгах
git checkout develop
git merge feature/login
git branch -d feature/login

# Release эхлэх
git checkout develop
git checkout -b release/1.0
# ... version дугаар шинэчлэх, тест хийх ...

# Release дуусгах
git checkout main
git merge release/1.0
git tag -a v1.0.0 -m "v1.0.0 release"
git checkout develop
git merge release/1.0
git branch -d release/1.0

# Hotfix
git checkout main
git checkout -b hotfix/payment-crash
# ... засвар хийх ...
git checkout main
git merge hotfix/payment-crash
git checkout develop
git merge hotfix/payment-crash

GitFlow-ийн давуу ба сул тал

| Давуу тал | Сул тал | | -------------------------------------- | ---------------------------------- | | Тодорхой бүтэц, дүрэм | Хэт төвөгтэй | | Олон хувилбарыг зэрэг дэмжих боломжтой | Branch-ууд удаан нээлттэй байдаг | | Том багт тохиромжтой | CI/CD-тэй хэрэгжүүлэхэд хүндрэлтэй |


2. Trunk-based development

Бүх хөгжүүлэгч нэг branch (main эсвэл trunk) руу байнга commit хийдэг арга. Branch-ууд маш богино хугацаанд нээлттэй байдаг (1–2 өдөр).

Бүтэц

код
main ──●──●──●──●──●──●──►  байнгын шинэ commit
       ↑                     deploy автоматаар
feature branch-ууд:
  └─ feature/x (1-2 өдөр) ──► main

Практик команд

bash
# Өглөө: main-с шинэчилж, branch үүсгэнэ
git checkout main
git pull origin main
git checkout -b feature/add-button

# Тэр өдрөө дуусгаж merge хийнэ
git checkout main
git merge feature/add-button
git push origin main
git branch -d feature/add-button

Feature flags

Trunk-based-д дуусаагүй функцийг main-д оруулахдаа feature flag ашигладаг:

typescript
// Feature flag ашиглан нуух
const SHOW_NEW_PAYMENT = false;

{SHOW_NEW_PAYMENT && <NewPaymentForm />}

Функц бэлэн болмогц flag-г true болгоно — дахин deploy хийхгүйгээр идэвхжинэ.

Trunk-based-ийн давуу ба сул тал

| Давуу тал | Сул тал | | ---------------------------- | --------------------------------- | | Merge conflict бараг байхгүй | Хатуу тест шаардлага | | CI/CD-тэй маш сайн нийцдэг | Туршлагагүй багт хэцүү | | Байнга deploy хийх боломжтой | Feature flag удирдах шаардлагатай |


3. GitHub Flow

GitHub-с санал болгосон хялбарчилсан workflow. GitFlow-с хамаагүй энгийн.

Бүтэц

код
main ────────────────────────────────► production
  └─ feature/x ──► PR ──► main       нэг дор

Дүрмүүд (ердөө 6)

  1. main branch байнга deploy хийхэд бэлэн байна
  2. Шинэ ажил хийхдээ main-с branch үүсгэнэ
  3. Branch-д байнга commit хийж, GitHub руу push хийнэ
  4. PR үүсгэж, code review хийлгэнэ
  5. Review дуусмагц main-д merge хийнэ
  6. Merge хийгдмэгц шууд deploy хийнэ

Практик команд

bash
# Branch үүсгэнэ
git checkout -b feature/dark-mode

# Ажиллаж, commit хийнэ
git add .
git commit -m "feat: dark mode нэмэх"
git push origin feature/dark-mode

# GitHub дээр PR үүсгэнэ → review → merge
# Merge хийгдмэгц автоматаар deploy

Харьцуулалт — аль байгууллагад аль нь тохиромжтой?

| | GitFlow | GitHub Flow | Trunk-based | | ------------------- | --------------------- | ------------- | ------------ | | Хэмжээ | Том баг | Дунд баг | Аль ч хэмжээ | | Release давтамж | Тогтмол (сар, улирал) | Байнга | Өдөр бүр | | Туршлага | Дунд, дээд | Бүх түвшин | Дунд, дээд | | CI/CD | Тийм биш шаардлага | Тохиромжтой | Зайлшгүй | | Жишээ | Томоохон enterprise | Startup, SaaS | Google, Meta |

Хурдан шийдвэрлэх арга

  • Та ганцаараа эсвэл жижиг баг → GitHub Flow
  • Олон хувилбар зэрэг дэмжих шаардлагатай → GitFlow
  • Өдөр бүр deploy, CI/CD бүтэн бэлэн → Trunk-based

Дараагийн хичээлд:

Бодит GitHub repository үүсгэж, сурсан бүхнээ нэгтгэсэн эцсийн төслийг хийнэ.