Git flow คืออะไร มาลองใช้ Git flow กันเถอะ

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

สวัสดีครับ ผมทินกร มณีวงษ์ครับ!

ครั้งนี้ผมจะมาพูดถึงเรื่อง Git flow

Git flow คืออะไร

Git flow คือ หนึ่งในกลยุทธ์การพัฒนาที่ใช้การทำงานหรือความสามารถของ Branch git ในรูปแบบการแตก Branch ออกมาเพื่อพัฒนา feature ที่ต้องการ ซึ่งเราสามารถเลือกใช้ Git flow ในการจัดการซอร์สโค้ดเพื่อพัฒนาให้มีสิทธิภาพมากขึ้น เนื่องจากว่ามีกฎเกณฑ์การใช้งานและมีการทำงานร่วมกันกับผู้พัฒนาคนอื่น แต่เราสามารถลดปัญหาที่จะเกิดขึ้นระหว่างการทำงานร่วมกันได้ ปัจจุบันนี้การใช้งาน Git flow ถูกนำมาใช้ในโปรเจ็กต์อย่างแพร่หลาย (แต่ก็ไม่ได้ถูกนำมาใช้ในโปรเจ็กต์ทั้งหมด)

หัวข้อต่อไป จะอธิบายเกี่ยวกับการใช้งาน Branch ที่ใช้ใน Git flow

Branch ของ Git flow

git-model ><

อ้างอิง: https://nvie.com/posts/a-successful-git-branching-model/

จากแผนภาพ Git flow จะแบ่งการทำงานของ Branch ออกเป็น 5 ส่วน

  • Main Branches คือ Branch หลักที่เป็นศูนย์กลาง จะมี 2 Branch
    1. Branchmaster
    2. Branchdevelop
  • Supporting Branches คือ Branch ที่คอยสนับสนุน Branch หลัก จะมี 3 Branch
    1. Branchhotfix
    2. Branchrelease
    3. Branchfeature

ลักษณะการทำงานของแต่ละ Branch มีดังนี้

  • master
    • เป็น Branch สำหรับจัดการซอร์สโค้ดเพื่อ release ขึ้นไปที่ production ให้กับผู้ใช้งาน
    • ทำการติดเวอร์ชันแท็ก
    • ในส่วนนี้จะไม่ทำการพัฒนางาน
  • develop
    • เป็น Branch ที่ดำเนินการพัฒนางานเป็นหลัก
    • แก้ไขบั๊ก
    • พัฒนาโดยสร้าง Branch feature ใหม่ขึ้นมา
  • feature
    • เป็น Branch ที่ถูกสร้างขึ้นจาก Branch develop
    • ทำการพัฒนา feature ใหม่
    • ถ้างานที่พัฒนาเสร็จแล้ว จะทำการ Merge ไปที่ Branch develop
  • release
    • เป็น Branch ที่ถูกสร้างขึ้นจาก Branch develop
    • เป็น Branch ที่ใช้สำหรับดำเนินการ QA เพื่อที่จะทำการ Test หรือปรับแต่งรายละเอียดให้สมบูรณ์ เช่น ทำการแก้บั๊กก่อนที่จะ release
    • เมื่อทำการ QA เสร็จแล้ว จะทำการ Merge ไปที่ Branch master และ Branch develop
  • hotfix
    • ถ้าเจอบั๊กอยู่ในเวอร์ชันที่ release ไปแล้ว จะทำการแตก Branch ออกมาจาก master และทำการแก้ไขโดยด่วน
    • หลังจากที่ทำการแก้ไขแล้ว จะทำการ Merge ไปที่ Branch master และ Branch develop ทันที

ด้วยวิธีนี้ Git flow จะช่วยจัดการซอร์สโค้ดในระหว่างที่มีการระบุวัตถุประสงค์ของแต่ละ Branch ด้วยกระบวนการสร้าง แก้ไข และ merge Branch

วิธีการใช้ Git flow

เราจะมาทำการจำลองการติดตั้ง Git และ Git flow ในหัวข้อนี้

การเริ่มต้น Git flow

ขั้นตอนแรก เราจะมาเริ่มต้นที่ Git flow

git flow init -d

Command line option-dสามารถกำหนดชื่อ Branch ให้เป็นค่าเริ่มต้นได้โดยอัตโนมัติ
ทำการตรวจสอบ Branch โดยใช้คำสั่งgit branch

git branch
* develop
  master

หลังจากที่สร้าง Branch develop กับ Branch master ขึ้นมาแล้ว จะถูก checkout ไปที่ Branch develop ตามตัวอย่างด้านบน

การพัฒนา feature ด้วย Branch feature

ให้ใช้คำสั่งstartและสร้าง Branch feature เพื่อพัฒนา feature ใหม่

git flow feature start <feature name>

เมื่อ run คำสั่งgit branchและทำการตรวจสอบ

git branch
  develop
* feature/<feature name>
  master

จะเห็นว่า Branchfeature/<feature name>จะถูกสร้างขึ้นมาและ checkout ไปโดยอัตโนมัติ จากนั้นทำการพัฒนา<feature name>

