วันนี้และเมื่อวานค้นพบว่าเพื่อนยังงงกับ rebase อยู่ และยังคงสงสัยว่าทำไปทำไม ก็เลยเขียนในบล๊อกรวดเดียวเก็บไว้อธิบายทีหลังเลยละกัน เพราะจริงๆ แล้วก็พึ่งรู้ว่ามีความจำเป็นยังไงไม่นานมานี้เอง แต่ก่อนจะไปถึง rebase ขอย้อนมาดูขั้นตอนการรวม branch ของ svn หรือระบบที่มีศูนย์กลางกันก่อน โดยคร่าวๆ คือ
- แก้ไขเอกสารต่างๆ แล้ว commit ลง server
- สั่ง merge จาก branch หลักมาที่ branch ที่แก้ไขอยู่
- แก้ไข conflict ที่เกิดขึ้น
- commit การแก้ไขที่เกิดจาก conflict
- switch ไป branch หลัก
- สั่ง merge จาก branch ที่แก้ไขกลับมาที่ branch หลัก
- commit สิ่งที่ merge มา
จากขั้นตอนด้านบนจะเห็นว่ามีการเอาสิ่งที่เปลี่ยนแปลงในกิ่งหลักมารวมกับ กิ่งที่แก้ไขอยู่ก่อน เพื่อปรับปรุงเอกสารในกิ่งปัจจุบันให้ทันกับกิ่งหลักและรู้ว่าเอกสารเมื่อรวมแล้วถูกต้อง โดยไม่ทำให้กิ่งหลักเสียหาย(คือ อาจจะยังมีข้อผิดพลาดจากการแก้อยู่ได้ แต่ไม่ใช่ข้อผิดพลาดที่เกิดจากการรวม) ถ้ายังนึกภาพไม่ออกลองดูรูปด้านล่าง

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

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

- แก้ไขไฟล์ .hg/hgrc โดยเพิ่ม rebase option เพื่อให้มี option นี้ตอน pull
[extensions] rebase =
- จากนั้นทุกครั้งที่ pull ก็สั่ง hg pull –rebase
ขั้นตอนนั้นง่ายสำหรับคนถนัด command line/shell script แต่คิดว่าถ้าคนใช้ tortoise hg อาจจะไม่ชอบเท่าไหร่ แต่อันนั้นไว้เขียนอธิบายอีกทีพรุ่งนี้อีกทีหลังจากมี Windows อยู่ใกล้ตัว
เพิ่มเติม:
มาเม้นก่อนอ่านหมดแรงละเดียวมาอ่านพรุ้งนี้