วันอังคารที่ 3 กรกฎาคม พ.ศ. 2555

วิธีการใช้ Subversion (SVN) - แนวคิดพื้นฐาน

ปัญหาอย่างหนึ่งที่ทำให้ผมสนใจเรื่อง Software Engineeringคือจะทำยังไงให้คนหลายๆคนทำงานด้วยกันได้ครับประเด็นหนึ่งที่น่าสนใจเกี่ยวกับปัญหานี้ก็เป็นเรื่องการจัดการ "สถานะ"ของระบบนี่แหละ (ราชบัณฑิตแปล Configuration ว่า "โครงแบบ"อ่านไม่รู้เรื่องเลยแฮะ) หรือถ้าพูดภาษาชาวบ้านมันก็คือ SoftwareConfiguration Management (SCM) นั่นเอง
Subversion(หรือเรียกย่อว่า SVN) เป็น Tool อันหนึ่งในกลุ่ม Version Control ครับซึ่งก็มีหลายตัวตั้งแต่ CVS, Team Foundation Server, Git, Bazaar แต่ SVNดูเหมือนจะเป็นที่นิยมที่สุด ส่วนหนึ่งเป็นเพราะผู้สร้าง SVNเป็นคนเดียวกับผู้สร้าง CVS ที่เคยโด่งดังและใช้กันแพร่หลายมากมาก่อนครับแต่ด้วย Architecture ของ CVS มันทำให้ไม่สามารถเพิ่ม Functionalityเจ๋งๆบางอย่างเข้าไปได้ เลยตั้งโปรเจคใหม่คือ SVN ซะเลย

SubversionLogo
วิธีการเข้าใจ Subversion ในระดับพื้นฐานนั้นไม่ยากครับ

เรื่องของ Repository

Repository
ก่อนอื่นขอให้เข้าใจ Concept เรื่องของ Repository ก่อน ตัว Repoนี่จะเป็นเหมือนศูนย์กลางในการเก็บข้อมูลซึ่งทุกคนจะใช้ร่วมกันครับดังนั้น หากมีการแก้ไขข้อมูลใน Repo โดยสมาชิกคนหนึ่งคนอื่นก็จะเห็นการแก้ไขนั้นๆด้วย ถ้าพูดให้ง่ายๆก็คือมันเป็น SharedFolder เหมือนที่เราเห็นใน Network นั่นเอง
อย่างไรก็ตามตัวRepo นี่มันมีความสามารถกว่านั้นมาก เพราะมันจะเก็บ "สถานะ"เก่าๆย้อนหลังไว้ได้ด้วย ดังนั้นหากมีสมาชิกเผลอลบไฟล์บางไฟล์ออกไปจากRepo ก็ยังสามารถกู้กลับมาได้โดยง่ายโดยการย้อนไป "สถานะ" ก่อนหน้า ...เจ๋งใช่มั้ยล่ะ
สถานะแต่ละสถานะก็จะมีหมายเลขกำกับด้วยซึ่งเราจะเรียกว่า Revision Number ซึ่งทำการแก้ไขเข้าไปหลายๆครั้งRevision Number ก็จะยิ่งเพิ่มมากขึ้น และเราสามารถดึงข้อมูลจาก Revisionใดๆใน Repo ก็ได้ Revision ล่าสุดใน Repo จะมีชื่อเรียกพิเศษเรียกว่า HeadRevision ด้วยครับ

คำสั่งพื้นฐาน: Checkout

ขั้นแรกก่อนสิ่งอื่นใด เราต้องทำการดึงข้อมูลที่เราต้องการออกมาจาก Repositoryก่อน ข้อมูลนี่จริงๆแล้วมันก็มักจะเป็น Source Code และ Project Fileทั้งหลายนั่นแหละครับ กระบวนการนี้เรียกว่าการ Checkoutซึ่งเราต้องระบุตำแหน่ง Repository และ Path ใน Repository ที่เราต้องการCheckout ออกมา หลังจาก Checkout ออกมาแล้ว ก็จะได้เป็น Copyอยู่บนเครื่องของเรา อยากแก้ไขทำอะไรก็ได้
อาจจะสงสัยเรื่องPath ใน Repo ว่าทำไมต้องระบุด้วย ? สาเหตุก็เพราะจริงๆแล้ว Repoอันเดียวอาจเก็บโปรเจคไว้หลายๆโปรเจคและเราอาจจะต้องการจัดการแค่โปรเจคเดียว หรือเราอาจจะต้องการทำงานบน"กิ่ง" (Branch) อันเดียวก็ได้ (ไว้ค่อยพูดต่อไปว่าคืออะไร) ตัว Repoของเราเองก็สามารถจัดเป็นโครงสร้างต้นไม้ได้เหมือน Directory ทั่วๆไปการใช้ Path จึงเป็นประโยชน์มากครับ และก่อให้เกิด "รูปแบบการจัดวาง"(Layout) มาตรฐานของ Repository ขึ้นมา เช่นโฟลเดอร์ trunk, branches,tags และอื่นๆ ไว้ว่ากันทีหลัง

