Git สบายๆ สไตล์ Kakkai Academy 🐣 with Jumpbox
Tags: git, github, beginners
Published: 2022-01-23 13:44:54

สวัสดีชาว Thai community ทุกท่าน ห่างหายไปนานจากการเขียน blog และนอกจากนี้ยังห่างหายไปจากการเป็น technical guy อีกด้วย ได้เวลาก็กลับมาปัดฝุ่นสมองเชิง logic กันซะใหม่
_จุดเริ่มต้น_ ของการปัดฝุ่นครั้งนี้ เกิดจากเพื่อนคนนึงเริ่มต้นโครงการดี ๆ ที่ชื่อว่า **“Jumpbox (Kakkai) Academy”** นั่นเอง จึงสมัครไป และได้เข้าร่วม ขอบคุณที่ผ่านการคัดสรรจากคนจำนวนมาก
สำหรับเนื้อหาใน topic นี้ เป็นเนื้อหาของการ pre-academy ก่อนเข้าสู่เนื้อหาจริง อาจารย์โจ้ได้ปูพื้นด้วย git strategy ซึ่งเป็นสิ่งที่ Developer or Engineer ควรจะรู้ไว้ เพราะมีประโยชน์ต่อการพัฒนา software เป็นอย่างมาก ดังนั้นอาจารย์โจ้ เลยอยากให้ทุกคนที่เรียนได้แชร์ไอเดีย ความรู้ ที่เป็นประโยชน์กลั่นกรองออกมาเป็นตัวหนังสือให้กับชาวไอทีไทย ถึงแม้มันจะเป็นเรื่องที่ดูง่าย ๆ สำหรับบางท่าน แต่สำหรับอีกหลายคน ก็ยังเป็นเรื่องที่ค่อนข้างใหม่มาก ๆ เลยทีเดียวค่ะ

> เอ่ยมาก็นาน มาเข้าเรื่องกันว่า git นั้น สำคัญไฉน ???

อาจารย์โจ้เล่าว่า ก่อนหน้าที่เราจะมี git นั้น เมื่อเราพัฒนา software มาจนถึงขั้นตอนในการส่งมอบ software ให้กับทีม opearation เราเคยใช้วิธีการอย่างเช่น zip file package และใส่เลข version 1, 2, 3 โดยต้องแก้ไปเรื่อย ๆ เมื่อมีการเปลี่ยนแปลงถี่ ๆ เช่นการแก้ bug หรือ แก้ข้อมูลต่าง ๆ ภายในไฟล์นั้น ๆ ความยุ่งยากคือ ก่อนจะทำการแก้ version เราก็จำเป็นที่จะต้อง backup version ก่อนหน้า ไว้ร่วมด้วย วันดีคืนดี ถ้านักพัฒนาลืมไปว่า ต้อง backup แล้วมีความจำเป็นจะต้องกลับมาใช้ version เก่า ก็อาจจะส่งผลให้เกิดปัญหาในการทำงาน ทำให้ช้าขึ้น รวมถึง เมื่อมีการเปลี่ยนแปลงใด ๆ ที่เกิดขึ้นกับ package นั้น ๆ เราไม่สามารถติดตามเลยได้ว่า ใครเป็นคนทำอะไรไป ปัญหาเหล่านี้นี่แหละ ที่ทำให้นักพัฒนา software เล็งเห็นความสำคัญในการจัดการตัวไฟล์ทำให้เกิดที่มา ของสิ่งที่เรียกว่า **“Version Control”**

## Version Control คืออะไร ???

Version Control คือเครื่องมือที่ช่วยในการจัดการไฟล์ หรือกลุ่มไฟล์ หรือ source code สามารถติดตามการเปลี่ยนแปลงที่เกิดขึ้นใน source code ได้ ประกอบไปด้วย
เช็คการเปลี่ยนแปลง (change) ใน source code และเปรียบเทียบ (diff) ระหว่าง source code ชุดก่อนหน้า และชุดปัจจุบันว่าแตกต่างกันอย่างไร
รวม code version จากนักพัฒนาแต่ละคน มาอยู่ศูนย์กลาง (merge)
นักพัฒนาสามารถทราบถึงประวัติการเปลี่ยนแปลง (history change) และสามารถดึง source code กลับมาได้เมื่อ version ปัจจุบันเสียหาย
สามารถทราบว่าใครเป็นผู้สร้างการเปลี่ยนแปลงใน source code
Version Control มี 2 ประเภทด้วยกัน คือ

1. แบบ Traditional ซึ่งเรียกว่า “Centralized Version Control” หรือที่เรียกว่าแบบรวมศูนย์ ซึ่งทุกการเปลี่ยนแปลงจะถูกเก็บไว้บน Repository ที่รวบรวมไว้ที่ server กลาง เครื่องมือนั้นเรียกว่า Subversion (SVN)
2. “Distributed Version Control” หรือที่เรียกว่าแบบกระจายศูนย์ โดย Repository สามารถเพิ่ม แก้ไข อัพเดท บนเครื่องตัวเองแม้ไม่มี Server หรือ Internet และเมื่อต้องการทำงานร่วมกันก็สามารถเชื่อมต่อไปยัง Server เพื่อทำงานร่วมกับทีมได้ Distributed Version Control System ที่นิยมใช้ประกอบด้วย Git, Mercurial เป็นต้น

## มารู้จัก Git กันเถอะ !!!

