ถ้าใครทำงานสาย tech ต้องคุยกับทีม software development บ่อยๆ น่าจะเคยได้ยินคำว่า git ผ่านหูกันมาบ้าง ของดีที่สร้างโดย Linus Torvalds ในปี 2005
บทความนี้แอดมาอธิบายว่า git คืออะไร เหมือนหรือต่างอะไรกับ GitHub และสอนใช้ 10 คำสั่ง git commands พื้นฐานที่เราควรรู้จัก
What is Git

Git คือ software ที่เหล่านักพัฒนาซอฟต์แวร์ใช้ทำ version control
อธิบายภาษามนุษย์ง่ายๆคือการ save snapshot ของ code ที่เราเขียนเป็นระยะๆ (track) เหมือนเรามีปุ่ม undo เพื่อย้อนเวลากลับไปหา code “version” ต่างๆได้
Git is a version control system. Imagine it like a time machine for your project files!
Concept สำคัญของ git คือ
- Repository เรียกสั้นๆว่า “repo” คือกล่องที่เราใช้เก็บ files ต่างๆ โดย git จะบันทึกการเปลี่ยนแปลงทั้งหมดที่เกิดขึ้นในกล่องนั้น i.e. folder
- Commit คือ snapshot ของงานที่เราทำ ณ เวลานั้นๆ เหมือนกดปุ่ม save
- Branch คือการเพิ่มสาขา เหมือนเปิด franchise 555+ ให้เราลองเขียนโค้ด สร้างฟีเจอร์ใหม่นอกเหนือจาก main branch
- Merge คือการรวม code จากหลายๆ branches เข้าด้วยกัน
เหตุผลที่ทำให้ git เป็นที่นิยมทั่วโลกภายในเวลาสั้นๆ คือ [1] Linus Torvalds คนสร้าง git คือตัวพ่อระดับตำนาน 555+ และ [2] git เป็น open-source ใช้งานได้ฟรี เย้
🚀 ขอบคุณ Gemini สำหรับข้อมูล git history คร้าบ 555+ เดี๋ยวนี้แอดใช้ Gemini ช่วยทำ research หาข้อมูล เขียนบทความสะดวกมาก ของแทร่
Git vs. GitHub

แล้ว git กับ GitHub เหมือนกันไหมแอด?
อธิบายแบบสั้นๆ (อีกแล้ว 555+) git คือ version control software
ส่วน GitHub คือ hosting service สำหรับฝาก git repositories แอดมอง GitHub เหมือน Google Drive สำหรับ developers เลย
แทนที่เราจะสร้าง repo ในคอมพิวเตอร์เราแบบ local เราสามารถสมัคร free account บน GitHub แล้วสร้าง cloud-based repo ได้สบายๆ
ทีม dev สามารถเข้าถึง GitHub repo จากที่ไหนก็ได้ในโลกนี้แค่มีอินเตอร์เน็ต มีประโยชน์มากๆสำหรับโปรเจ็คที่ต้องทำงานกันหลายคน
พวกเรา WFH (work from home) ได้เพราะมี GitHub เลย ยั๊งงง 555+
ตัวเลือกอื่นๆนอกจาก GitHub เช่น GitLab, Bitbucket และ Gitea เป็นต้น
Basic Command Line
พื้นฐานสำคัญที่ควรรู้ ก่อนเริ่มใช้ git คือ command line
สามคำสั่งที่แอดใช้ในบทความนี้คือ
- mkdir : make directory สร้าง directory ใหม่
- cd : change directory ย้ายไปอยู่ใน directory นั้นๆ
- pwd : print working directory เรียกดู directory ที่เรากำลังทำงานอยู่
มาลองสร้าง new directory ชื่อ “workspace” ด้วยสามคำสั่งนี้
mkdir workspace
cd workspace
pwd
Command line พื้นฐานอื่นๆที่เราควรรู้จัก เช่น ls touch echo head tail cat grep เป็นต้น
✅ บทความนี้เวลาแอดพูดถึง directory ความหมายเดียวกันกับ folder นะครับ ถ้าใครใช้ windows อยากลองทำตาม tutorial นี้ ดาวน์โหลด git ได้ฟรีที่เว็บไซต์ gitscm
Git version
มาเริ่มกันแบบง่ายๆก่อน คำสั่งแรกคือ git –version เพื่อดูว่าคอมพิวเตอร์ที่เราใช้อยู่มี git ติดตั้งแล้วหรือเปล่า และใช้เวอร์ชันอะไร
git --version
📝 ตัว –version เหมือนเป็น option ที่เราเขียนต่อจากคำสั่ง git นั้นๆ
หน้าตาผลลัพธ์จะประมาณนี้ ของแอดเป็นเวอร์ชัน 2.46.0 (พ.ย. 2024)