คำสั่งพื้นฐาน: Commit

หลังจากที่ Checkout ออกมาแล้ว หากเราทำการแก้ไขไฟล์บางไฟล์และต้องการส่งผลการแก้ไขของเรากลับไปที่ Repo ก็สามารถทำได้โดยการ Commitครับ สิ่งที่เราแก้ไขก็จะถูกส่งไปที่ Repository ทันทีหากมีสมาชิกคนอื่นมา Checkout หลังจากนี้ก็ย่อมได้รุ่นที่เราแก้ไขไปแล้วด้วยเช่นกัน

คำสั่งพื้นฐาน: Update

ถ้ามีคนแก้ไขไฟล์อื่นแล้ว Commit กลับเข้าไปใน Repoการแก้ไขนั้นย่อมยังไม่ส่งผลใดๆกลับมาที่ Copyที่อยู่บนเครื่องทำงานของเราใช่มั้ยครับ ดังนั้นเราต้องใช้คำสั่ง Updateเพื่อให้ผลการแก้ไขนั้นลงมาบนเครื่องเราด้วย

คำสั่งพื้นฐาน: Add, Delete

ในความเป็นจริงเราไม่ได้ทำการแก้ไขไฟล์อย่างเดียว เรามีการ เพิ่ม ลบไฟล์เข้าไปอยู่เสมอ เช่นตอนสร้าง Class ใหม่ เป็นต้นการเพิ่มไฟล์เข้าไปทำได้โดยใช้คำสั่ง Add และในทางกลับกันการลบไฟล์ออกใช้คำสั่ง Delete ครับ

ปัญหาที่เกิดขึ้น

SharingProblem
ขั้นตอนการทำงานโดยคำสั่งพื้นฐานด้านบนนั้นจะไม่มีปัญหาอะไรถ้าสมาชิกสองคนไม่แก้ไขไฟล์เดียวกันในเวลาเดียวกันครับลองนึกภาพเหตุการณ์ตามลำดับนี้
  1.  
    1. นาย ก Update
    2. นาย ข Update
    3. นาย ก แก้ Gant.cs
    4. นาย ข แก้ Gant.cs
    5. นาย ก Commit
    6. นาย ข Commit
การทำงานในขั้นตอนแบบด้านบนจะไม่เกิดขึ้นเพราะ Subversion จะไม่ยอมให้ นาย ขCommit ในขั้นตอนสุดท้ายครับ โดยจะเกิดสิ่งที่เรียกว่า out-of-date errorแทน
เหตุการณ์นี้เรียกว่า Conflict ครับและวิธีการแก้โดยปกติก็คือ ต้องให้สมาชิกที่เป็นมนุษย์ทำการ Review เองโดยการทำการเปรียบเทียบความแตกต่างระหว่างไฟล์ แล้วทำการสร้าง Versionใหม่ที่เป็นการรวม (Merge) ระหว่างสองไฟล์ขึ้น ก่อนที่จะทำการ Commitกลับเข้าไปครับ โดยจะมี Tool มากมายคอยช่วยเหลือเช่น Diffใช้ดูความแตกต่างระหว่างไฟล์สองไฟล์แบบ "ฉลาด"ไม่ใช่การเทียบบรรทัดต่อบรรทัดธรรมดาครับ และใช้ได้ดีกับไฟล์ Source Codeหรือ Text File เท่านั้น งาน Mergeนี้เป็นงานที่คอมพิวเตอร์ทำเองไม่ได้ครับ เดี๋ยวทำมาแล้วไม่ถูกใจ แย่เลย 

Credit: DevStock

1 ความคิดเห็น: