Rebase คืออะไร

วันนี้และเมื่อวานค้นพบว่าเพื่อนยังงงกับ rebase อยู่ และยังคงสงสัยว่าทำไปทำไม ก็เลยเขียนในบล๊อกรวดเดียวเก็บไว้อธิบายทีหลังเลยละกัน เพราะจริงๆ แล้วก็พึ่งรู้ว่ามีความจำเป็นยังไงไม่นานมานี้เอง แต่ก่อนจะไปถึง rebase ขอย้อนมาดูขั้นตอนการรวม branch ของ svn หรือระบบที่มีศูนย์กลางกันก่อน โดยคร่าวๆ คือ

  1. แก้ไขเอกสารต่างๆ แล้ว commit ลง server
  2. สั่ง merge จาก branch หลักมาที่ branch ที่แก้ไขอยู่
  3. แก้ไข conflict ที่เกิดขึ้น
  4. commit การแก้ไขที่เกิดจาก conflict
  5. switch ไป branch หลัก
  6. สั่ง merge จาก branch ที่แก้ไขกลับมาที่ branch หลัก
  7. commit สิ่งที่ merge มา

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

A คือกิ่งหลัก ส่่วน B คือกิ่งที่แตกออกมาเพื่อเพิ่มหรือแก้ไข

กลับมาเรื่อง rebase การ rebase เหมือนการตัดต่อกิ่ง โดยย้ายจากจุดเชื่อมต่อเดิมไปยังจุดเชื่อมใหม่ เพื่อให้เอกสารในกิ่งมีการปรับปรุงเท่าการเปลี่ยนแปลงในกิ่งหลักตามจุดที่ย้ายไป

ภาพบนคือก่อน rebase ภาพล่างคือหลังจาก rebase แล้ว โดย rebase branch B ไปยังปลาย branch A

โดยปกติแล้ว ถ้าเป็นกิ่งธรรมดาทั่วไปก็ไม่จำเป็นต้อง rebase แต่อย่างใด สามารถ merge การแก้ไขจากกิ่งหลักมารวมกับกิ่งที่แก้ไขอยู่ได้ เพื่อเก็บสิ่งที่แก้ไขในอดีต และใน svn หรือระบบที่มีศูนย์กลางก็ไม่ค่อยมีคำสั่งนี้ให้ใช้แต่อย่างใด แต่คำสั่งนี้จะเจอในระบบแบบกระจายศูนย์เช่น hg หรือ git เนื่องจาก เมื่อแต่ละคน clone เอาเอกสารไปแล้วแก้ไขเอกสารนั้นในเครื่อง แต่ละคนก็เหมือนมีกิ่งของตนเอง เมื่อแต่ละคนต้องเอาสิ่งที่แก้ไปมารวมกัน ก็ต้องมีการรวมการแก้ไข ซึ่งหากใช้วิธี merge สิ่งที่ได้ก็อาจจะกลายเป็นแบบภาพด้านล่าง หรือภาพที่หนึ่ง

Merge directly to trunk
แต่ที่ต้องการจริงๆ แล้วอาจจะเป็นเส้นตรง เพราะการแก้ไขไม่ได้เกิดจากการเพิ่มเติม หรือแก้ไขข้อผิดพลาดในรุ่นก่อนๆ  คราวนี้มาดูวิธีทำใน hg แบบ command line กันดีกว่า(สำหรับ Windows จะเขียนถึงอีกทีพรุ่งนี้)

  1. แก้ไขไฟล์ .hg/hgrc โดยเพิ่ม rebase option เพื่อให้มี option นี้ตอน pull
    [extensions]
    rebase =
  2. จากนั้นทุกครั้งที่ pull ก็สั่ง hg pull –rebase

ขั้นตอนนั้นง่ายสำหรับคนถนัด command line/shell script แต่คิดว่าถ้าคนใช้ tortoise hg อาจจะไม่ชอบเท่าไหร่ แต่อันนั้นไว้เขียนอธิบายอีกทีพรุ่งนี้อีกทีหลังจากมี Windows อยู่ใกล้ตัว

เพิ่มเติม:

Tags: , ,

Post Author

This post was written by llun who has written 512 posts on แนท (/næt/).

I'm programmer at Throughwave

One Response to “Rebase คืออะไร”

  1. SouLsKi January 7, 2010 at 1:51 am #

    มาเม้นก่อนอ่านหมดแรงละเดียวมาอ่านพรุ้งนี้

Leave a Reply