DEV Community

kimidev
kimidev

Posted on

การใช้งาน Git Rebase: คู่มือฉบับสมบูรณ์

บทนำ

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

Git Rebase คืออะไร?

git rebase คือคำสั่งที่ใช้ในการเปลี่ยนจุดเริ่มต้น (base) ของสาขา (branch) จากคอมมิตหนึ่งไปยังอีกคอมมิตหนึ่ง โดยจะนำการเปลี่ยนแปลงที่อยู่ในสาขาของเรา (feature branch) ไปวางซ้อนทับบนปลายของสาขาเป้าหมาย (target branch) เสมือนว่าเราสร้างสาขาใหม่จากจุดปัจจุบันของสาขาเป้าหมายแล้วทำการเปลี่ยนแปลงเดิมซ้ำอีกครั้ง

ความแตกต่างหลักระหว่าง merge และ rebase คือ:

  • merge จะสร้างคอมมิตใหม่ที่รวมการเปลี่ยนแปลงจากทั้งสองสาขา ส่งผลให้เกิด merge commit
  • rebase จะย้ายคอมมิตของสาขาเราไปต่อท้ายสาขาเป้าหมาย ทำให้ประวัติคอมมิตเป็นเส้นตรง สะอาด และไม่มี merge commit

รูปแบบพื้นฐานของคำสั่ง Git Rebase

git rebase <สาขาเป้าหมาย>
Enter fullscreen mode Exit fullscreen mode

ตัวอย่างเช่น เมื่อคุณทำงานในสาขา feature และต้องการ rebase กับสาขา main ที่อัพเดทล่าสุด:

git checkout feature
git rebase main
Enter fullscreen mode Exit fullscreen mode

วิธีการใช้งาน Git Rebase อย่างละเอียด

1. การ Rebase พื้นฐาน

สมมติว่าคุณมีสถานการณ์ดังนี้:

      A---B---C (feature)
     /
D---E---F---G (main)
Enter fullscreen mode Exit fullscreen mode

เมื่อคุณรัน git checkout feature ตามด้วย git rebase main คุณจะได้:

              A'--B'--C' (feature)
             /
D---E---F---G (main)
Enter fullscreen mode Exit fullscreen mode

คอมมิต A, B, และ C จะถูกสร้างใหม่เป็น A', B', และ C' โดยมีฐานเป็นคอมมิต G แทน

2. Interactive Rebase

Interactive rebase เป็นเครื่องมือที่ทรงพลังมากสำหรับการจัดการประวัติคอมมิต คุณสามารถใช้มันเพื่อ:

  • รวมหลายคอมมิตเข้าด้วยกัน (squash)
  • แก้ไขข้อความคอมมิต (reword)
  • ลบคอมมิตที่ไม่ต้องการ (drop)
  • แยกคอมมิตออกเป็นส่วนย่อย (split)
  • เรียงลำดับคอมมิตใหม่ (reorder)

วิธีใช้:

git rebase -i <commit-hash หรือ HEAD~n>
Enter fullscreen mode Exit fullscreen mode

เช่น เพื่อแก้ไข 3 คอมมิตล่าสุด:

git rebase -i HEAD~3
Enter fullscreen mode Exit fullscreen mode

คำสั่งนี้จะเปิดตัวแก้ไขข้อความที่แสดงรายการคอมมิตและคำสั่งที่เป็นไปได้:

pick 2231360 เพิ่มฟีเจอร์การล็อกอิน
pick 3f5b85c แก้บัก UI
pick a92f124 อัพเดทเอกสาร

# คำสั่งที่เป็นไปได้:
# p, pick = ใช้คอมมิต
# r, reword = ใช้คอมมิตแต่แก้ไขข้อความ
# e, edit = ใช้คอมมิตแต่ต้องการแก้ไขเพิ่มเติม
# s, squash = ใช้คอมมิตแต่รวมกับคอมมิตก่อนหน้า
# f, fixup = เหมือน squash แต่ไม่เก็บข้อความคอมมิต
# x, exec = รันคำสั่งโดยใช้ shell
# d, drop = ลบคอมมิต
Enter fullscreen mode Exit fullscreen mode

3. การแก้ไขความขัดแย้ง (Conflict Resolution)

บางครั้งการ rebase อาจก่อให้เกิดความขัดแย้ง (conflict) เมื่อการเปลี่ยนแปลงในสาขาของคุณขัดแย้งกับการเปลี่ยนแปลงในสาขาเป้าหมาย

ขั้นตอนการแก้ไขความขัดแย้ง:

  1. Git จะหยุด rebase และแจ้งให้คุณทราบว่ามีความขัดแย้ง
  2. ทำการแก้ไขไฟล์ที่มีความขัดแย้ง (Git จะทำเครื่องหมายส่วนที่ขัดแย้งไว้)
  3. เมื่อแก้ไขเสร็จแล้ว ให้ใช้คำสั่ง git add <ไฟล์ที่แก้ไขแล้ว>
  4. ดำเนินการ rebase ต่อด้วยคำสั่ง git rebase --continue
  5. หากต้องการยกเลิกการ rebase ใช้คำสั่ง git rebase --abort

4. การใช้ --onto ในการ Rebase

--onto เป็นตัวเลือกขั้นสูงที่ช่วยให้คุณสามารถระบุจุดปลายทางที่แน่นอนสำหรับการ rebase:

git rebase --onto <newbase> <oldbase> <branch>
Enter fullscreen mode Exit fullscreen mode

