การรวม Branch ขั้นสูง: Git Rebasing

Git ขั้นสูง

Amanda Crawford-Adamo

Software and Data Engineer

Git rebase

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

คำสั่ง Git Rebase:

git rebase <branch_name>
Git ขั้นสูง

ตัวอย่าง Rebase - ก่อน

ภาพแสดง feature branch ชื่อ data cleanup และ main branch โดย feature branch แยกออกหลัง commit ที่สองของ main และ main branch มี commit เพิ่มอีกสองรายการหลังจาก data cleanup branch ถูกสร้างขึ้น

Git ขั้นสูง

กระบวนการ Rebase

  1. Checkout ไปยัง feature branch data-cleanup
git checkout data-cleanup
  1. Rebase branch main ลงบน branch data-cleanup
git rebase main
  • commit ของ data-cleanup จะถูกสร้างใหม่ต่อจาก commit ล่าสุดของ main
  • commit ของ data-cleanup ที่ถูก rebase จะได้รับ hash ใหม่

หมายเหตุ: หากมี conflict ใดๆ จะต้องแก้ไขด้วยตนเอง

Git ขั้นสูง

ตัวอย่าง Rebase - หลัง

ภาพแสดง data cleanup branch หลังถูก rebase ลงบน main branch โดย data cleanup branch มี commit ทั้งหมดของ main และ commit ของ data cleanup จะเริ่มต่อจาก commit ล่าสุดของ main ส่วน main branch ไม่มีการเปลี่ยนแปลง

Git ขั้นสูง

Interactive Rebase

git rebase -i <commit_hash> 

การทำงาน

  • ให้นักพัฒนาแก้ไข commit หลายรายการได้อย่างละเอียด
  • เปิด editor ขึ้นมา

คำเตือน!

  • การ rebase branch สาธารณะอาจรบกวน workflow
    • ไม่ควรใช้ rebase กับ branch สาธารณะ เช่น main
  • กำหนดกฎของทีมสำหรับการใช้ rebase
Git ขั้นสูง

Interactive Rebase - ก่อน

$$

นี่คือ ประวัติของ branch data-validation ก่อนที่จะแก้ไข commit history

$ git log --oneline data-validation
abc1234 Optimize validation performance
def5678 Fix validation bug
ghi9101 Add data validation function
xyz1234 New Main Branch Commit
vwx7890 Main Branch Commit
jkl2345 Initial commit
Git ขั้นสูง

Interactive Rebase Editor

วิธีแก้ไข commit history โดยใช้คำสั่ง pick และ fixup ใน editor ที่เปิดขึ้น

$ git rebase -i HEAD~3 
pick ghi9101 Add data validation function
fixup def5678 Fix validation bug
fixup abc1234 Optimize validation performance

# Rebase xyz1234..abc1234 onto HEAD~3(xyz1234) (3 commands)
#
# Commands:
# p, pick <commit> = use commit
# f, fixup <commit> = like "squash", but discard this commit's log message
...
Git ขั้นสูง

Interactive Rebase - หลัง

ก่อน

$ git log --oneline data-validation
abc1234 Optimize validation performance
def5678 Fix validation bug
ghi9101 Add data validation function
xyz1234 New Main Branch Commit
vwx7890 Main Branch Commit
jkl2345 Initial commit

หลัง

$ git log --oneline data-validatoin
mno6789 Add data validation function
xyz1234 New Main Branch Commit
vwx7890 Main Branch Commit
jkl2345 Initial commit

commit ต่อไปนี้ถูกรวมเป็นหนึ่งเดียว

  • abc1234
  • def5678
  • ghi9101
Git ขั้นสูง

Merge เทียบกับ Rebase

ภาพแสดงกราฟสามแบบ ได้แก่ กราฟ branch ที่แยกออก ผลลัพธ์จาก merge และผลลัพธ์จาก rebase

Merge

  • เก็บประวัติและโครงสร้าง branch ไว้ครบถ้วน
  • รักษาบริบทของการพัฒนาแบบขนาน

Rebase

  • นำ commit ไปต่อบน branch เป้าหมาย
  • สร้างประวัติแบบเส้นตรง
  • สูญเสียข้อมูลบริบทบางส่วน
Git ขั้นสูง

เมื่อไรควรใช้ Merge หรือ Rebase

Merge

ใช้สำหรับรวม feature ที่เสร็จแล้ว และเมื่อต้องการเก็บบริบทการพัฒนาไว้

Rebase

ใช้สำหรับอัปเดต feature branch ให้ทันกับ main หรือจัดระเบียบก่อน merge

จำไว้

  • Rebase เขียนประวัติใหม่ — ใช้ด้วยความระมัดระวัง
Git ขั้นสูง

มาฝึกกันเถอะ!

Git ขั้นสูง

Preparing Video For Download...