Feature Branch — เป็นเทคนิคการแตกสาขาใน Git ซึ่งแต่ละฟีเจอร์ใหม่จะถูกพัฒนาในสาขาแยกต่างหาก โดยแยกจากโค้ดหลัก ซึ่งช่วยให้นักพัฒนาหลายคนทำงานพร้อมกันในงานต่าง ๆ ได้โดยไม่เสี่ยงต่อการทำให้เวอร์ชันเสถียรของโปรเจกต์เสียหาย ตามข้อมูลจาก Atlassian, 2024 Feature Branch เป็นองค์ประกอบสำคัญของ Git Flow และใช้ในโปรเจกต์เชิงพาณิชย์ส่วนใหญ่
ประเด็นสำคัญ
feature/ชื่อ-ฟังก์ชัน ใน Git Flow มาตรฐานFeature Branch (สาขาฟีเจอร์) เป็นสาขาชั่วคราวใน Git ที่สร้างจาก develop เพื่อพัฒนาฟังก์ชันเฉพาะ แตกต่างจากสาระสำคัญที่มีอายุยาวนานอย่าง main และ develop สาขา feature จะมีอายุจำกัด — ตั้งแต่ไม่กี่ชั่วโมงจนถึงไม่กี่สัปดาห์
เป้าหมายหลักของ feature branch คือการแยกการเปลี่ยนแปลงที่เกี่ยวข้องกับงานหนึ่งออกจากโค้ดที่เหลือ นักพัฒนาสามารถทดลอง ทำคอมมิตจำนวนมาก และแม้กระทั่งทำให้โค้ดเสียหายในสาขาของตนเองได้ โดยไม่ส่งผลกระทบต่อการทำงานของสมาชิกคนอื่นในทีม
เมื่อการพัฒนาเสร็จสมบูรณ์ สาขา feature จะถูกรวมกลับไปยัง develop ผ่าน Pull Request พร้อมการตรวจสอบโค้ดที่บังคับ หลังจากการรวม สาขามักจะถูกลบเพื่อให้คลังเก็บสะอาด
ตามข้อมูลจาก Vincent Driessen, 2010 โมเดล Git Flow กับสาขา feature กลายเป็นมาตรฐานอุตสาหกรรมเนื่องจากการแบ่งหน้าที่รับผิดชอบที่ชัดเจนระหว่างสาขาประเภทต่าง ๆ
เวิร์กโฟลว์ กับ feature branch ประกอบด้วยลำดับขั้นตอนที่นักพัฒนาดำเนินการสำหรับแต่ละฟีเจอร์ใหม่ กระบวนการนี้ช่วยลดความขัดแย้งในการรวมและรับประกันการควบคุมคุณภาพโค้ด
การซิงโครไนซ์กับ develop เป็นประจำ มีความสำคัญอย่างยิ่ง ยิ่งสาขา feature มีอายุยืนนานโดยไม่รวมการเปลี่ยนแปลงจาก develop โอกาสเกิดความขัดแย้งในการรวมครั้งสุดท้ายก็ยิ่งสูงขึ้น
| ความถี่ในการซิงโครไนซ์ | ความเสี่ยงความขัดแย้ง | ความสะดวกในการพัฒนา |
|---|---|---|
| รายวัน | ต่ำ | ต้อง rebase หรือ merge บ่อย |
| รายสัปดาห์ | ปานกลาง | จังหวะสบาย ความขัดแย้งปานกลาง |
| รายเดือน | สูง | เสี่ยงต่อการแก้ไขความขัดแย้งที่ซับซ้อน |
| ไม่เคย | วิกฤต | การรวมอาจเป็นไปไม่ได้หากไม่สูญเสียข้อมูล |
การตั้งชื่อสาขา เป็นส่วนสำคัญของวินัยของทีม มาตรฐานการตั้งชื่อที่สอดคล้องกันช่วยให้ระบุได้อย่างรวดเร็วว่างานใดกำลังดำเนินการและใครเป็นผู้ดำเนินการ
feature/added-auth-modulefeature/PROJ-42-add-loginfeature/feat/analytics-dashboardการใช้ ID งาน จาก JIRA, Trello หรือระบบอื่นเป็นแนวปฏิบัติที่ดีที่สุด โดยจะเชื่อมโยงโค้ดกับงานโดยอัตโนมัติและทำให้การค้นหาสาขาผ่าน git log ง่ายขึ้น
Pull Request (หรือ Merge Request ใน GitLab) เป็นคำขอเพื่อรวมสาขา feature เข้าสู่ develop PR ไม่ใช่แค่การดำเนินการทางเทคนิค แต่เป็นกระบวนการตรวจสอบโค้ดของทีมที่ปรับปรุงคุณภาพโค้ดและเผยแพร่ความรู้ภายในทีม
PR ที่ดีประกอบด้วยหัวข้อพร้อมคำอธิบายสั้น ๆ ของงาน ลิงก์ไปยังตั๋ว และคำอธิบายการเปลี่ยนแปลง นักพัฒนาควรระบุว่าทำอะไรไปบ้าง ไฟล์ใดถูกเปลี่ยนแปลง และมีความเสี่ยงที่อาจเกิดขึ้นกับส่วนอื่น ๆ ของโปรเจกต์หรือไม่
ทีมตรวจสอบโค้ดใน PR แสดงความคิดเห็น ขอให้เปลี่ยนแปลง (change requests) และอนุมัติการรวม (approve) หลังอนุมัติ จะดำเนินการ merge หรือ squash merge
เวลาเฉลี่ยในการตรวจสอบ PR ในการพัฒนาแอปมือถืออยู่ที่ 4 ถึง 24 ชั่วโมง ไลบรารี Danger ทำให้การตรวจสอบบางส่วนเป็นอัตโนมัติ โดยเรียกใช้ linters และทดสอบโดยตรงใน PR
หลังอนุมัติ PR สาขา feature สามารถรวมเข้าสู่ develop ได้หลายวิธี การเลือก กลยุทธ์การรวม ส่งผลต่อประวัติคอมมิตและความสามารถในการย้อนกลับการเปลี่ยนแปลง
สำหรับโปรเจกต์มือถือที่ออกเวอร์ชันบ่อย squash merge มักถูกใช้มากที่สุด: ให้ประวัติที่สะอาดใน develop ในขณะที่รายละเอียดการพัฒนายังคงอยู่ในคำอธิบาย PR และงานในระบบติดตาม
แม้แต่นักพัฒนาที่มีประสบการณ์ก็ทำผิดพลาดเมื่อทำงานกับสาขา feature การรู้ปัญหาทั่วไปช่วยหลีกเลี่ยงการเสียเวลาและข้อมูล
วิธีที่ดีที่สุดในการหลีกเลี่ยงปัญหาเหล่านี้คือการตกลงกฎการทำงานเมื่อเริ่มต้นโปรเจกต์และใช้การตรวจสอบอัตโนมัติในไปป์ไลน์ CI/CD
พิจารณาสถานการณ์จริง: นักพัฒนาเริ่มฟีเจอร์การยืนยันตัวตนใหม่ในแอปมือถือ เขาสร้างสาขา feature ทำงานบนโค้ดและทำงานให้เสร็จด้วย Pull Request
# อัปเดต develop และสร้างสาขา feature
git checkout develop
git pull origin develop
git checkout -b feature/add-login-screen
# ทำงานบนฟีเจอร์: คอมมิต
git add src/ui/login/
git commit -m "Add login screen layout"
# พุชสาขา feature ไปยังเซิร์ฟเวอร์
git push origin feature/add-login-screen
# ซิงโครไนซ์กับ develop (rebase)
git fetch origin develop
git rebase origin/develop
# หลังอนุมัติ PR: อัปเดต develop ท้องถิ่นและลบสาขา
git checkout develop
git pull origin develop
git branch -d feature/add-login-screen
คำสั่ง git branch -d จะลบสาขาก็ต่อเมื่อการเปลี่ยนแปลงของมันถูกรวมเรียบร้อยแล้วเท่านั้น หากสาขายังไม่ถูกรวม Git จะแนะนำให้ใช้ git branch -D สำหรับการลบแบบบังคับ — ใช้แฟล็กนี้ด้วยความระมัดระวัง
ไปป์ไลน์ CI/CD ควรทำงานสำหรับทุกสาขา feature ก่อนสร้าง PR ซึ่งช่วยให้ตรวจพบปัญหาในระยะเริ่มต้น ก่อนที่โค้ดจะถึงการตรวจสอบของนักพัฒนาคนอื่น
# GitHub Actions สำหรับตรวจสอบสาขา feature
name: Feature Branch CI
on:
push:
branches:
- 'feature/**'
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run tests
run: ./gradlew test
- name: Lint check
run: ./gradlew lint
ไปป์ไลน์ตรวจสอบว่าโค้ดคอมไพล์ได้ การทดสอบผ่าน และรูปแบบโค้ดเป็นไปตามมาตรฐานของทีม หลังจากผ่านการตรวจสอบทั้งหมดแล้วเท่านั้นจึงจะสามารถสร้าง Pull Request ได้
คำถามที่พบบ่อย
ได้ เป็นปฏิบัติการมาตรฐาน นักพัฒนาแต่ละคนสามารถทำงานในสาขา feature ของตนเองได้ และทั้งหมดซิงโครไนซ์กับ develop อย่างอิสระ กฎหลักคือหนึ่งสาขาต่องานหนึ่ง เพื่อหลีกเลี่ยงการพึ่งพาข้ามงานในโค้ด
รัน git rebase origin/develop บนสาขา feature ของคุณ หากเกิดความขัดแย้ง — ให้แก้ไขทีละรายการ คอมมิตจะถูกเขียนใหม่บนสถานะล่าสุดของ develop หลัง rebase จะต้องใช้ git push --force เพื่ออัปเดตสาขาระยะไกล
หากงานถูกยกเลิก เพียงลบสาขา feature ใช้ git branch -d feature/name สำหรับสาขาท้องถิ่นและ git push origin --delete feature/name สำหรับสาขาระยะไกล การเปลี่ยนแปลงที่ยังไม่ได้คอมมิตทั้งหมดจะสูญหาย
โดยพื้นฐานแล้วเหมือนกัน ทีมต่างกันใช้คำนำหน้าต่างกัน: feature/, task/, feat/ ไม่มีความแตกต่างในกลไกของ Git — ทั้งหมดเป็นสาขาชั่วคราวที่สร้างจาก develop สำหรับการพัฒนาแบบแยกส่วน
ใช่ เป็นปฏิบัติการบังคับ สาขาหลังการรวมทำให้รายการอ้างอิงรกและอาจทำให้สับสน แพลตฟอร์มส่วนใหญ่ (GitHub, GitLab) เสนอให้ลบสาขาทันทีหลังจาก merge PR และสาขาท้องถิ่นจะถูกลบด้วยคำสั่ง git branch -d
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม