สรุปจากการเรียน Try Git
บทความนี้เป็นการบันทึกการเรียนรู้การใช้งาน 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 push
git pull origin master
: เป็นการเช็คการเปลี่ยนแปลงของ repository จาก server เทียบกับ local (นึกถึงถ้าโปรเจ็คเราพัฒนากันหลายคน แล้วมีคนนึง push patch ใหม่ลงไป เราก็จะเห็น)git fetch
: เป็นการสั่งเช็คการเปลี่ยนแปลง ว่ามีอะไรเปลี่ยนแปลงบ้าง แต่ไม่ได้ทำอะไร เช็คอย่างเดียวgit merge
: เป็นการรวมการเปลี่ยนแปลง หลังจากgit fetch
แล้วgit pull
: มีค่าเท่ากับgit fetch
+git merge
git diff HEAD
: เช็คการเปลี่ยนแปลงในโปรเจ็ค เทียบกับHEAD
: commit ล่าสุดgit reset FILENAME
: ทำการลบไฟล์ออกจาก staging (unstaged) ไม่ได้ลบไฟล์ออกจาโฟลเดอร์นะgit checkout --<target>
: ทำการเปลี่ยนกลับไปครั้งล่าสุดที่ทำการ commitgit branch NAME
: หมายถึงการสร้าง branch ใหม่ชื่อNAME
git 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 ที่ชื่อว่าNAME
Repository
: คือ โฟลเดอร์หรือโปรเจ็คที่มี 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 octobox
cd octobox
จากนั้นสั่ง initialize Git เพื่อบอกให้ folder นี้เราจะใช้ Git ในการจัดเก็บไฟล์ต่างๆ
git init
Initialized empty Git repository in /octobox/.git/
ทำการเพิ่มไฟล์ใหม่ลงไป ชื่อว่า octocat.txt
จากนั้นทดสอบ เช็คสถานะของ Git
touch octocat.txt
git status
จะเห็นสถานะของ Git ว่า Untracked files: ...
บอกว่ามีไฟล์อะไรที่เรายังไม่ได้ track
สถานะไฟล์ใน Git มีดังนี้
- เริ่มต้นทุกไฟล์จะอยู่ในสถานะ
untracked
- ไฟล์ที่อยู่ในสถานะ
staging
( คือไฟล์ก่อนที่จะทำการ commit ไปที่ Git) - ไฟล์ที่อยู่ในสถานะ
commit
คือ snapshot ของ repository
git add octocat.txt
git 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
- Name
- Chai Phonbopit
- Website
- @Phonbopit