Git คือ ตอนที่ 3 : การแตกแขนง (Branching) และการผสาน (Merging)

  1. ทำความเข้าใจเกี่ยวกับแนวคิดของการแตกแขนง (conflicts)
  2. การเปลี่ยนแปลงและการยอมรับการเปลี่ยนแปลง (Committing)
  3. รวมสาขา (Merging Branches)
  4. การแก้ไขข้อขัดแย้งในการผสาน (Merge Conflicts)
  5. ทำความเข้าใจกับการผสาน (Merges) แบบ Fast-Forward

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

1. ทำความเข้าใจเกี่ยวกับแนวคิดของการแตกแขนง (Branching)

ในรูปแบบที่ง่ายที่สุด แบรนช์ใน Git เป็นชุดของการเปลี่ยนแปลงโค้ดที่ไม่ซ้ำใครพร้อมชื่อที่ไม่ซ้ำใคร ที่เก็บแต่ละแห่งสามารถมีหนึ่งสาขาขึ้นไป และสาขาหลัก (เรียกอีกอย่างว่าสาขา ‘master’ ใน Git เวอร์ชันเก่า) เป็นสาขาเริ่มต้นเมื่อคุณสร้างที่เก็บ (repository)

เพื่อแสดงให้เห็น สมมติว่าคุณกำลังทำแอพสภาพอากาศ คุณมีmainสาขาที่อยู่ในสถานะปรับใช้เสมอ คุณต้องการเพิ่มคุณลักษณะใหม่ให้กับแอปของคุณที่แสดงระดับความชื้น แทนที่จะแก้ไข main สาขาโดยตรง (และอาจทำให้เกิดข้อบกพร่อง) คุณต้องสร้างสาขาใหม่ที่ add-humidity-feature ชื่อว่า สาขาใหม่นี้เป็น main สาขาที่ซ้ำกันอย่างสมบูรณ์แบบในขณะที่สร้าง

หากต้องการสร้างสาขาใหม่ คุณจะต้องใช้คำสั่ง git branch add-humidity-feature: สิ่งนี้สร้างสาขาใหม่ แต่คุณยังคงอยู่ใน main สาขา หากต้องการสลับไปยังสาขาที่สร้างขึ้นใหม่ ให้ใช้คำสั่ง git checkout add-humidity-feature:

2. การเปลี่ยนแปลงและการยอมรับการเปลี่ยนแปลง (Committing)

ใน add-humidity-feature สาขา คุณสามารถเปลี่ยนแปลงโค้ดแอปพลิเคชันได้ เช่น เพิ่มฟังก์ชันใหม่หรือแก้ไขที่มีอยู่เพื่อรองรับคุณสมบัติการแสดงความชื้นใหม่ หลังจากทำการเปลี่ยนแปลงแล้ว ให้คุณจัดลำดับไฟล์ที่แก้ไขด้วย git add . และยอมรับการเปลี่ยนแปลงด้วย git commit -m "Add humidity feature".

การเปลี่ยนแปลงเหล่านี้มีผลเฉพาะกับ add-humidity-feature สาขาและจะไม่ส่งผลกระทบต่อmainสาขา ทำให้สามารถพัฒนาแบบแยกส่วนได้ คุณสามารถทดลองฟีเจอร์ใหม่ๆ ได้อย่างอิสระโดยไม่ต้องกังวลว่าmainสาขา จะแตก

3. รวมสาขา (Merging Branches)

เมื่อคุณลักษณะใหม่เสร็จสมบูรณ์และผ่านการทดสอบแล้ว ก็ถึงเวลารวมการเปลี่ยนแปลงจากลง add-humidity-feature ใน main การผสานคือกระบวนการรับการเปลี่ยนแปลงจากสาขาหนึ่ง (ในกรณีนี้ add-humidity-feature) และรวมเข้ากับอีกสาขาหนึ่ง (ในกรณีนี้ main)

อันดับแรก เปลี่ยนกลับไปที่mainสาขาโดยใช้ git checkout main จากนั้นหากต้องการรวมสาขาใหม่เข้าไป main ให้ใช้คำสั่ง git merge add-humidity-feature: จากนั้น Git จะรวมคอมมิชชันจาก add-humidity-feature สาขาเข้ากับmainสาขา

4. การแก้ไขข้อขัดแย้งในการผสาน (Merge Conflicts)