Git init
พอเข้าไปอยู่ใน workspace แล้ว ใช้คำสั่ง git init เพื่อเปลี่ยนโฟลเดอร์นั้นเป็น git repo รันปุ๊ป เสร็จปั๊ป git ทำงานได้เร็วมากๆ กราบ อ. Linus มา ณ ที่นี่ 555+
git init

Git status
ลองสร้าง text file ง่ายๆสักสองสามอัน เช่น hello.py, data.csv, model.txt ใส่ลงไปใน repo แล้วใช้คำสั่ง git status เพื่อเช็คว่าตอนนี้มีไฟล์อะไรที่เพิ่งมีการอัปเดตบ้าง
git status
git status จะบอกว่าไฟล์ไหนเพิ่งถูกเพิ่มมาใหม่ (new) ถูกแก้ไข (modified) หรือถูกลบทิ้ง (removed) ทำไมมันง่ายอย่างนี้ 555+

Git add
ถ้า git status บอกว่าอะไรมีการเปลี่ยนแปลง git add คือการบอกโปรแกรมว่าเราอยากจะ track และ snap ไฟล์อะไรบ้าง i.e select what’s to save
ตัวอย่างนี้ แอดอยากจะติดตามการเปลี่ยนแปลงของไฟล์ data.csv และ model.txt อย่างใกล้ชิด I’m watching you ยั๊งงง 555+
ให้พิมพ์ git add ตามด้วยชื่อไฟล์นั้น
git add data.csv
git add model.txt
หรือถ้าเราอยากจะ add ทุกไฟล์ทีเดียว ให้พิมพ์ . ต่อจากคำว่า add แบบนี้
git add .
git จะเพิ่มไฟล์ทั้งหมดเข้าไปอยู่ใน staging area เพื่อรอรับคำสั่งต่อไป

Staging area เป็นเหมือนจุดพักรถชั่วคราว เหมือนเราบอก git ว่าสองไฟล์นี้เป็นไฟล์ที่เราอยากจะ snapshot มันนะ แต่ยังไม่ snap จนกว่าจะรันคำสั่งต่อไป
🚀 ปกติเวลาเรารัน git add เสร็จแล้ว เราจะเช็คสถานะด้วย git status อีกรอบนะครับ
Git commit
คำสั่งถัดมาคือ git commit เปรียบเสมือนปุ่ม “save” ในโปรแกรมคอมพิวเตอร์
ในมุมมองของ git คือการ snapshot สิ่งที่เราฝากไว้ใน staging area เซฟมันลงไปใน git history ของ repo นั้นๆ
Snapshot is like taking a picture (with your git camera)
เวลาเราใช้คำสั่งนี้ ให้เพิ่ม flag -m ตามด้วย “commit message” คล้ายๆการเขียนโน้ตเพื่อบอกว่าเรากำลังจะเซฟอะไรลงใน repo
git commit -m "Add data and model to repo"
อธิบาย git commit ด้วยภาษาบ้านๆคือ ช่วยบันทึก snapshot ของไฟล์ data.csv และ model.txt ที่เพิ่มมาใหม่เมื่อกี้ลงใน repo หน่อย

ทุกครั้งที่มีอัปเดตสำคัญใน repo เราอยากจะ commit การเปลี่ยนแปลงนั้นเสมอ เผื่อมีอะไรพัง เราจะได้ย้อนเวลากลับไปหา commit ในอดีตได้ เฉียบ
นอกเรื่องแป๊บ ขนาด Google Sheets ยังมี version control เลย

Git log
เราสามารถเรียกดูประวัติการ commit ของโปรเจ็คเราได้ด้วยคำสั่ง git log
git log
Log จะแสดงข้อมูล 4 อย่างคือ
- Commit Hash – unique ID สำหรับ commit นั้นๆ (40 ตัวอักษร)
- Author – ใครเป็นคน commit
- Date – วันที่และเวลา
- Message – ข้อความที่ใส่เข้าไปใจ commit -m

ถ้าเราเพิ่ม option –oneline แต่ละ commit จะถูกย่อเหลือบรรทัดเดียว เหลือแค่ hash กับ message อ่าน log ง่ายขึ้นหน่อย (มั้ง 555+)
git log --oneline
Git diff
ถ้าเราอยากดูการเปลี่ยนแปลง (changes) ที่เราแก้ไข เพิ่มลดในไฟล์ต่าง คำสั่งหลักที่เราใช้คือ git diff เขียนได้หลายแบบมากอยู่ที่เราจะเทียบ change กับอะไร
git diff –staged ใช้ดูสิ่งที่เราเพิ่งเพิ่มเข้าไปใน staging area
git diff --staged
ตัวอย่างนี้ แอดเพิ่ม code สองบรรทัดในไฟล์ hello.py แล้ว add มันเข้าไปใน staging พอเรารันคำสั่ง git diff ระบบจะบอกว่า line ไหนที่เราเพิ่งเขียนเพิ่มใหม่ (+)

