สรุปจากการเรียน Try Git

Published on
Git
2014/12/note-from-try-git
Discord

บทความนี้เป็นการบันทึกการเรียนรู้การใช้งาน 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 : คือการลบไฟล์ออกจากสถานะ stage
  • git commit -m "message": เป็นการ commit ไฟล์ทั้งหมดในสถานะ stage ไปเซฟไว้ใน Git เป็น snapshot
  • git log : คือการดูประวัติ Git ต่างๆที่เราเคยทำไว้
  • git stash : คือการเซฟและซ่อนโปรเจ็คของเราไว้ สามารถที่จะ restore กลับได้ทุกเมื่อ
  • git clone GIT_URL : ทำการ clone Git ตาม URL ที่กำหนด มาไว้ที่เครื่อง
  • git remote add origin REMOTE_URL : คือการเพิ่ม Remote Repository สำหรับ push Git ไปยัง Server
  • git 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> : ทำการเปลี่ยนกลับไปครั้งล่าสุดที่ทำการ commit
  • git 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 : คือ ไฟล์ที่มีการเปลี่ยนแปลงแต่ว่ายังไม่พร้อมที่จะ commit
  • untracked : คือ ไฟล์ที่ยังไม่ได้ถูก track โดย Git (โดยเฉพาะการสร้างไฟล์ใหม่ ต้องใช้ git add FILENAME เพื่อให้ Git ทำการ track ไฟล์นั้นๆ)
  • deleted : คือ ไฟล์ที่ถูกลบออกจากโปรเจ็ค และรอที่จะลบออกจาก Git (ข้อดีคือหากเราพลาดลบไฟล์ไป ก็ยังกู้คืนได้ เพราะ Git ได้ track ทุกๆไฟล์ของเราไว้)
  • HEAD : คือ pointer ที่เก็บทุกๆ commit ของเรา โดยปกติแล้ว HEAD จะชี้ไปที่ commit ล่าสุด reference ของ HEAD จะอยู่ในรูปแบบ SHA
  • branch : เหมาะสำหรับการทำโปรเจ็ค ที่มีหลายๆ features ก็ทำการแยก branch ออกมา เช่น branch-dev, branch-release เป็นต้น
  • merge : คือการรวมไฟล์ จาก branch หนึ่งกับอีก branch หนึ่งเข้าด้วยกัน
  • merge conflict คือ เกิดกรณีที่มีการแก้ไขไฟล์เดียวกัน เวลาเดียวกัน Git จะไม่รู้ว่าเราควรจะใช้ไฟล์ไหนดี

Try 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 มีดังนี้

  1. เริ่มต้นทุกไฟล์จะอยู่ในสถานะ untracked
  2. ไฟล์ที่อยู่ในสถานะ staging ( คือไฟล์ก่อนที่จะทำการ commit ไปที่ Git)
  3. ไฟล์ที่อยู่ในสถานะ 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
Buy Me A Coffee
Authors
Discord