ตัวอย่างเช่น สมมติว่าคุณมีโครงสร้างสาขาดังนี้:

      A---B---C---D---E (feature)
     /
X---Y---Z (main)
Enter fullscreen mode Exit fullscreen mode

หากคุณต้องการย้ายเฉพาะคอมมิต D และ E ไปที่สาขา main:

git rebase --onto main C feature
Enter fullscreen mode Exit fullscreen mode

ผลลัพธ์จะเป็น:

      A---B---C
     /
X---Y---Z---D'---E' (feature)
         (main)
Enter fullscreen mode Exit fullscreen mode

แนวปฏิบัติที่ดีในการใช้งาน Git Rebase

1. อย่า Rebase สาขาสาธารณะ

กฎทองของการ rebase คือ: อย่า rebase สาขาที่มีการแชร์กับผู้อื่นแล้ว เพราะการ rebase จะเปลี่ยน commit hash ทั้งหมด ทำให้ประวัติที่ผู้อื่นมีไม่ตรงกันกับของคุณ นำไปสู่ความสับสนและปัญหาในการทำงานร่วมกัน

ใช้ rebase เฉพาะกับ:

  • สาขาส่วนตัวที่ยังไม่ได้ push ไปยัง remote repository
  • สาขาที่คุณทำงานคนเดียว และเข้าใจผลกระทบของการ rebase

2. ทำการ Pull และ Update สาขาหลักอย่างสม่ำเสมอ

เพื่อลดโอกาสเกิดความขัดแย้ง ควรอัพเดทสาขาหลัก (เช่น main หรือ develop) อยู่เสมอและทำการ rebase สาขาของคุณกับสาขาหลักที่อัพเดทล่าสุด:

git checkout main
git pull
git checkout feature-branch
git rebase main
Enter fullscreen mode Exit fullscreen mode

3. ใช้ Interactive Rebase ก่อนการ Push

ก่อนที่จะ push งานของคุณ ควรใช้ interactive rebase เพื่อจัดการกับประวัติคอมมิตให้สะอาด:

git rebase -i origin/main
Enter fullscreen mode Exit fullscreen mode

จากนั้นทำการ:

  • รวม (squash) คอมมิตที่เกี่ยวข้องกัน
  • แก้ไขข้อความคอมมิตให้ชัดเจน
  • ลบคอมมิตชั่วคราวหรือไม่สำคัญ

4. บันทึกงานก่อนการ Rebase เสมอ

เนื่องจาก rebase เป็นการปรับเปลี่ยนประวัติ จึงมีความเสี่ยงที่จะเกิดความผิดพลาด ควรสำรองงานของคุณก่อนทำการ rebase ซึ่งสามารถทำได้หลายวิธี:

# สร้างสาขาสำรองก่อน rebase
git branch backup-feature feature

# หรือใช้ git stash หากมีการเปลี่ยนแปลงที่ยังไม่ได้คอมมิต
git stash
Enter fullscreen mode Exit fullscreen mode

ตัวอย่างการใช้งานในสถานการณ์จริง

สถานการณ์ 1: การอัพเดทสาขาฟีเจอร์ให้ทันสมัย

# อัพเดทสาขา main
git checkout main
git pull

# rebase สาขาฟีเจอร์กับ main
git checkout feature
git rebase main
Enter fullscreen mode Exit fullscreen mode

สถานการณ์ 2: การทำให้ประวัติคอมมิตสะอาดก่อนสร้าง Pull Request

# รวมคอมมิตที่เกี่ยวข้องเข้าด้วยกันและทำให้ประวัติสะอาด
git rebase -i HEAD~5  # สมมติว่ามี 5 คอมมิตที่ต้องการจัดการ

# จากนั้น push แบบ force (ระวัง!)
git push --force-with-lease
Enter fullscreen mode Exit fullscreen mode

สถานการณ์ 3: การย้ายฟีเจอร์ไปยังสาขาที่ถูกต้อง

สมมติว่าคุณเริ่มพัฒนาฟีเจอร์ใหม่บนสาขาที่ผิด (เช่น develop แทนที่จะเป็น feature/new-login):

# สร้างสาขาฟีเจอร์ใหม่จากตำแหน่งปัจจุบัน
git checkout -b feature/new-login

# ย้อนกลับไปยังคอมมิตก่อนที่จะเริ่มพัฒนาฟีเจอร์
git checkout develop
git reset --hard HEAD~3  # สมมติว่าคุณเพิ่ม 3 คอมมิตเกี่ยวกับฟีเจอร์ใหม่

# หรือใช้ git rebase --onto
git rebase --onto develop HEAD~3 feature/new-login
Enter fullscreen mode Exit fullscreen mode

สรุป

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

ประโยชน์หลักของการใช้ rebase:

  • สร้างประวัติการคอมมิตที่สะอาดและเป็นเส้นตรง
  • หลีกเลี่ยง merge commit ที่ไม่จำเป็น
  • ทำให้การติดตามการเปลี่ยนแปลงและการแก้บักง่ายขึ้น

เพียงจำไว้ว่า: อย่า rebase สาขาที่แชร์กับผู้อื่นแล้ว และเตรียมพร้อมสำหรับการแก้ไขความขัดแย้งในระหว่างการ rebase เสมอ

การฝึกฝนและทดลองใช้งาน Git Rebase ในโปรเจคส่วนตัวจะช่วยให้คุณคุ้นเคยและมั่นใจในการใช้คำสั่งนี้กับโปรเจคที่ใหญ่ขึ้น


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

Top comments (0)