ไม่มีชื่อบทความ
Thought for 4 seconds
Git Workflow สำหรับ Monorepo Nokfa
TL;DR
- ใช้ Trunk‑based flow + Feature Branch สั้น ๆ → ลด conflict, deploy เร็ว
- Commit ตามสไตล์ Conventional Commits พร้อม
scope= path เช่นweb,admin-dashboard - ทุก PR ต้อง Review ≥ 1 คนตาม
CODEOWNERS, ผ่าน CI ก่อน merge - ตั้งชื่อ branch:
feat/<area>/<short-desc>หรือfix/<area>/<bug> - ใช้คำสั่ง
git log -- apps/webเพื่อดูประวัติรายแอป แก้ปัญหา log รก
1. โครงสร้างหลักของ Workflow
- main → branch เสถียร, deploy production อัตโนมัติ
- dev → รวมงานระหว่างวัน, สร้าง Preview Deploy
- feature / bugfix → แตกจาก dev, อายุสั้น ≤ 3 วัน
- release → (ไม่บังคับ) แท็ก version ตาม Sprint / Milestone
💡 ทีมเราเล็ก (2 dev) → เน้น CI เร็วกว่า branch ยาว ๆ
2. การตั้งชื่อ Branch
| ประเภทงาน | รูปแบบ | ตัวอย่าง | หมายเหตุ |
|---|---|---|---|
| Feature | feat/<area>/<desc> |
feat/web/login-form |
<area> = web, admin, ui-kit, auth-lib ฯลฯ |
| Bugfix | fix/<area>/<issue#> |
fix/admin/421 |
ถ้าเชื่อม Issue ID ให้ใช้เลข |
| Chore | chore/<area>/<task> |
chore/dev/update-eslint |
งานบ้าน, dependency upgrade |
| Hotfix | hotfix/<prod-bug> |
hotfix/404-page-error |
แตกจาก main แล้ว merge กลับทันที |
✅ ชื่อ branch สั้น, ไม่ใช้ space, ใช้ขีดกลางเท่านั้น
3. Conventional Commits + Scope
| ตัวอย่าง Commit | คำอธิบาย | Scope ควรใช้ |
|---|---|---|
feat(web): เพิ่ม Hero Section |
ฟีเจอร์ใหม่ในเว็บ | web |
fix(auth-lib): handle token refresh |
แก้ bug ใน shared lib | auth-lib |
chore(ui-kit): upgrade tailwind 3.4 |
งานบ้านอัปเกรด lib | ui-kit |
refactor(utils): simplify date helper |
ปรับโครงสร้างไม่เปลี่ยน behavior | utils |
กฎย่อย:
type=feat|fix|chore|refactor|docs|test|buildscope= โฟลเดอร์บนสุด (apps หรือ packages)- Message หลัง
:= ภาษาไทยหรืออังกฤษได้ แต่ต้องสั้น ≤ 50 ตัวอักษร
# ตัวอย่าง commit จริง
$ git commit -m "feat(admin-dashboard): หน้า Report พื้นฐาน"
4. Pull Request (PR) Policy
ฐาน (base branch):
dev(ถ้า Hotfix →main)Assignee = คนเขียน, Reviewer = คนอีกคนตาม CODEOWNERS
Checklist ก่อนกด Create PR
- ผ่าน
pnpm lint -
pnpm testผ่าน - อัปเดต docs ถ้ามี breaking change
- ไม่มีไฟล์ build, .env, log ใน diff
- ผ่าน
CI ต้องผ่านทุกขั้น (lint, test, build)
Reviewer กด Approve + Comment แก้ไข (หากพบ)
Squash & Merge เป็นค่าเริ่มต้น → Log clean
5. ตัวอย่างไฟล์ CODEOWNERS
# apps
/apps/web/* @dev-a
/apps/admin-dashboard/* @dev-b
# shared packages
/packages/ui-kit/* @dev-a
/packages/auth-lib/* @dev-b
# config & root
/tsconfig.base.json @dev-a @dev-b
/turbo.json @dev-a @dev-b
- GitHub จะ Auto‑request Review ตามไฟล์ที่แก้
- แก้
CODEOWNERSต้อง PR และให้ทุกคนรับรู้
6. คำสั่ง Git ที่ใช้บ่อย
# แสดง log เฉพาะแอป web (ล่าสุด 20 รายการ)
$ git log --oneline -20 -- apps/web
# ค้น commit ที่แตะ shared ui-kit
$ git log --pretty=format:"%h %s" -- packages/ui-kit
# ตรวจ diff ระหว่าง branch dev กับ main (เฉพาะ admin)
$ git diff main..dev -- apps/admin-dashboard
⚡ ช่วยให้ไม่ต้องไถ log ยาว ๆ
7. วิธีทำงานรายวัน (Flow Step‑by‑Step)
Sync main & dev
$ git checkout dev $ git pull origin devสร้าง Branch ของตัวเอง
$ git checkout -b feat/web/contact-formเขียนโค้ด + commit เป็นกลุ่ม logical changes
Rebase กับ dev ก่อนเปิด PR (ลด conflict)
$ git fetch origin $ git rebase origin/devPush Branch
$ git push -u origin feat/web/contact-formสร้าง PR → Reviewer ตรวจ
Squash & Merge → dev
CI on dev สำเร็จ → Auto Deploy Preview
ทุกวันศุกร์ → Merge dev → main → Production Deploy
8. กลยุทธ์ลด Conflict
- Feature branch สั้น: จบภายใน 1‑3 วัน
- ก่อน Commit ใหญ่ →
git pull --rebase - หลีกเลี่ยงแก้ไฟล์ config เดียวกันพร้อมกัน (เช่น
turbo.json,tsconfig.base.json) - แก้ไฟล์ UI shared (
ui-kit) → แจ้งอีกคนทันที
9. ตัวอย่าง Release Tag
# สร้าง tag v0.3.0 บน main
$ git checkout main
$ git pull
$ git tag -a v0.3.0 -m "Release 0.3.0 - เพิ่มระบบรายงาน"
$ git push origin v0.3.0
- ใช้ Semantic Versioning
- Tag แต่ละ Sprint หรือ Feature ใหญ่
10. ตัวอย่าง .gitignore (ย่อ)
# Node
node_modules/
# Build Outputs
.next/
dist/
# Env
*.env*
.env.local
# Logs
logs/
*.log
ป้องกันไฟล์ใหญ่รั่วลง repo + ลด diff รก
11. สคริปต์ช่วยใน package.json
{
"scripts": {
"pre-commit": "pnpm lint",
"prepare": "husky install"
},
"lint-staged": {
"*.{ts,tsx}": "eslint --fix"
}
}
- ติดตั้ง husky + lint‑staged → Prevent commit ที่ไม่ผ่าน lint
- ทำงานเร็ว, ลด Bug ตั้งแต่ local
12. เช็กลิสต์ Reviewer (Mini‑Guide)
- โค้ดอ่านง่าย, ใช้ภาษาเดียวกัน (ENG/TH ไม่ปน)
- ไม่มี query ไร้ index ใน Firestore
- ไม่มี
console.logเหลือค้าง - UI สอดคล้องกับ Design System (
ui-kit) - Docs / Storybook อัปเดต
💬 ใช้ Comment สั้น + Suggestion เมื่อแก้เล็กน้อย
13. Summary Tips
- Commit ถี่แต่เล็ก → ง่าย rollback
- ตั้ง Push default เป็น
--no-verifyไม่ควร (จะข้าม pre‑commit!) - ใช้
git stash -uเก็บงานชั่วคราวก่อน rebase - ถ้า conflict หนัก →
git rerereเปิดช่วยจำการ merge