ให้ทำการพัฒนา feature ใหม่ด้วย Branch นี้ ต่อมาให้ทำการสร้างไฟล์ text ขึ้นมา 1 ไฟล์

touch gf-handson.txt

ซึ่งการพัฒนา feature เสร็จสมบูรณ์แล้ว ต่อมาให้ทำการ merge Branch develop ด้วยคำสั่งfinish

git flow feature finish <feature name>

เมื่อ run คำสั่งนี้ไปแล้ว ขั้นตอนต่อไปจะถูกดำเนินการโดยอัตโนมัติ

  • merge Branch feature
  • ลบ Branch feature
  • checkout ไปที่ Branch develop

ถ้าในกรณีที่กำลังทำงานร่วมกันกับผู้พัฒนาคนอื่นโดยใช้แพลตฟอร์มอย่าง GitHub อยู่นั้น ก็สามารถที่จะ push Branch feature ไปยัง repository โดยใช้คำสั่งpublishได้เช่นกัน

git flow feature publish <feature name>

ในทางกลับกัน หากต้องการดึงข้อมูล Branch feature จาก repository กลับมา ก็ให้ใช้คำสั่งpull

git flow feature pull origin <feature name>

การเตรียม Release

ถ้า merge feature ทั้งหมดเพื่อที่จะ release ไปที่ Branch develop แล้ว จะทำการสร้างและทำการ QA ที่ Branch release

การสร้าง Branch release

git flow release start <version>

เมื่อตรวจสอบgit branchอีกครั้ง

git branch
  develop
  master
* release/<version>

จะเห็นว่า Branchrelease/<version>ถูกสร้างขึ้นและ checkout โดยอัตโนมัติเหมือนตัวอย่างด้านบน จากนั้นทำการ QA ที่ Branch release นี้

ถ้าเสร็จจากการทำ QA แล้ว ก็พร้อมที่จะ release แล้วก็จะเสร็จสมบูรณ์ จากนั้นทำการ merge Branch master และ Branch develop ด้วคำสั่งfinish

git flow release finish <version>

เมื่อ run คำสั่งนี้แล้ว ขั้นตอนต่อไปจะถูกดำเนินการโดยอัตโนมัติ

  • merge Branch release ไปที่ Branch master
  • merge Branch release ไปที่ Branch develop
  • ลบ Branch release

ถ้าในกรณีที่กำลังทำงานร่วมกับผู้พัฒนาคนอื่นที่เหมือนกับ Branch feature ก็ให้ push ไปยัง repository ด้วยคำสั่ง publish

git flow release publish <version>

ในกรณีที่จะดึงข้อมูล Branch release จาก repository มานั้น ให้ใช้คำสั่งtrackแล้วก็ต้องระวังการใช้คำสั่ง เนื่องจากว่าไม่ใช่วิธีการpull

git flow release track <version>

Release

ขั้นตอนนี้ Branch master จะมีซอร์สโค้ดของเวอร์ชัน release ใหม่ออกมา

สุดท้ายนี้ จะทำการpushBranch master พร้อมกับ Tag ไปยัง ripository และทำการ release

git push --tags

Hotfix

hotfix คือเมื่อเกิดบั๊กในเวอร์ชันที่ release ไปแล้ว จะสามารถแก้ไขด่วนได้ที่ Branch hotfix

ขั้นตอนแรก สร้าง Branch hotfix

git flow hotfix start <version>

หลังจากที่แก้ไขบั๊กโดยด่วนใน Branch hotfix ที่สร้างขึ้นมาแล้ว ก็ให้ merge ไปยัง Branch master โดยใช้คำสั่งfinish

git flow hotfix finish <version>

เมื่อ run คำสั่งนี้แล้ว ขั้นตอนต่อไปจะถูกดำเนินการโดยอัตโนมัติ

  • merge Branch hotfix ไปยัง Branch master
  • merge Branch hotfix ไปยัง Branch develop
  • ลบ Branch hotfix

ด้วยวิธีนี้ สามารถใช้ model Git flow ในการพัฒนาโปรเจ็กต์เพื่อให้มีประสิทธิภาพมากขึ้นได้อีกด้วย

สรุป

จนถึงตอนนี้ก็ได้อธิบายเกี่ยวกับแนวคิดและการพัฒนาของ Git flow ไปแล้ว

สิ่งหนึ่งที่ควรระวังขณะที่พัฒนางานด้วย Git-flow คือการหลีกเลี่ยงที่จะทำให้เกิด conflict ของซอร์สโค้ดในแต่ละ Branch ตัวอย่างเช่น Branch feature ที่สร้างจาก Branch develop ต้องมีข้อมูลของ develop อยู่เสมอ

!ในกรณีที่ทำงานร่วมกับผู้พัฒนาคนอื่นหรือในทีมโดยใช้แพลตฟอร์มอย่าง GitHub ให้ทำการ push กับ pull บ่อยๆ เพื่อป้องกันการเกิด conflict

(ลิงก์ด้านล่างนี้คือ บล็อกของ Vincent Driessen ผู้สร้าง Git flow)

หวังว่าเนื้อหาบล็อกนี้จะมีประโยชน์กับเพื่อนๆ ไม่มากก็น้อย
ขอขอบคุณที่มา: Git flowをざっと整理してみた