บทที่ 4 — Branch workflow: กติกาที่ทั้งทีมต้องเดินตาม
ทำไมต้องมี branch
ถ้าทุกคน commit ลงเส้นเดียวกันหมด งานครึ่ง ๆ กลาง ๆ ของคนหนึ่งจะไปพังงานของอีกคนทันที และถ้าโค้ดเส้นนั้นคือเส้นที่ใช้ deploy ขึ้นเว็บจริง เท่ากับความพังไปโผล่หน้าลูกค้าเลย
branch คือการก๊อปปี้เส้นเวลาออกมาทำงานของตัวเอง พังยังไงก็อยู่ในเส้นตัวเอง พอเสร็จและผ่านการตรวจแล้วค่อยรวมกลับเข้าเส้นหลัก
เส้นทางเดินของโค้ดในโปรเจกต์นี้
โค้ดเดินทางผ่าน 4 ด่าน — คลิกดูว่าแต่ละด่านคืออะไร
1. feat/ชื่องาน
แตกออกมาจาก develop ทำงานได้อิสระ พังยังไงก็ไม่กระทบใคร หนึ่งงาน = หนึ่ง branch เสมอ
git checkout develop && git pull
git checkout -b feat/product-filter
คุณ/AI แก้ตรงนี้ได้เต็มที่
2. develop
โค้ดล่าสุดที่ทำงานได้ ทุกคน merge งานมารวมที่นี่ผ่าน PR — ยังไม่มีใครนอกทีมเห็น
เข้าได้ทาง PR เท่านั้น
3. uat
merge เข้าปุ๊บ = deploy อัตโนมัติ เว็บ apexhuas.choiceflowhub.com เปลี่ยนภายใน 3-4 นาที ถือเป็นการเผยแพร่จริง
คนกดเท่านั้น ต้องมั่นใจแล้ว
4. main
เวอร์ชันขายจริง ยังไม่ได้เปิดใช้ในโปรเจกต์นี้ รอตัดสินใจเรื่อง server production ก่อน
ยังไม่ใช้
กฎเหล็ก: develop / uat / main ห้าม commit ตรงเด็ดขาด เข้าได้ทาง PR ทางเดียว
| Branch | คืออะไร | ใครแตะได้ |
|---|---|---|
feat/* fix/* chore/* docs/* |
เส้นงานของคุณ 1 งาน = 1 branch | คุณคนเดียว |
develop |
จุดรวมงานทุกคน โค้ดล่าสุดที่ทำงานได้ | ผ่าน PR เท่านั้น |
uat |
เวอร์ชันที่ให้ลูกค้าดู — merge เข้าแล้วเว็บจริงเปลี่ยนทันที | ผ่าน PR เท่านั้น |
main |
เวอร์ชัน production (ยังไม่ได้ใช้ รอ server จริง) | ผ่าน PR เท่านั้น |
กฎ 5 ข้อของ repo นี้
เขียนไว้ใน AGENTS.md หัวข้อ MANDATORY: branch per task — ทั้งคนและ AI ที่ทำงานใน repo นี้ต้องทำตาม
- หนึ่ง branch = หนึ่งงาน อย่าเอางานไม่เกี่ยวกันมายัดรวม
- แตก branch ใหม่จาก
developที่อัปเดตล่าสุดเสมอ อย่าใช้ branch เก่าที่ค้างอยู่ - ห้าม commit ตรงเข้า
develop/uat/mainเด็ดขาด เข้าได้ทาง PR ทางเดียว - ถ้าเผลออยู่ผิด branch ตอนเริ่มงาน ให้สลับ/แตกใหม่ก่อน แล้วค่อยแก้ไฟล์
- typecheck / lint / build ต้องผ่านก่อนเปิด PR
ชื่อ branch
ใช้รูปแบบ ประเภท/สิ่งที่ทำ-สั้น-ๆ เป็นภาษาอังกฤษ ขีดกลางคั่นคำ
feat/product-filter-by-brand ฟีเจอร์ใหม่
fix/cart-badge-not-updating แก้บั๊ก
chore/upgrade-tailwind งานบ้าน ไม่กระทบผู้ใช้
docs/learning-site เอกสารทำจริงทีละขั้น
# 1. กลับไปที่ develop แล้วดึงของล่าสุด (ข้อ 2 ของกฎ)
git checkout develop
git pull
# 2. แตก branch ของงานนี้
git checkout -b feat/product-filter-by-brand
# 3. ทำงาน... commit ไปเรื่อย ๆ ระหว่างทาง
git add .
git commit -m "Add brand filter to catalogue sidebar"
# 4. ตรวจงานตัวเองก่อนส่ง (ข้อ 5)
npx tsc --noEmit # เช็ค type
npm run lint # เช็คสไตล์โค้ด
npm run build # ลอง build จริง
# 5. ส่งขึ้น GitHub
git push -u origin feat/product-filter-by-brandแล้ว pull request?
PR คือการบอกว่า "งานผมเสร็จ ขอรวมเข้า develop หน่อย" — และเป็นจุดที่เกิด 2 อย่างพร้อมกัน: CI ตรวจอัตโนมัติ (บทที่ 7–8) กับ คนรีวิว
เปิดผ่านหน้าเว็บ GitHub ก็ได้ หรือใช้คำสั่ง:
gh pr create --base develop --title "Add brand filter to catalogue" --body "อธิบายว่าทำอะไร ทำไม ทดสอบยังไง"
gh pr checks --watch # ดูผล CI แบบเรียลไทม์
gh pr merge <เลข PR> --merge --delete-branchเขียน PR ยังไงให้คนรีวิวง่าย: บอก 3 อย่างพอ — ทำอะไร, ทำไมต้องทำ, ทดสอบยังไงแล้วบ้าง ลองเปิดดู PR เก่าของ repo นี้เป็นตัวอย่างได้ที่ https://github.com/Natt-Woramet/apexhuas/pulls
หลัง merge แล้วเก็บกวาด
git checkout develop
git pull # ดึงงานที่เพิ่ง merge ลงมา
git fetch --prune # ลบ branch ที่ถูกลบบน GitHub ออกจากรายชื่อในเครื่องจังหวะที่ของขึ้นเว็บจริง
เมื่องานใน develop พร้อมให้ลูกค้าดู เราเปิด PR จาก develop → uat พอ merge ปุ๊บ ระบบจะ build แล้ว deploy ให้เอง เว็บ https://apexhuas.choiceflowhub.com จะเปลี่ยนภายในไม่กี่นาที (รายละเอียดในบทที่ 11)
สำคัญ: เพราะแบบนี้ การ merge เข้า
uatจึงไม่ใช่แค่ "รวมโค้ด" แต่คือ การเผยแพร่ต่อสาธารณะ promote เฉพาะงานที่เสร็จจริงและ CI เขียวเท่านั้น
ลองทำเอง: ฝึกทั้งวงจรด้วยงานเล็ก ๆ — แตก branch
docs/my-first-prแล้วแก้ไฟล์README.mdเพิ่มชื่อตัวเองสักบรรทัด → commit → push → เปิด PR เข้าdevelop→ ดู CI รันจนเขียว → ปิด PR ทิ้งไปเลยก็ได้ (กด Close ไม่ต้อง merge) เป้าหมายคือให้เห็นวงจรครบ ไม่ใช่ได้โค้ด
เช็คความเข้าใจ
-
เพราะถ้าแตกจากสำเนาเก่า งานคุณจะขาดของที่คนอื่นเพิ่งเพิ่มไป พอเปิด PR ก็มีโอกาสชนกัน (conflict) มากขึ้น การเริ่มจากยอดล่าสุดเสมอทำให้ PR สะอาด
-
เป็น — คนรีวิวจะอ่านยากขึ้นมาก และถ้าเรื่องหนึ่งมีปัญหาต้องถอย คุณจะถอยเฉพาะเรื่องนั้นไม่ได้ ต้องถอยทั้งก้อน วิธีแก้คือแยก branch ตามเรื่องตั้งแต่แรก
-
develop = รวมงานเฉย ๆ ไม่มีอะไรเกิดขึ้นภายนอก / uat = ระบบ deploy อัตโนมัติทันที เว็บที่ลูกค้าเปิดได้จะเปลี่ยน ดังนั้นต้องแน่ใจว่างานเสร็จจริงและ CI เขียว
เจอปัญหาบ่อย ๆ
| อาการ | ทำยังไง |
|---|---|
เผลอ commit ลง develop (ยังไม่ push) |
git branch feat/งานนี้ แล้ว git reset --hard origin/develop เพื่อดึง develop กลับที่เดิม จากนั้นสลับไป branch ใหม่ |
| PR ขึ้นว่า "conflict" | มีคนแก้ไฟล์เดียวกันไปก่อน — git pull origin develop ในเครื่อง แก้จุดที่ชนกัน แล้ว commit ใหม่ |
| ทำงานไปครึ่งทางแล้วรู้ว่าแตก branch ผิด | git stash (เก็บงานพักไว้) → สลับ branch ให้ถูก → git stash pop (เอากลับมา) |
บทหน้าเข้าเรื่องที่ทำให้ทั้งหมดนี้ปลอดภัยจริง: ระบบตรวจงานอัตโนมัติที่ยืนเฝ้าอยู่หน้าประตู develop