น้องในทีม: "พี่เนย ผมลบโค้ดทิ้งผิดไฟล์ ตอนนี้โปรเจครันไม่ได้ ทำยังไงดีพี่ ผมขอโทษ"
เนยตอบอย่างผ่อนคลาย: "สัด" ... เอ้ยไม่ใช่ ตอบไปว่า "ไม่เป็นไร เดี๋ยวเอาไฟล์กลับมาให้ ใช้ git อยู่แล้ว ขำๆ"
เป็นเหตุการณ์ปกติที่เกิดขึ้นสองครั้ง ... ครั้งแล้วครั้งเล่า ... แรกๆก็ Panic กับเหตุการณ์แบบนี้นะ แต่พักหลังเฉยๆมาก
ตั้งแต่เมื่อไหร่ก็ไม่รู้ที่คำว่า Version Control กับสิ่งเล็กๆที่เรียกว่า git มีความสำคัญต่อชีวิต Software Developer คนนี้แบบขาดไม่ได้
และก็ไม่ใช่แค่เรา แต่ Geek รอบตัวก็ล้วนใช้ Git กันทั้งนั้น
แต่หลังจากได้คุยกับคนจำนวนมาก ก็พบว่ายังมีอีกเยอะเลยที่ไม่ได้เอา Git มาใช้ในชีวิต และประสบปัญหา Common ต่างๆมากมาย วันนี้เราเลยขอมาเชิญชวนท่านๆไม่ว่าจะเป็นคนรุ่นใหม่หรือคนรุ่นเก่า มาใช้ Git กันแบบจริงจังด้วยการแนะนำคร่าวๆให้
สำหรับคนที่ใช้อยู่แล้ว กดผ่านไปได้เลยจ้าาา
Git คืออะไร
Git เป็นสิ่งที่เรียกว่า Version Control หรือตัวที่เอาไว้ดูแลและควบคุมการเปลี่ยนแปลงของ Source Code (a.k.a. เวอร์ชั่น) ไม่ว่าจะเป็น Text หรือ Binary File (JPG, PNG)
โดยสิ่งที่เราเอาไปฝากไว้บน Git เราจะเรียกว่า Repository และวิธีการทำงานจะมี Git Server รันอยู่บน Server เราสามารถเข้าถึง Git ได้ผ่าน URL ที่สร้างขึ้นมาตอนเราสร้าง Repository บน Server เช่น
https://android.googlesource.com/platform/art
Git ไม่ใช่ตัวแรกที่ทำแบบนี้ได้ ครั้งหนึ่งหากใครเกิดทัน จะมียุคหนึ่งที่ SVN (Subversion) รุ่งเรือง ถือว่าเป็นจุดเริ่มต้นของ Version Control แบบกว้างขวางของโลก
แต่ SVN ก็มีจุดอ่อนมากมายหลายหลาก ยกตัวอย่างเช่นการที่ต้องออนไลน์ถึงจะทำอะไรกับ Repository ได้ เป็นต้น
Git จึงถูกคิดค้นขึ้นมาเพื่อทำหน้าที่แบบเดียวกัน แต่ดีกว่าในหลายๆด้าน จนตอนนี้กลายเป็น Version Control ที่ได้รับการยกย่องว่าดีที่สุดเป็นที่เรียบร้อย ถึง SVN จะยังมีคนใช้อยู่ แต่ก็มีคนแนะนำให้ย้ายไปใช้ Git กันอยู่เรื่อยๆ
แล้ว Git มันมีดียังไง? แก้ Pain อะไรได้บ้าง? ทำไมถึงควรจะใช้ Git กัน? โดยเฉพาะกับ Software Developer อย่างท่านๆ
Source ไม่มีวันหาย สามารถย้อนคืนสิ่งที่ผิดได้ตลอดเวลา
ตัวอย่างด้านบนที่เรายกมาเป็นเรื่องจริงที่เกิดขึ้นตลอดเวลา คือการทำงานกับโปรเจคใหญ่ๆ Source Code เยอะๆ แล้วทำงานร่วมกันหลายคน มีโอกาสอยู่เสมอที่จะมีบางไฟล์เสียหายหรือถูกลบทิ้งอย่างไม่ได้ตั้งใจ
ถ้าเป็นแต่ก่อนเราทำยังไงกัน? ถ้าเคย Backup ไว้ก็ยังโอเค อาจจะพอก็อปปี้ข้อมูลกลับคืนมาได้ แต่ก็คงไม่ได้เป๊ะๆ ต้องมานั่งคิดว่าแก้อะไรไปบ้างอีก
แต่ถ้าไม่เคย Backup ไว้ ก็คงได้แต่นั่งร้องไห้ เอานิ้วเขี่ยพื้น เขียนใหม่หมด
แต่กับ Git แล้ว ถ้าคุณเอาข้อมูลใส่ไว้ใน Git Repository ถึงคุณจะลบไฟล์ทิ้งไปหมด มันก็สามารถเอากลับมาได้
วิธีการทำงานของ Git คือมันจะเก็บการเปลี่ยนแปลง (diff) ของแต่ละไฟล์ไว้อย่างเป็นรูปแบบ ทำให้เราสามารถย้อนการกระทำใดๆได้เสมอ เช่น ไฟล์นี้เปลี่ยนแปลงแล้วพัง ก็สามารถย้อนกลับไปเวอร์ชั่นก่อนหน้าได้ (ก็มันเก็บการเปลี่ยนแปลงหนิ) หรือถ้าลบไฟล์ทิ้งไปเลย Repository ก็จะจำการเปลี่ยนแปลงไว้เช่นกัน ในที่นี้คือจำว่าไฟล์ถูกลบ ข้อมูลหายไปกี่บรรทัดๆๆๆ ชื่อไฟล์ว่าอะไรที่หายไป บลาๆๆๆ และด้วยเหตุนี้ มันจึงสามารถเอากลับมาได้ ถึงจะลบอะไรพลาดไปก็ไม่ต้องกลัวอะไรอีกต่อไป เอากลับมาได้ด้วยการคลิกๆๆๆๆสองสามกึก !
อุ่นใจ ...
ข้อดีอย่างนึงของ Git คือ "มันกระจายความเสี่ยง" โดยโครงสร้างของ Git จะเก็บทุกการเปลี่ยนแปลงไว้ใน Repository ตอนเรา clone มาลงในเครื่อง เราก็จะเก็บทั้งโปรเจคแบบ Full มาลงไว้เลย ดังนั้นทุกเครื่องที่มี Repository อยุ่ ก็คือ Backup ดีๆนี่เอง
ดังนั้นหากเครื่องคอมพ์หาย ก็ไม่มีปัญหาอะไร ข้อมูลทั้งหมดอยู่ใน Server
ถ้า Server พัง ก็ไม่มีปัญหาอะไร Source Code สมบูรณ์แบบก็ยังอยู่ในเครื่องเรา ตั้ง Server ใหม่แล้วเอาขึ้นใช้งานต่อได้เลย
ถ้า Server พังและคอมพ์หายพร้อมกัน ... ไปทำบุญนะครับ
Merge Code ให้อัตโนมัติ
อีกปัญหานึงของการทำงานร่วมกันคือ ต่างคนต่างแก้โค้ด และบ่อยครั้งที่แก้ไฟล์เดียวกัน
แต่ก่อนทำยังไง?
... Thumb Drive Algorithm ...
ก็อปมาแล้วก็นั่งดูว่าไฟล์มีบรรทัดไหนเปลี่ยนไปบ้าง แล้วก็นั่งแปะๆๆๆๆๆ ...
ฉิบหายยยยยย สิครับ (ใครยังทำวิธีนี้อยู่ สารภาพมาซะดีๆ)
Git เป็นฮีโร่ตรงนี้เป็นอย่างมาก เพราะแก้โค้ดไปเถอะ แก้ไปเล้ยยยย เดี๋ยว Git จะ Merge ข้อมูลในไฟล์ทั้งหมดเข้าด้วยกันเอง !
แต่ก็มีบ้างที่มีปัญหา Git ไม่มั่นใจและไม่กล้า Merge Code ให้ ก็เลยพ่นออกมาว่า Conflict พร้อมกับทิ้งร่องรอยไว้ว่า ช่วงบรรทัดไหนที่มีการเปลี่ยนแปลงแต่มันไม่มั่นใจว่าจะ Merge ยังไง
หน้าที่ของเราคือ Merge ด้วยมือ แต่ด้วยการที่มันเตรียมพร้อมทุกอย่างไว้หมดเลย การ Merge ตรงนี้จึงใช้พลังน้อยมาก แล้วก็ทำงานต่อได้เลย
ประหยัดเวลาได้เป็นแสนวินาที แถมแทบจะรับประกันว่า Code ไม่หายไปจากการ Merge มั่วด้วยมือแน่นอนนนน
เย้ เย
Track ได้ว่าใครทำอะไร
นอกจากมันจะจำการเปลี่ยนแปลงของโค้ดแล้ว มันยังจำด้วยว่าใครเป็นคนแก้โค้ดบรรทัดนี้ๆไป ดังนั้น Git จึงเป็นเครื่องมือจับโจรที่ดีเป็นอย่างยิ่ง ...
หึหึ
ทำ Local ได้
SVN มีจุดอ่อนอย่างนึงคือ การจะทำอะไรกับ Repository ต้องต่อเนตออนไลน์ไว้เสมอ
แต่กับ Git แล้ว เราสามารถทำสิ่งต่างๆโดยไม่ต้องต่อเนตได้เลย ไม่ว่าจะเป็นการ commit (คือขั้นตอนการให้ Git จดจำการเปลี่ยนแปลง ในแต่ละโปรเจคจะมี commit กันรัวๆเป็นหมื่นเป็นแสนได้เลย) การ checkout (คือการเปลี่ยน Branch ของโค้ด) การ reset (คือการย้อนคืนโค้ดไปยัง commit ต่างๆ)
ความคล่องตัวในการทำงานจึงเยอะมากเทียบกับ SVN แล้ว
ส่วนถ้าจะทำอะไรที่เกี่ยวกับ Server เช่น push (การอัพโหลดการเปลี่ยนแปลงขึ้น Server) หรือ pull (การดาวน์โหลดการเปลี่ยนแปลงของคนอื่นมาลง) ก็ค่อยต่อเนตเอา
แนะนำ Git Hosting
สำหรับ Git Hosting ที่แนะนำมีอยู่ 3 อันคือ
GitHub
ดังที่สุดแล้วหละสำหรับ GitHub ที่เป็นแหล่งแชร์โค้ดที่ใหญ่ที่สุดของโลก เปิดให้เราสามารถอัพ Public Repository (คือ Repository ที่เปิดให้ใครเข้าถึงก็ได้ โหลดมาได้ แต่แก้โค้ดไม่ได้) ได้อย่างฟรีๆไม่จำกัด แต่ถ้าจะทำ Private Repository ก็ต้องจ่ายตังค์ไปตามจำนวน Repository เริ่มต้นที่ $7 ต่อเดือน ที่ 5 Private Repositories
ดังนั้นถ้าจะใช้ GitHub ก็แนะนำให้ใช้แต่ Public Repository ครับ
สนใจใช้ เชิญ http://github.com จ้า
Bitbucket
GitHub เปิดให้อัพโหลด Public Repo ฟรี แต่ BitBucket มองมุมกลับ เปิดให้อัพโหลด Private Repo ฟรี ! แถมไม่จำกัดจำนวน Repo อีกตะหาก ข้อจำกัดเดียวคือจำนวนคนที่เข้าถึง Repo นั้นๆได้ต้องไม่เกิน 5 คน (เพิ่มได้อีกนิดหน่อยจากการ Invite Friend) ถ้ามากกว่านั้นก็ต้องจ่ายเงิน เริ่มต้นที่ $10 ต่อเดือน สำหรับการเข้าถึงได้ 10 คน
แนะนำว่าถ้าจะทำ Private Repository เชิญ BitBucket ได้เลยจ้าาา
GitLab
สำหรับคนที่กลัวกลั้วกลัว ไม่อยากจะเอาโค้ดไปฝากไว้กับใครก็ไม่รู้ เราสามารถตั้ง Git Server เองบน Server ของตัวเองได้ด้วย GitLab จริงๆมีหลายตัวอยู่นะ แต่ดัวนี้ดังและง่ายที่สุดเท่าที่ลองมาละ ก็ขอแนะนำเป็นตัวนี้ละกันครับ
ไปโหลดมาได้เลยที่ https://gitlab.com/ คร้าบผม
ก็ขอแนะนำเพียงเท่านี้ ขอไม่สอนใช้นะครับ แต่อยากให้ลองไปศึกษากันดู เป็นนักพัฒนาต้องเรียนรู้ด้วยตัวเองได้ !
ซึ่งนาทีนี้ขอยกให้ Git เป็นสิ่งที่ Software Developer "ต้อง" ใช้ ไม่ใช่ตัวเลือกแต่เป็น "สิ่งจำเป็น" เลย เป็นสกิลติดตัวที่สำคัญมาก หากยังทำไม่เป็น เริ่มตั้งแต่วันนี้เลยครับ และจากนี้เป็นต้นไป อัพทุกอย่างขึ้น Git ให้เป็นนิสัย อย่างตอนนี้ สำหรับเนย เนยสร้าง Git Repository ก่อนเริ่ม New Project ซะอีก
เพราะ git ทำให้ผมอุ่นนนนนใจ =)