บทความนี้เป็นการบันทึกการเรียนรู้การใช้งาน Git จากเว็บไซต์ try.github.com เมื่อก่อนได้ยินคำว่า Git แล้วเกิดความสงสัยว่ามันคืออะไร? มีคนบอกว่ามันจะมาแทน SVN ยิ่งงงเข้าไปใหญ่ SVN ก็ไม่รู้จัก? จึงลองไปศึกษาค้นคว้าดู แล้วเกิดเจอเว็บไซต์นี้เข้า ซึ่งเป็นของ CodeSchool ร่วมกับ Github ก็เลยนั่งเรียน และนำมาเขียนบันทึกไว้ ณ ที่แห่งนี้
สรุปจากบทความนี้
git init: เป็นการสั่งให้โฟลเดอร์นี้เริ่มใช้ Git (Git จะสร้างโฟลเดอร์ไว้ที่/.gitเป็น hidden folder)git add FILENAME: เป็นการเริ่มต้นสั่งให้ Git ทำการ tracking ไฟล์นั้นๆgit add -A .: เป็นการสั่ง tracking ทั้งหมด โดย . (dot) หมายถึงโฟลเดอร์นั้นๆ และ-Aหมายถึงรวมไฟล์ที่ถูกลบด้วยgit status: เอาไว้ดูสถานะของ Git ว่าเป็นอย่างไร เช่น มีไฟล์อะไรที่ทำการแก้ไข เพิ่ม/ลบ หรือไม่get reset FILENAME: คือการลบไฟล์ออกจากสถานะ stagegit commit -m "message": เป็นการ commit ไฟล์ทั้งหมดในสถานะ stage ไปเซฟไว้ใน Git เป็น snapshotgit log: คือการดูประวัติ Git ต่างๆที่เราเคยทำไว้git stash: คือการเซฟและซ่อนโปรเจ็คของเราไว้ สามารถที่จะ restore กลับได้ทุกเมื่อgit clone GIT_URL: ทำการ clone Git ตาม URL ที่กำหนด มาไว้ที่เครื่องgit remote add origin REMOTE_URL: คือการเพิ่ม Remote Repository สำหรับ push Git ไปยัง Servergit push -u origin master: เป็นการ push โปรเจ็คจากเครื่อง local ไปเก็บไว้ที่ Server (ครั้งแรกต้องบอกorigin masterด้วย แต่ครั้งต่อไปสามารถสั่งคำสั่งสั้นๆได้แบบนี้git pushgit pull origin master: เป็นการเช็คการเปลี่ยนแปลงของ repository จาก server เทียบกับ local (นึกถึงถ้าโปรเจ็คเราพัฒนากันหลายคน แล้วมีคนนึง push patch ใหม่ลงไป เราก็จะเห็น)git fetch: เป็นการสั่งเช็คการเปลี่ยนแปลง ว่ามีอะไรเปลี่ยนแปลงบ้าง แต่ไม่ได้ทำอะไร เช็คอย่างเดียวgit merge: เป็นการรวมการเปลี่ยนแปลง หลังจากgit fetchแล้วgit pull: มีค่าเท่ากับgit fetch+git mergegit diff HEAD: เช็คการเปลี่ยนแปลงในโปรเจ็ค เทียบกับHEAD: commit ล่าสุดgit reset FILENAME: ทำการลบไฟล์ออกจาก staging (unstaged) ไม่ได้ลบไฟล์ออกจาโฟลเดอร์นะgit checkout --<target>: ทำการเปลี่ยนกลับไปครั้งล่าสุดที่ทำการ commitgit branch NAME: หมายถึงการสร้าง branch ใหม่ชื่อNAMEgit checkout NAME: หมายถึงการเปลี่ยน branch ไปยัง branch ชื่อNAME(branch default คือ master)git checkout -b NAME: หมายถึงการสร้าง branch ชื่อNAMEพร้อมกับ เปลี่ยน branch ไปยังNAMEเลย (รวบรัด 2 คำสั่งด้านบน)git rm FILENAME: ลบไฟล์ออกจา Git (ออกจากตัวโปรเจ็คด้วย) เวลา commit ครั้งต่อไป ก็จะไม่มีไฟล์ที่ลบ (ต่างจากการลบด้วยระบบ หากเราทำการ commit ไฟล์ก็ยังอยู่ใน Git)git branch -d NAME: คำสั่งเหมือนการสร้าง branch แต่ว่ามี-dหมายถึง การลบ branch ที่ชื่อNAME(ไม่สามารถใช้-dกับ branch ที่ยังไม่ได้ merge ได้ ต้องใช้-Dหมายถึง-d -fหรื —force นั่นเอง)git merge NAME: เป็นการรวมไฟล์ จาก branch ที่ชื่อว่าNAMERepository: คือ โฟลเดอร์หรือโปรเจ็คที่มี Git อยู่staged: คือ ไฟล์ที่พร้อมจะ commit (บอกกับ Git ว่าเราพร้อมที่จะ commit แล้วนะ)unstaged: คือ ไฟล์ที่มีการเปลี่ยนแปลงแต่ว่ายังไม่พร้อมที่จะ commituntracked: คือ ไฟล์ที่ยังไม่ได้ถูก track โดย Git (โดยเฉพาะการสร้างไฟล์ใหม่ ต้องใช้git add FILENAMEเพื่อให้ Git ทำการ track ไฟล์นั้นๆ)deleted: คือ ไฟล์ที่ถูกลบออกจากโปรเจ็ค และรอที่จะลบออกจาก Git (ข้อดีคือหากเราพลาดลบไฟล์ไป ก็ยังกู้คืนได้ เพราะ Git ได้ track ทุกๆไฟล์ของเราไว้)HEAD: คือ pointer ที่เก็บทุกๆ commit ของเรา โดยปกติแล้วHEADจะชี้ไปที่commitล่าสุด reference ของHEADจะอยู่ในรูปแบบ SHAbranch: เหมาะสำหรับการทำโปรเจ็ค ที่มีหลายๆ features ก็ทำการแยก branch ออกมา เช่นbranch-dev,branch-releaseเป็นต้นmerge: คือการรวมไฟล์ จาก branch หนึ่งกับอีก branch หนึ่งเข้าด้วยกันmerge conflictคือ เกิดกรณีที่มีการแก้ไขไฟล์เดียวกัน เวลาเดียวกัน Git จะไม่รู้ว่าเราควรจะใช้ไฟล์ไหนดี

ทดลองสร้างโปรเจ็ค
หลังจากลองเล่น TryGit จบแล้ว ก็ลองทดลองสร้างโปรเจ็คเปล่าๆของตัวเองดู เริ่มด้วยการสร้างโปรเจ็คเปล่าๆขึ้นมา 1 โฟลเดอร์ สมมติชื่อว่า octobox ตามต้นฉบับ :)
mkdir octoboxcd octoboxจากนั้นสั่ง initialize Git เพื่อบอกให้ folder นี้เราจะใช้ Git ในการจัดเก็บไฟล์ต่างๆ
git init
Initialized empty Git repository in /octobox/.git/ทำการเพิ่มไฟล์ใหม่ลงไป ชื่อว่า octocat.txt จากนั้นทดสอบ เช็คสถานะของ Git
touch octocat.txtgit statusจะเห็นสถานะของ Git ว่า Untracked files: ... บอกว่ามีไฟล์อะไรที่เรายังไม่ได้ track
สถานะไฟล์ใน Git มีดังนี้
- เริ่มต้นทุกไฟล์จะอยู่ในสถานะ
untracked - ไฟล์ที่อยู่ในสถานะ
staging( คือไฟล์ก่อนที่จะทำการ commit ไปที่ Git) - ไฟล์ที่อยู่ในสถานะ
commitคือ snapshot ของ repository
git add octocat.txtgit commit -m "Add octocat.txt to repository"ตอนนี้โปรเจ็คพร้อมที่จะ push ไปยัง Server แล้ว แต่ว่าเรายังไม่มี Server โดยให้ทำการ สมัคร Account Github จากนั้นก็สร้าง repository ใหม่ แล้วเอา URL มาใส่เป็น remote url แบบนี้
git remote add origin https://github.com/user/repo.gitจากนั้นทำการ push ทุกอย่างไปเก็บไว้ที่ Server Github ด้วยคำสั่ง
git push -u origin masterทดลองทำการแก้ไขไฟล์ จากหน้าเว็บของ Github จากนั้นลองทำการ commit ผ่านหน้าเว็บเช่นกัน (สมมติให้เหมือนกับว่าทำงานร่วมกันหลายคนแล้วมีเพื่อนอีกคนทำการ push ไฟล์ขึ้นมาบน Server ต่อจากเรา)
กลับมาที่ตัวโปรเจ็ค local ลองสั่ง pull เพื่อทำการเช็คว่าโปรเจ็ค local ของเรากับ Server มีอะไรเปลี่ยนแปลงไปบ้าง
git push origin masterหากมีการเปลี่ยนแปลง เราก็ทำการ merge หรือในขณะที่เรายังแก้ไขไฟล์ของเราอยู่ ไม่อยาก merge ก็ใช้การ stash เพื่อซ่อนไฟล์ของเราไว้ก่อน merge ล่าสุดจาก server แล้วค่อย commit สิ่งที่เรา stash ไว้ที่หลัง
git mergeหรือ
git stashสุดท้าย แก้ไขงานโปรเจ็คเรา จนเสร็จเรียบร้อย ก็จัดการ commit แล้ว push กลับไปเก็บไว้ที่ server อีกครั้ง เป็นอันเรียบร้อย
git commit -m "changes all files"git push- Authors
-
Chai Phonbopit
เป็น Web Dev ในบริษัทแห่งหนึ่ง ทำงานมา 10 ปีกว่าๆ ด้วยภาษาและเทคโนโลยี เช่น JavaScript, Node.js, React, Vue และปัจจุบันกำลังสนใจในเรื่องของ Blockchain และ Crypto กำลังหัดเรียนภาษา Rust