Git คือ เครื่องมือแบบ Open Source ที่ช่วยจัดการ version ของ source code ให้กับนักพัฒนา โดยจะเก็บประวัติว่าไฟล์แต่ละไฟล์ถูกสร้าง/ลบ/แก้ไขโดยใคร เมื่อไหร่ และอย่างไรเอาไว้ทั้งหมด ทำให้เราสามารถติดตามการเปลี่ยนแปลงของโค้ดได้ตลอด ตัวอย่างของเครื่องมือ แบบ Git มีหลายเจ้าด้วยคือ เช่น Github, Gitlab, Bitbucket เป็นต้น

**ลักษณะการทำงานของ Git (Lifecycle)**

- เราเริ่มจากการสร้าง folder สำหรับเก็บไฟล์งานของโปรเจคต่าง ๆ ไว้ในเครื่องของเรา (Local)โดยที่ Git ยังไม่ได้มีการทำงานใด ๆ 
- เมื่อเริ่มให้ Git เข้ามาทำงาน และเริ่มขบวนการตรวจสอบไฟล์ต่าง ๆ ที่ถูกเพิ่มเข้ามา หรือแก้ไข เช่น Add, New หรือ Clone Repository ถือว่าเป็นการ Init Working Directory
- เมื่อเราอนุญาติให้ Git ทำงาน หรือ Track ไฟล์ใน Working Directory เรียบร้อยแล้ว การที่เราแก้ไข หรือเพิ่มไฟล์เข้าไปใน Working Directory สถานะของไฟล์นั้น ๆ เปลี่ยนเป็น Staging Area
- ทุกครั้งที่เรา เพิ่ม หรือ แก้ไขไฟล์ และ Commit ข้อมูลการแก้ไขนั้น ๆ จะถูกเก็บไว้ใน Local Repository ก็คือภายในเครื่องของเราเองนี่แหล่ะ และพร้อมสำหรับการ Push หรือ การส่งขึ้นไปเก็บไว้บน Server เรียกว่า Local Repository
- หลังจากที่เราทำงานไปได้ซักพัก เราก็จัดการใช้คำสั่ง Push เพื่อนำการแก้ไขแต่ละเวอร์ชั่นทั้งหมด ขึ้นไปเก็บไฟล์บน Remote Server หลังจากการ commit ซึ่งสิ่งนั้นเรียกว่า Remote Repository

**วิธีการดาวน์โหลด Git**

สามารถเข้าไปดาวน์โหลดในเว็บไซต์ของ Git ได้เลย มีตัวติดตั้งให้ติดตั้งกันง่ายๆ โหลดไฟล์จากหน้าเว็บได้เลย [git-download](https://git-scm.com/downloads)

**คำสั่ง Git พื้นฐานและการใช้งาน**
คำสั่งที่สำคัญสำหรับใช้งาน Git หลัก ๆ ประกอบไปด้วย 6คำสั่งด้วยกันคือ init, clone, add, commit, push และ pull

- **init :** คำสั่งที่ต้องการใช้งาน git บนโฟลเดอร์นั้น ๆ
`cd workspace
git init`

- **clone :** เป็นการคัดลอกโปรเจคจำลองมาจากโปรเจคหลัก ซึ่งสามารถเปลี่ยนแปลงไฟล์ในโปรเจคจำลองนี้ได้โดยที่ไม่กระทบโปรเจคหลัก (ไฟล์จำลองที่เราทำการเปลี่ยนแปลงจะเรียกว่า local repository และไฟล์หลักที่อยู่คนละที่จะเรียกว่า remote repository)
`git clone`

- **add :** ใช้สำหรับเพิ่มไฟล์เข้าไปใน stage (เพื่อระบุว่าต้องการที่จะเปลี่ยนแปลงไฟล์ไหนใน git บ้าง)
`git add <filename>
git add .`

- **commit :** เป็นคำสั่งที่ใช้ต่อจาก git add เพื่อยืนยันการเปลี่ยนแปลงไฟล์ที่ถูก add ลงใน stage ของ Remote Repository โดยสามารถใส่ option -m เพื่อ comment file
`git commit -m “comment”`

> ควรใส่ comment file ตามหลักการของ [Commit Conventional](https://www.conventionalcommits.org/en/v1.0.0/)

- **push :** เป็นการส่งไฟล์ที่ commit แล้วเข้าสู่ remote repository
`git push`

- **pull :** เป็นการดึงไฟล์ที่มีการเปลี่ยนแปลงใน remote มาเปลี่ยนแปลงใน local ซึ่งมาจากการใช้ `git fetch` และตามด้วย `git merge`
`git pull`

**ข้อมูลอ้างอิง :**

- https://www.borntodev.com/2020/03/30/git-%E0%B8%9E%E0%B8%B7%E0%B9%89%E0%B8%99%E0%B8%90%E0%B8%B2%E0%B8%99%E0%B8%AA%E0%B8%B8%E0%B8%94%E0%B9%86/

- https://devahoy.com/blog/2015/08/introduction-to-git-and-github/

- https://www.codebee.co.th/labs/git-%E0%B8%84%E0%B8%B7%E0%B8%AD%E0%B8%AD%E0%B8%B0%E0%B9%84%E0%B8%A3-%E0%B8%81%E0%B8%B2%E0%B8%A3%E0%B9%83%E0%B8%8A%E0%B9%89%E0%B8%87%E0%B8%B2%E0%B8%99-git/