"SVN & Git" ความแตกต่างระหว่าง Version Control ตัวเก่ง
Version Control System คือ ระบบที่คอยจัดการ backup source code ของเรา โดยเก็บเป็นลักษณะ version ต่างๆ เช่นในกรณีเกิดปัญหาขึ้น ก็สามารถหยิบเอา source code ตัวเก่าที่เคยใช้งานได้มาแทน พูดง่ายๆ ก็คล้ายๆ กับ Undo ที่เราทำกันนั่นแหละ แต่ว่า Version Control ยังเป็นตัวกลางที่ทำให้ source code ของแต่ละเครื่อง (แต่ละ programmer) มี source code ที่ตรงกันด้วย ซึ่งโดยปกติทั่วไปแล้ว programmer มักจะทำโปรแกรมให้เสร็จสมบูรณ์ และใช้งานได้ก่อน จึงค่อยโยนขึ้นไปที่ repository เพื่อให้คนอื่นดึงไปใช้ต่อไป
Version Control ตัวที่เด่นดังอยู่ตอนนี้ก็มีอยู่ 2 ตัว คือ Subversion(SVN) และ Git ซึ่งผมเองก็ได้ใช้มาแล้วทั้ง 2 ตัว แต่จะเต็มรูปแบบกับ SVN ซะมากกว่า
Repository เป็นคำศัพท์ที่เจอได้บ่อยใน version control หมายถึง ที่เก็บ source code ของเรา ถ้าไม่มีก็ลองไปใช้บริการของ Google Code หรือ GitHub ก็ได้ครับ **ใครรู้จักตัวอื่นอีกก็ช่วยแนะนำด้วยนะครับ ^^
local / remote เป็นคำที่มักใช้เรียกแทน repository ในเครื่องเรา(local) และ repository บน server(remote) ซึ่ง remote จะเป็นตัวกลางระหว่างทีม
มาถึงเรื่องของ SVN กับ Git
การ pull โปรเจคลงมาจาก repository
SVN จะเป็นการ checkout โปรเจคลงมา ซึ่งหมายถึงว่า source code ที่เป็นเวอร์ชั่นล่าสุดจะถูกดึงลงมาไว้ที่เครื่องเรา
Git จะเป็นการ clone คือ การดึงมาทั้ง repository ไม่ว่าจะมีกิ่งก้านสาขาอะไรก็ตาม ทุกอย่างที่อยู่บน repository จะถูกเอาลงมาทั้งหมด
การ upload file สู่ repository
สำหรับ SVN นั้น จะเรียกว่าการ commit และหลังจากที่ commit ไปแล้วไฟล์เหล่านั้นก็จะอยู่ใน repository ทันที แต่ถ้าเป็น Git การ commit จะเป็นการเก็บอยู่ใน local ก่อน ซึ่งเราสามารถ commit แต่ละส่วนของโปรแกรมทีละนิดๆ แล้วค่อย push ขึ้นสู่ remote repository ทีเดียวก็ได้
ลำดับของ revision
SVN จะใช้เลขจำนวนเต็ม(Integer) รันไปเรื่อยๆ ซึ่งแน่นอนว่า ยิ่งเรา commit บ่อยเท่าไร ก็จะทำให้เลข revision มีเยอะขึ้นๆ
Git จะใช้ hash ด้วย SHA-1 hash algorithm เนื่องจาก git จะมีการ commit สู่ local repo. ก่อน เพราะถ้าใช้เป็นเลขรันไปเรื่อยๆเหมือน SVN ก็จะทำให้เกิดเลข revision ซ้ำกันได้
การทำงาน Online / Offline
SVN เป็น version control แบบ centralized หมายความว่า ทุกอย่างจะถูกเก็บในตัวกลาง ซึ่งก็คือ remote repo. ทั้งหมด ทำใช้งานจำเป็นต้องเชื่อมต่อ network ไปยัง repo. ไม่เช่นนั้นก็จะ commit หรือ check revision ก่อนๆ ไม่ได้เลย
Git เป็น version control แบบ distributed คือ หลังจากที่ clone remote repo. มาแล้ว ก็เท่ากับว่าเรามี local repo. ที่เหมือนกันกับ remote repo. ด้วย จะ commit ก็สามารถทำได้แบบ offline เลยเพราะเป็นการ commit ไปที่ local repo. แต่ถ้าเราจะ push ไปไว้ที่ remote repo. แน่นอนว่าต้องเชื่อมต่อ network เช่นเดียวกันครับ
เท่าที่ผมได้ลองใช้มาก็ประมาณนี้ครับ ประเด็นหลักๆ ผมว่าอยู่ที่การออกแบบที่แตกต่างกันระหว่าง Centralized กับ Distributed ซึ่งผมว่าแต่ละประเด็นมันก็แตกมาจากตรงนี้ ตัวไหนดีกว่า ตัวไหนเจ๋งกว่า ผมว่าอยู่ที่ปัจจัยหลายอย่าง วิธีการนำไปใช้ จำนวนคนในทีม ปริมาณงานที่ต้องแก้ไขร่วมกัน และอื่นๆ แต่ตอนนี้ผมใช้อยู่ทั้ง 2 ตัว SVN ใช้ที่ทำงาน ส่วน Git ใช้กับงานที่ตัวเองทำเล่นๆ เป็นการลอง Git ไปในตัวครับ ^^
ลองอ่านข้อมูลจากแหล่งอื่นๆ เพิ่มเติมนะครับ (แนะนำ link แรก ละเอียดมาก)
http://betterexplained.com/articles/intro-to-distributed-version-control-illustrated/
http://www.slideshare.net/technicalpickles/git-as-a-subversion-replacement
http://armno.in.th/2012/02/26/ความแตกต่างระหว่าง-git-กับ-svn/
http://boxysystems.com/index.php/5-fundamental-differences-between-git-svn/
วิธีใช้ GitHub กับ Eclipse ฉบับอ่านง่ายๆ