บางครั้งเมื่อคุณพยายามรวมสาขา Git ไม่สามารถรวมการเปลี่ยนแปลงได้อย่างราบรื่นเนื่องจากสาขาแยกออกจากกัน จุดแตกต่างเหล่านี้คือ ‘conflicts’ ที่ Git ไม่สามารถแก้ไขได้โดยอัตโนมัติและต้องมีการแทรกแซงด้วยตนเอง

ตัวอย่างเช่น สมมติว่าคนสองคนกำลังใช้งานแอพพยากรณ์อากาศพร้อมกัน คนหนึ่งทำงานใน add-humidity-feature สาขา และอีกคนทำงานใน main สาขา ทั้งคู่แก้ไขบรรทัดเดียวกันในไฟล์เดียวกัน Git ไม่มีทางรู้ว่าการเปลี่ยนแปลงใดถูกต้องและตั้งค่าสถานะนี้ว่าขัดแย้งกัน

เมื่อมีข้อขัดแย้งเกิดขึ้น Git จะแสดงข้อความแจ้งว่ามีข้อขัดแย้ง และการเรียกใช้ git status จะแสดงไฟล์ที่ต้องการการแก้ไขข้อขัดแย้ง ภายในไฟล์เหล่านั้น Git จะทำเครื่องหมายบริเวณที่มีข้อขัดแย้งเกิดขึ้น เพื่อให้คุณสามารถแก้ไขได้ด้วยตนเอง พื้นที่ที่ขัดแย้งกันจะถูกล้อมรอบด้วย <<<<<<, ======, และ >>>>>> ซึ่งระบุโค้ดที่ขัดแย้งกันจากสองสาขาที่แตกต่างกัน

คุณจะต้องแก้ไขไฟล์ด้วยตนเองเพื่อแก้ไขข้อขัดแย้ง นำเครื่องหมายข้อขัดแย้งออก จากนั้นจัดลำดับและยืนยันไฟล์ที่แก้ไขแล้ว

5. ทำความเข้าใจกับการผสาน (Merges) แบบ Fast-Forward

ในบางกรณี เมื่อคุณรวมสองสาขาเข้าด้วยกัน Git จะทำการผสานที่เรียกว่า “fast-forward” สิ่งนี้เกิดขึ้นเมื่อไม่มีคอมมิชชันใหม่ใน main สาขาตั้งแต่คุณสร้าง add-humidity-feature สาขา

ในการผสานไปข้างหน้าอย่างรวดเร็ว Git เพียงแค่เลื่อน HEAD ตัวชี้ขึ้นไปที่การกระทำล่าสุดใน add-humidity-feature สาขา เป็นการรวมประวัติของทั้งสองสาขาอย่างมีประสิทธิภาพ เนื่องจากไม่มีความแตกต่างระหว่างทั้งสองสาขา


การแตกสาขาและการรวมเป็นแนวคิดพื้นฐานสองประการของ Git ที่นักพัฒนาแอปทุกคนจำเป็นต้องเข้าใจ Branches จัดเตรียมสภาพแวดล้อมแบบแยกส่วนสำหรับทุกฟีเจอร์หรือการแก้ไขจุดบกพร่อง ทำให้การทดสอบปลอดภัยโดยไม่ส่งผลกระทบต่อโค้ดเบสหลัก การผสานช่วยให้นักพัฒนาสามารถรวมความพยายามของพวกเขาเข้าด้วยกัน ผสานรวมการเปลี่ยนแปลงจากสาขาหนึ่งไปยังอีกสาขาหนึ่ง การทำความเข้าใจวิธีนำทางความขัดแย้งเป็นกุญแจสำคัญในการทำงานร่วมกันอย่างมีประสิทธิภาพโดยใช้ Git

คำสั่งเหล่านี้ไม่ใช่แค่คำสั่งที่ต้องจำ แต่เป็นแนวคิดที่ต้องทำความเข้าใจ เป็นพื้นฐานของเวิร์กโฟลว์และแนวทางปฏิบัติมากมายในทีมพัฒนามืออาชีพ เมื่อคุณทำแอพและทำงานร่วมกันในโครงการต่อไป คุณจะพบว่าการแยกสาขาและการรวมเป็นเครื่องมือที่ทรงคุณค่าในชุดเครื่องมือ Git ของคุณ


Git คืออะไร

Git คือ ตอนที่ 2 : Git เบื้องต้น
Git คือ ตอนที่ 4 : การทำงานระยะไกล (Remotes) และการทำงานร่วมกัน (Collaboration)