Git เป็นระบบการควบคุมเวอร์ชันแบบกระจาย นำเสนอเทคนิคขั้นสูงมากมายที่สามารถมีประสิทธิภาพอย่างไม่น่าเชื่อเมื่อใช้อย่างถูกต้อง อย่างไรก็ตาม เทคนิคเหล่านี้มักไม่ได้รับการสำรวจโดยผู้เริ่มต้นเนื่องจากความซับซ้อน ในบทความนี้ เราจะเจาะลึกเทคนิคขั้นสูงบางส่วนเหล่านี้ โดยเฉพาะการรีเบส (Rebasing) การติดแท็ก (Tagging) การเลือกเชอร์รี่ (Cherry-picking) และการใช้โมดูลย่อย (Submodules) แม้ว่าเครื่องมือเหล่านี้จะซับซ้อน แต่ก็สามารถเพิ่มประสิทธิภาพการจัดการโครงการและความสามารถในการทำงานร่วมกันได้อย่างมากเมื่อทำแอพ
1. การรีเบส (Rebasing)
การรีเบส (Rebasing) เป็นทางเลือกแทนการรวม แทนที่จะสร้างคอมมิชชันใหม่ที่รวมสองสาขาที่แตกต่างกัน (เช่นเดียวกับการผสาน(merging)) การรีเพลย์ “replays” การเปลี่ยนแปลงจากสาขาหนึ่งไปยังอีกสาขาหนึ่ง สิ่งนี้นำไปสู่ประวัติการกระทำเชิงเส้นและง่ายต่อการติดตาม
สมมติว่าเรามีสาขาคุณลักษณะที่เราได้ทำข้อตกลงไว้ แต่ในขณะเดียวกันสาขาหลักก็ก้าวไปข้างหน้าเช่นกัน เราสามารถ Rebase Feature Branch ของเราที่ด้านบนของ Main Branch โดยใช้:
git checkout feature
git rebase main
ในระหว่างการรีเบส ความขัดแย้งอาจเกิดขึ้น Git จะหยุดชั่วคราวและอนุญาตให้คุณแก้ไขข้อขัดแย้งก่อนที่จะดำเนินการต่อ หลังจากแก้ไขแล้ว คุณสามารถใช้ git add .
เพื่อจัดลำดับไฟล์ที่ได้รับการแก้ไข จากนั้นทำการรีเบสต่อด้วย git rebase --continue
หากต้องการยกเลิกกระบวนการรีเบสทั้งหมด ให้ใช้ git rebase --abort
หนึ่งในตัวเลือกที่ทรงพลังสำหรับข้อเสนอการรีเบสคือการรีเบสแบบโต้ตอบ สิ่งนี้สามารถเรียกใช้ด้วย git rebase -i
โหมดนี้ให้คุณแก้ไขการคอมมิตแต่ละรายการในกระบวนการ: คุณสามารถรวมเข้าด้วยกัน เปลี่ยนข้อความคอมมิต หรือแม้แต่ลบออกทั้งหมด มักใช้เพื่อล้างประวัติการคอมมิตก่อนที่จะรวมฟีเจอร์สาขากลับเข้าไปในสาขาหลัก
2. การแท็ก (Tagging)
ในวงจรชีวิตของการทำแอพ จะมีจุดที่ซอฟต์แวร์รุ่นใดรุ่นหนึ่งของคุณแสดงถึงความสำเร็จครั้งสำคัญ เช่น รุ่นเบต้า รุ่น 1.0 การแก้ไขจุดบกพร่องที่สำคัญ เป็นต้น จุดสำคัญเหล่านี้เป็นโอกาสที่ดีในการใช้คุณลักษณะการแท็กของ Git .
แท็กใน Git เป็นตัวชี้ไปยังคอมมิชชันเฉพาะ ทำให้คุณมีวิธีบุ๊กมาร์กบางจุดในประวัติโครงการของคุณ การสร้างแท็กนั้นง่ายมาก:
git tag v1.0
สิ่งนี้จะสร้างแท็กที่มีน้ำหนักเบาชื่อ (lightweight tag named) “v1.0” ที่การกระทำปัจจุบัน อย่างไรก็ตาม บ่อยครั้งคุณจะต้องสร้างแท็กที่มีคำอธิบายประกอบ ซึ่งช่วยให้คุณเก็บข้อมูลเมตาเพิ่มเติมได้ สามารถทำได้ด้วย:
git tag -a v1.0 -m "Version 1.0 release"
คุณสามารถดูแท็กที่มีอยู่ทั้งหมดด้วย git tag
และคุณสามารถชำระเงินไปยังแท็กเฉพาะได้เช่นเดียวกับสาขาด้วย git checkout v1.0
3. การเก็บเชอร์รี่ (Cherry-picking)
ในกระบวนการทำแอพ อาจมีบางสถานการณ์ที่คุณทำข้อตกลงกับสาขาหนึ่ง แต่คุณต้องการใช้ข้อตกลงนั้นกับอีกสาขาหนึ่งโดยไม่รวมสาขาทั้งหมดเข้าด้วยกัน นี่คือที่ cherry-pick
มาของคำสั่งที่มีประโยชน์
Cherry-pick ใช้การเปลี่ยนแปลงที่แนะนำโดยการคอมมิตที่มีอยู่ หากต้องการใช้งาน คุณต้องทราบแฮชของคอมมิชชันที่คุณต้องการเลือก สมมติว่าคุณมีคอมมิชชันที่มีแฮช abc123
ที่คุณต้องการนำไปใช้กับสาขาปัจจุบันของคุณ คุณจะใช้:
git cherry-pick abc123
หากคอมมิชชันใช้ได้อย่างหมดจด ก็แค่นั้นแหละ! ถ้าไม่ คุณจะต้องแก้ไขข้อขัดแย้ง จากนั้นเลือกเชอร์รี่ต่อไปด้วย git cherry-pick --continue
หากต้องการยกเลิกกระบวนการ คุณสามารถใช้ git cherry-pick --abort
4. โมดูลย่อย (Submodules)
เมื่อทำแอพ คุณอาจต้องรวมไลบรารีหรือโมดูลภายนอก ด้วย Git สิ่งนี้เกิดขึ้นได้โดยใช้โมดูลย่อย โมดูลย่อยช่วยให้คุณเก็บ Git repository เป็นไดเร็กทอรีย่อยของ Git repository อื่น สิ่งนี้ทำให้คุณสามารถโคลนที่เก็บอื่นในโครงการของคุณและแยกการกระทำของคุณออกจากกัน
หากต้องการเพิ่มโมดูลย่อย คุณสามารถใช้คำสั่งต่อไปนี้:
git submodule add https://github.com/example/repo.git
คำสั่งนี้สร้างไฟล์ใหม่ที่ชื่อว่า .gitmodules
ซึ่งจัดเก็บการแมประหว่าง URL ของโครงการและไดเร็กทอรีย่อยในเครื่องที่คุณดึงลงมา ในการโคลนโครงการด้วยโมดูลย่อย คุณสามารถใช้:
git clone --recurse-submodules https://github.com/example/repo.git
สิ่งสำคัญคือต้องจำไว้ว่าเมื่อคุณอยู่ในโมดูลย่อย คุณกำลังทำงานในที่เก็บอื่นที่มีประวัติและสาขาของตัวเอง ดังนั้น หากคุณต้องการดึงการเปลี่ยนแปลงล่าสุดจากอัพสตรีมของโมดูลย่อยในขณะที่คุณอยู่ในโมดูลย่อย คุณควรทำ git pull
การเรียนรู้เทคนิค Git ขั้นสูงเหล่านี้จะช่วยให้คุณมีเครื่องมือที่จำเป็นในการทำแอพและจัดการโค้ดเบสของคุณอย่างมีประสิทธิภาพ โดยเฉพาะอย่างยิ่งเมื่อทำแอพที่ซับซ้อนมากขึ้น อนุญาตประวัติการคอมมิตที่สะอาด การควบคุมเวอร์ชันที่สำคัญ แอ็พพลิเคชันการคอมมิตแบบเลือก และการจัดการไลบรารีภายนอกอย่างมีประสิทธิภาพ เช่นเดียวกับเครื่องมืออื่น ๆ พวกเขาต้องการการฝึกฝนเพื่อใช้อย่างเชี่ยวชาญ ดังนั้นฉันขอแนะนำให้คุณทดสอบในโครงการถัดไปของคุณ โปรดจำไว้เสมอว่า ช่างฝีมือที่ดีจะไม่โทษเครื่องมือของเขา แต่ช่างฝีมือที่ดีจะรู้จักเครื่องมือของเขาทั้งภายในและภายนอก Git ก็ไม่มีข้อยกเว้น