สวัสดีครับ Git เป็น Version Control ที่พัฒนาขึ้นมาเพื่อใช้เป็นเครื่องมือช่วยในการพัฒนา Software ซึ่งจะช่วยติดตาม ตรวจสอบการแก้ไข Source Code และ file ต่างๆ โดยสามารถตรวจสอบได้ทุกตัวอักษร ทุกบรรทัด และทุกไฟล์ ว่าใครเป็นคนแก้ไข แก้ไขอะไรไป แก้ไขวันที่ และเวลาเท่าไร นอกจากนี้ยังสามารถย้อนไปยังการแก้ไข ณ. จุดใดจุดหนึ่งได้อีกด้วย ยังไม่หมดแค่นี้ Git ยังสามารถรวมการแก้ไขจากหลายๆคนเข้าด้วยกันได้อีกด้วย (Merge)
อาจจะยังไม่เห็นภาพ ผมจะยกตัวอย่างดังนี้นะครับ ผมเชื่อว่าทุกคนคงเคยเจอเหตุการณ์เหล่านี้กันมาบ้างแล้ว ถ้าเราต้องการทํารายงานกลุ่มส่งครู สมมติเราทําเสร็จครบทุกบทแล้วเอาไปส่งครู ปรากฎว่าครูให้เอากลับมาแก้บทที่ 2 ในทางปฏิบัติ เราก็จะ Copy ไฟล์รายงานของเราขึ้นมาแล้วค่อยแก้ เพื่อจะเก็บอันเก่าไว้ก่อน เผื่อเราแก้อะไรผิดไป จะได้เอาอันเก่ากลับมาได้ ตอนนี้เราก็จะมีไฟล์คือ “รายงาน1” และ “รายงาน2” ลองนึกภาพนะครับ ถ้ามีการแก้หลายๆครั้ง เราก็จะมี file แบบนี้เต็มไปหมด เมื่อกลับมาดูทีหลังก็จะงงว่าอันไหนใช้ได้บ้าง อันไหนถูกแก้ไปเมื่อไร อันไหนถูกแก้ไปล่าสุด และอีกอย่างครับ ถ้าเราต้องการแบ่งงานกันทํากับเพื่อนๆช่วยกันทําคลละบท จะลําบากมากครับโยน File กันไปมา ไม่รู้ว่า File ไหนใช้หรือไม่ใช้ ทั้งหมดทั้งมวลนี้ Git จะมาช่วยให้เราทําเรื่องพวกนี้ได้ง่ายมากๆ
เพื่อทําความรู้จักกับ Git ไปแบบคร่าวๆแล้ว ต่อไปเรามาดูการทํางานของ Git กันครับโดยเริ่มจาก Git Life Cycle
Git Life Cycle
ในการใช้งาน Git ก็ไม่ยาก แค่ทําความเข้าใจความหมายในแต่ละ Stage ของ Git Life Cycle ตามรูปนี้ ซึ่งเดี๋ยวผมจะอธิบายต่อไปครับ โดยจะอธิบายคร่าวๆภาพร่วมก่อนนะครับ เพื่อให้เห็นการทํางานโดยรวมก่อน
จากรูปจะเห็นว่ามีสองส่วนคือ Local กับ Remote ความหมายก็คือ Local จะเป็นส่วนที่ทํางานบนเครื่องเราเอง ส่วน Remote จะเป็นส่วนที่ทํางานบน git server ที่เราจะเอา Source code ของเราไปเก็บไว้ เช่นพวก github, gitlab ฯลฯ
สําหรับกล่องแต่ละกล่องจะมีรายละเอียดตามนี้ครับ
- Working Directory Untracked By Git คือ Stage ที่ Folder ของ Project เราที่ยังไม่ถูก git เข้ามาควบคุม หรือ Track
- Working Directory Tracked By Git คือ Stage ที่ git เข้ามาควบคุม หรือ Track Folder ของ Project เราเรียบร้อยแล้ว โดยเราจะใช้คําสั่ง “git init” ใน folder ที่เราต้องการ Folder นั้นก็จะถูก git เข้ามา Track ทันทีครับ
- Staging Area คือ หลังจากที่ Working Directory Tracked By Git ให้กับ Folder ที่เราต้องการแล้ว เมื่อเราแก้ไขไฟล์ใน Working Directory แล้ว เราจะต้องบอก git ว่าเราสนใจที่จะเก็บการแก้ไขของไฟล์ไหนบ้าง ซึ่ง Stage นี้จะเรียกว่า Staging Area โดยจะใช้คําสั่ง “git add”
- Local Repository คือ หลังจากที่เราบอก git ว่าเราสนใจที่จะเก็บการแก้ไขของไฟล์ไหนบ้างใน Staging Area เรียบร้อยแล้ว ขั้นตอนต่อไป เราจะต้อง Commit การแก้ไขนั้นๆ ความหมายก็คือ การเก็บ Change หรือการแก้ไขนั้นๆไว้ ซึ่งจะถูกบันทึกไว้ในเครื่องของเราเอง เราจะเรียกว่า Local Repository โดยเราสามารถใช้คําสั่ง “git commit” ได้เลยครับ
- Remote Repository คือ เมื่อเราต้องการที่จะเก็บ project ของเราไว้บน git server เช่นพวก github ได้ เราก็สามารที่จะใช้คําสั่ง “git push” เพื่อ Upload project ของเราขึ้นไปได้ ซึ่ง git จะ Upload ทุกอย่าง รวมไปถึง Commit Change ต่างๆไปด้วย
ทําความรู้จักกับคําศัพท์ของ Git
ในการใช้งาน git เราจําเป็นที่จะต้องใช้คําศัพท์เหล่านี้เพื่อให้เข้าใจรูปแบบการใช้งาน และการใช้ git ในการทํางานร่วมกันในทีม
- Repository หมายถึง Project ที่มี git เข้ามาช่วย หรือเป็น Folder ที่เราทํางานอยู่นั้นแหละครับ
- Commit หมายถึง การที่เราบันทึกการแก้ไขของเราไว้ในระบบ git
- Branch หมายถึง การที่เราแยกสาขาของมาจาก Commit ใด Commit หนึ่งเพื่อมาทํางานเพิ่ม ซึ่งใน git จะแยกออกมากี่ Branch ก็ได้
- Merge หมายถึง เมื่อเราทํางานกันเป็นทีมหมายความว่าในแต่ละคนก็จะทํางานหรือแก้ไข Source code ชุดเดียวกันในเวลาเดียวกัน โดยทําการแยก Branch ออกไป แล้วไปทํางานส่วนของแต่ละคน เมื่อทํางานเสร็จการที่จะนํา Source code ของแต่ละคนมารวมกันจะเรียกว่าการ “Merge”
- Checkout หมายถึง การย้ายไปยัง Branch หรือ Commit ที่ต้องการ
- Push หมายถึง การ Upload Repository จากเครื่องของเราขึ้นใปบน git server
ก็เป็นส่วนหนึ่งที่ใช้กันบ่อยๆนะครับ เดี๋ยวได้ลองใช้งานไปเรื่อยๆก็จะเข้าใจเองครับ
อ่าน Graph ของ git
หลังจากที่เราเรียนรู้เกี่ยวกับ คําศัพท์ของ Git ไปแล้ว ในหัวข้อนี้จะเป็นการอ่าน Graph ของ git กันครับ มาดูตัวอย่าง Graph ของ git ตามรูปนี้ครับ
จากรูปด้านบน ผมจะเริ่มจากปุ่มกลมๆสีต่างๆก็คือ Commit ครับ นั่นก็คือจุดที่เราแก้ไข หรือ Change ที่เรา Commit ไว้นั้นเอง โดย Timeline จะเป็นไปตามลําดับของเส้นลูกศร ส่วนต่อไปให้ทุกคนไปดูเส้นแนวตั้งที่ด้านบนจะเขียนชื่อเป็น master, hotfixes, develop ฯลฯ เราจะเรียกสิงนี้ว่า Branch ครับ โดยเราจะสามารถตั้งชื่อได้ครับ ซึ่งโดยปกติจะมี Default Branch เป็น master (บางครั้งอาจจะใช้ main) ในรูปจะเห็นว่า Branch อื่นๆจะแยกออก หรือแตกออกมาจาก Branch master ครับ ส่วนต่อไปให้ดูตรงจุดที่ลูกษรสองเส้นชี้เข้าหากันเป็นจุดที่รวม 2 Commit change เข้าด้วยกันหรือเรียกว่า Merge นั่นเอง ในทุกๆจุด Commit change เราสามารถเขียนคําอธิบายได้ว่าจุดๆนั้นเราแก้ไขอะไรไป ซึ่งจะเรียกว่า Commit message (จะเก็บรายละเอียดไว้หมดครับ ใครเป็นคนแก้, แก้เมื่อไร, มีอะไร change บ้าง ฯลฯ)
ลองใช้งาน git
สำหรับการใช้งาน git สามารถใช้งานได้สองแบบนะครับคือ แบบ GUI และ แบบ CLI (Command line) ในบทความนี้เราจะใช้แบบ CLI นะครับ เพราะจะช่วยให้เราเข้าใจ git ได้มากขึ้น และลงลึกได้มากกว่าครับ
เริ่มแรกก็ติดตั้ง git ในเครื่องของเราให้เรียบร้อยครับ เข้าไปดูในนี้ได้เลย https://git-scm.com/
เมื่อติดตั้งเรียบร้อยเราสร้าง folder ชื่อว่า “demo-git” ขึ้นมา แล้วสร้างไฟล์ “my-profile.txt” ไว้ข้างใน แล้วใส่ข้อมูลนี้เข้าไป
name: Jone
age: 20
ขั้นตอนต่อไปเราจะต้องกําหนด Folder ของเราให้เป็น Working Directory Tracked By Git โดยให้เราเข้าไปใน Folder “demo-git” โดยใช้ command (ใน Mac จะเป็นคําสั่ง “cd”) หลังจากนั้นให้ใช้คําสั่ง git ดังนี้
$ git init
เมื่อใช้คําสั่งนี้แล้ว สิ่งที่เกิดขึ้นก็คือ git จะไปสร้าง Folder “.git” โดยภายในจะเป็นข้อมูลทุกอย่างของ project นี้ไว้
*Folder “.git” นี้จะถูกซ่อนไว้ครับ ถ้าเราเปิดให้ show hiden file ก็จะเห็นประมาณนี้ครับ
ต่อไปลองใช้คําสั่งนี้เพื่อดู file ที่ Change หรือ file ที่ถูกเพิ่มเข้ามา ทั้งหมดภายใน filder “demo-git” ของเรา
$ git status
จะได้ออกมาตามนี้ครับ
จากรูปจะเห็นว่าตรง Untracked File จะมี file “my-profile.txt” ขึ้นมา หมายความว่ามีไฟล์นี้เพิ่มเข้ามาใหม่ ยังไม่อยู่ในการ track ของ git (.DS_Store ไฟล์นี้เป็นไฟล์ของ Mac ที่ถูกสร้างขึ้นมาอัตโนมัติ ไม่ต้องสนใจครับ)
ขั้นตอนต่อไป เราจะสั่งให้ git เข้ามา track ไฟล์นี้โดยใช้คําสั่ง
$ git add my-profile.txt
แล้วลองใช้คําสั่ง “git status” เพื่อดูสถานะอีกครั้ง จะได้แบบนี้ครับ
จากรูปจะเห็นว่า file “my-profile.txt” ย้ายไปอยู่ในหัวข้อ “Changes to be committed:” หมายความว่า ไฟล์นี้อยู่ในสถานะ Staging พร้อมที่จะ Commit แล้ว
ขั้นตอนต่อไป เราจะทําการ Commit เพื่อเก็บการเปลี่ยนแปลงนี้ไว้ โดยใช้คําสั่ง
$ git commit -m "my first commit"
-m “my first commit” คือ Commit message ซึ่งเป็นคําอธิบายของ commit นี้
*กรณีติดตั้ง git ใหม่เราจําเป็นต้อง Config Name และ Email ก่อนครับ จึงจะ Commit ได้ วิธีการ Config ดูได้จากบทความนี้ครับ การใช้งานคําสั่ง git config
จะได้ประมาณนี้ครับ
เราลองใช้คําสั่ง “git status” เพื่อดูสถานะ Change อีกครั้ง
จากรูปคือไม่มี File change แล้ว เนื่องจากเรา Commit หรือเก็บ Change ล่าสุดไปแล้ว
ต่อไป เราจะมาลองดูสิ่งที่เรา Commit ไปกันครับ โดยใช้คําสั่งนี้
$ git log --graph --oneline --all
จะได้ออกมาประมาณนี้
ต่อไป เราจะมาลองแก้ไขไฟล์กันครับ แล้วมาดูว่าจะเกิดอะไรขึ้น
ให้เราแก้ไขไฟล์ “my-profile.txt” โดยเพิ่ม gender เข้าไป ดังนี้ครับ
name: Jone
age: 20
gender: male
เมื่อเราแก้ไขไฟล์เรียบร้อยแล้ว ให้เรา check status โดยใช้คําสั่งนี้ครับ
$ git status
จะได้ประมาณนี้ครับ
จากรูปจะเห็นว่าในส่วนของ “Changes not stage for commit” มี 1 ไฟล์ ซึ่งก็คือไฟล์ที่เราแก้ไขไป หมายความว่า ณ. เวลานี้เรามีไฟล์ Change จาก Commit ล่าสุดอยู่ ถ้าเราอยากจะเก็บ Change นี้ไว้ เราก็สามารถจะ Commit เก็บไว้ได้ครับ
ในขั้นตอนต่อไป เราจะมาลอง Commit change นี้ไว้กันครับโดยขั้นตอนก็จะเหมือนกับการ commit ก่อนหน้านี้ครับ คือทําการ Add file ที่ต้องการ Commit เข้าไปก่อนครับ ด้วยคําสั่งนี้
$ git add my-profile.txt
เราลองใช้คําสั่ง “git status” เพื่อดูสถานะ จะได้แบบนี้ครับ
File “my-profile.txt” จะเปลี่ยนไปอยู่ในสถานะ “Changes to be committed:”
ขั้นตอนต่อไปเราจะ Commit change ด้วยคําสั่งนี้ครับ
$ git commit -m "add age"
เรามาลองดู Commit change ที่เรา commit ไปกันครับ ใช้คําสั่งนี้
$ git log --graph --oneline --all
จะได้ประมาณนี้ครับ
จะเห็นว่าเราได้ Commit change ที่เราเพิ่ง commit ไปเมื่อสักครู่นี้ เพิ่มขึ้นมาครับ
สําหรับในการทํางานโดยใช้ git เราก็จะทําแบบนี้ไปเรื่อยๆครับ เพื่อเก็บการเปลี่ยนแปลงต่างๆ ทําให้เราจัดการ version ของ project เราได้ง่ายขึ้นครับ
สรุป
git จะเข้ามาช่วยเก็บข้อมูลของการ Change ตามลําดับเวลา ทําให้เราสามารถย้อนไปช่วงไหนของการ Change ก็ได้ และเรายังสามารถรวม Change 2 อันเข้าด้วยกันได้อีกด้วย