เราสามารถใช้ git diff เปรียบเทียบระหว่าง commits ได้ด้วย แบบนี้
git diff commit1 commit2
Git revert
มาถึง highlight ของ git คือคำสั่งย้อนเวลา ยั๊งงง 555+
Reverses the changes made in a specific commit.
git revert คือปุ่ม “safe undo” โดย git จะสร้าง commit ใหม่ที่ undo การเปลี่ยนแปลงทั้งหมดของ commit ก่อนหน้า หรือ specific commit ที่เราเลือก
git revert <commit-hash>
ตอนนี้ project แอดมีสอง commits
- Add data and model to repo
- Add two print to hello.py file
ลองเขียน git revert commit ล่าสุด แค่ใส่เลข hash แบบนี้
git revert fec50ca
git จะสร้าง commit ใหม่ที่ขึ้นต้นด้วย Revert …

Git branch
ถ้าใครเคยดู Marvel โลก multiverse จะเข้าใจ git branch ทันทีเลย เหมือนเราแตก timeline โปรเจ็คของเราเป็นสาขาต่างๆ i.e. branching
git branch
git branch [new branch name]
เราใช้คำสั่ง git branch เพื่อดูว่าตอนนี้เรามีกี่ timeline (branches) หรือจะสร้าง branch ใหม่ก็แค่เขียนชื่อ new branch ต่อท้ายคำสั่งได้เลย

เครื่องหมาย * คือสัญลักษณ์ที่บอกว่าตอนนี้เรากำลังทำงานอยู่ใน branch ไหน
โปรเจ็ค software development แตก branch กันฉ่ำ 555+ แต่ละ branch เหมือนการขยายออกไปทำ feature ใหม่ๆ ก่อนจะ merge กลับมาที่ timeline หลัก (main)
Git switch
เราใช้ git switch เพื่อย้ายไปอยู่ branch ใหม่ syntax ง่ายๆแบบนี้
git switch [branch name]
ตัวอย่างนี้ แอดย้ายจาก main ไปอยู่บน *DaBest เรียบร้อย

จริงๆเราสามารถสร้าง branch ใหม่และย้ายไปทำงานใน branch นั้นได้เลย ด้วยคำสั่ง git switch -c ตัวอย่างนี้ แอดสร้าง branch ใหม่ชื่อ “new_analysis”
git switch -c new_analysis
option -c ย่อมาจาก create สร้างและย้าย branch ง่ายเลย แต่ทำไมต้องมีหลาย command ด้วย ตอนเริ่มเขียน git ใหม่ๆ จะงงๆหน่อย 555+

อีก git command ที่แอดเห็นเพื่อนๆทีม dev ใช้กันเยอะคือ checkout ได้ผลลัพธ์เหมือนกับ switch -c เมื่อกี้เป๊ะ (แต่เขียน git switch เข้าใจง่ายกว่าเนอะ)
git checkout -b new_analysis
Git pull & push
มาถึง 2 commands สุดท้ายไว้ใช้ทำงานกับ remote repo (ที่ฝากไว้บน GitHub หรือ GitLab เป็นต้น)
อธิบายง่ายๆ อีกแล้ว 555+ git pull ใช้ในการดึงของจาก remote repo ลงมาที่คอมเรา ส่วน git push คือการผลักของจากคอมเราขึ้นไปที่ remote repo
git pull
git push
บทความนี้เราใช้ git แบบ local ยังไม่ได้สมัคร GitHub ใดๆ ไว้บทความต่อๆไปแอดมาเขียนอธิบายเรื่อง GitHub แบบเต็มๆอีกทีนะคร้าบ
🚀 เวลาเขียนเรื่อง technical แบบนี้ อธิบายยากไป ก็อ่านไม่รู้เรื่อง อธิบายง่ายไป over-simplified ก็เสี่ยงดราม่า 555+ เนื้อหา blog เราจะเน้นทาง simplicity มากกว่า
ถ้าใครมี feedback อะไร comment บอกแอดได้เลยนะคร้าบ
Free Learning Path

สำหรับเพื่อนๆที่สนใจเรียน git เพิ่ม ลองดูคอร์สเรียนฟรี Introduction to Version Control with Git บน Microsoft Learn ได้นะครับ
เนื้อหาเป็นแบบ text-based 4 modules ใช้เวลาเรียนประมาณสองชั่วโมง รู้เรื่อง
หรือลองแวะมาดู git tutorial บน W3schools ก็ได้เช่นกัน ❤️
แอดอยากทำคอร์สฟรีสอนเรื่องนี้มานานแล้วด้วย ชื่อคอร์ส “Git for Human” เท่จัง 555+ ใครอยากเรียนบ้าง ลงชื่อ comment กันได้เลยนะครับ เย้

Leave a Reply to Chin PhurinCancel reply