Git จากติดตั้งจนเป็นงาน
ขอพูดนิดนึง ผมพึ่งรู้จัก git ได้สมัย 2 ปีที่แล้ว สมัยที่พึ่งหัดเขียน พวก html css php sql ใหม่ๆ มีงานที่ต้องส่งอาจารย์โห๋ตอนนั้นนี้รีบ Build Project มาเป็นเดือน เพื่อที่จะให้เสร็จและสบายที่หลัง แต่สุดท้ายปัญหามันก็เกิดกับผม แทบร้องไห้เมื่อก่อนส่งงานหนึ่งวัน harddisk ดันพังสะได้ Oh god ปั่นวันเดียวเอาจนเสร็จ จากโปรเจคที่ทำไว้ดีก็ต้องเป็นโปรเจคที่ทำผ่านๆ ตั้งแต่นั้นก็เริ่มหา tool มาช่วยจนมาเจอ เจ้า git เหมือนเป็นสิ่งที่ฟ้าประทานให้ผมชัดๆ
Git คือ ?
Version Control แบบ Distributed ตัวหนึ่ง เป็นระบบที่ใช้จัดเก็บและควบคุมการเปลี่ยนแปลงที่เกิดขึ้นกับไฟล์ชนิดใดก็ได้
Version control คืออะไร และทำไมคุณถึงต้องแคร์? Version control คือ ระบบที่จัดเก็บการเปลี่ยนแปลงที่เกิดขึ้นกับไฟล์หนึ่งหรือหลายไฟล์เพื่อที่คุณสามารถเรียกเวอร์ชั่นใดเวอร์ชั่นหนึ่งกลับมาดูเมื่อไรก็ได้ หนังสือเล่มนี้จะยกตัวอย่างจากไฟล์ที่เป็นซอร์สโค้ดของซอฟต์แวร์ แต่ขอให้เข้าใจว่าจริง ๆ แล้วคุณสามารถใช้ version control กับไฟล์ชนิดใดก็ได้ถ้าคุณเป็นนักออกแบบกราฟฟิคหรือเว็บดีไซเนอร์และต้องการเก็บทุกเวอร์ชั่นของรูปภาพหรือเลย์เอาต์ (ซึ่งคุณน่าจะอยากเก็บอยู่) การใช้ Version Control System (VCS) เป็นสิ่งที่ชาญฉลาดมาก เพราะมันช่วยให้คุณสามารถย้อนไฟล์บางไฟล์หรือแม้กระทั่งทั้งโปรเจคกลับไปเป็นเวอร์ชั่นเก่าได้ นอกจากนั้นระบบ VCS ยังจะช่วยให้คุณเปรียบเทียบการแก้ไขที่เกิดขึ้นในอดีต ดูว่าใครเป็นคนแก้ไขคนสุดท้ายที่อาจทำให้เกิดปัญหา แก้ไขเมื่อไร ฯลฯ และยังช่วยให้คุณสามารถกู้คืนไฟล์ที่คุณลบหรือทำเสียโดยไม่ตั้งใจได้อย่างง่ายดายform git-scm.com
แล้วทำไมเราถึงต้องใช้ git
- Source Code ไม่มีวันหาย ย้อนกลับได้ตลอดเวลา
- ช่วยให้เวลาพัฒนางานเป็น team เป็นไปอย่างง่ายขึ้น
- สามารถดูได้ว่าส่วนไหนใครเป็นคนทำ
- สามารถทำงานรวมกันผ่าน Git Hosting ได้ (ตัวนี้ตอบโจทย์มาก)
ติดตั้ง Git ไว้ในเครื้องกันก่อน
Linux (Debuan)
$ sudo apt-get install git
Linux ( Fedora )
$ sudo yuminstall git
Mac
https://git-scm.com/download/mac
Windows
https://git-scm.com/download/win
ขั้นตอนการติดตั้งคงไม่ต้องสอนเนาะ น่าจะทำเป็นกันทุกคนนะครับ และเมื่อติดตั้งลงเครื่องเสร็จเรียบร้อยให้ลองเข้า Command line หรือ Terminal แล้วพิมพ์คำสั่ง
git —-version
ถ้าขึ้น Version ก็ถือว่าติดตั้งเรียบร้อย
คำสั่งที่ใช้บ่อย
ทุกคำสั่งเราจะสามารถ run ใน Command line หรือ Terminal ได้เลยนะ
git config
git config
เป็นคำสั่งที่ใช้ไว้สำหรับกำหนดข้อมูลผู้ใช้เพื่อระบุ ตัวตน ของ git
$ git config --global user.name "Amiearth" #กำหนดชื่อผู้ใช้
$ git config --global user.email "example@mail.com" #กำหนดอีเมล์ของผู้ใช้
$ git config --global --list #ตรวจสองอีกครั้งหลังจากกำหนดค่าเสร็จแล้ว
git init
git init
คำสั่งนี้จะเป็นคำสั้งใช้สำหรับสร้าง Folder ชื่อว่า .git
ขึ้นมาซึ่งตัวนี้จะเอาไว้เก็บ git repository เปล่าๆ ที่ยังไม่ได้มีอะไร เพื่อสร้างมาไว้สำรองข้อมูลเก็บไว้
.git
เป็น Folder ที่จะถูกซ้อนอยู่ถ้าหาไม่เจอก็ไม่แปลก ก็ไปทำการเปิดให้แสดง Folder Hidden สะ
repository
เป็นที่เก็บข้อมูล มองง่ายๆ คล้าย Folder เพื่อเอา project เราไปเก็บนั้นเอง
$ git init
git add
git add
เมื่อกี้เราได้สร้าง Folder .git
ขึ้นมาแล้ว เราจะทำการเปลี่ยนแปลงสถานะ File ที่เรา add ให้เป็นสถานะ Staged
$ git add <file_name>
$ git add index.html #เพิ่มไฟล์ชื่อ README.md เข้าไปที่สถานะ Staged
$ git add . #ใช้ในกรณีที่ใช้สำหรับเพิ่ม File ทั้งหมด
git status
git status
จากที่เราได้เพิ่ม File แล้วเราจะรู้ได้ยังไงว่าเราเพิ่ม File อะไรเข้าไปเป็นสถานะ Staged บ่าง เราจะใช้คำสั่ง git status
เพื่อที่จะดูสถานะของแต่ละ File ว่าได้ถูก เพิ่มไปหรือยัง
git status
git rm
git rm
เราได้พูดถึง git add ที่เปลี่ยน status file ให้เป็น Staged แล้วเราก็จะมาเรียนรู้เรื่องการทำ Unstaged กันบ่าง ใช้คำสั่ง git rm
ซึ่งถ้าชื่อเต็มก็คือ git remove นั้นแหละ แต่ concept มันก็คล้าย git add นั้นแหละ คือ git rm ก็คือไม่ได้ลบ file แต่แค่เปลียนสถานะให้เป็น unstaged เหมือนเดิมแค่นั้นเอง
# git unstaged เฉพาะ file
$ git rm --cached < file ># Unstaged all$ git reset --hard HEAD
$ git clean -f -d
$ git checkout master
$ git fetch origin master
$ git reset --hard origin/master
$ git pull
$ git submodule update
$ git submodule update --init --recursive
$ git submodule foreach git reset --hard HEAD
$ git submodule foreach git clean -f -d
$ git submodule foreach git submodule update --init --recursive
$ git submodule foreach git fetch
$ git submodule foreach git pull
git commit
git commit
เป็นการยืนยัน File ของเราที่เราทำการแปลงเป็น สถานะ Staged เพื่อที่จะเอาไปเก็บ Backup ไว้ใน Local Repository
git commit
มีประโยชน์มาก เพราะเวลาเรา commit code backup ไว้เราจะต้องตั้งชื่อ commit ไว้ด้วย เพื่อเวลาเราต้องการกลับมาใช้ code ชุดจะได้ กลับมาใช้ตามชื่อ log ที่ได้เขียนไว้
ซึ่งการใช้งานก็ไม่ยากเลย
$git commit -m "message" #ยืนยันการเปลี่ยนแปลงพร้อมข้อความ
$git commit -am "message" #เพิ่มการเปลี่ยนแปลงและยืนยันพร้อมข้อความ
$git commit #เพิ่มข้อความในโปรแกรม vi#ยืนยันการเปลี่ยนแปลงพร้อมข้อความและ merge ลงใน commit ล่าสุด
$git commit --amend -m "message"
ของแถม
git log
git log
สำหรับดูประวัติเปลี่ยนแปลง บน local repository ว่า มีใครทำอะไรบ้าง
ในช่วงเวลาไหนมีเหตุการณ์อะไรเกิดขึ้นบ้างแต่ละการเปลี่ยนแปลงอะไรไป
$git log
$git log --oneline
$git log --oneline --decorate
$git log --oneline --decorate --graph$git log --stat # Diff from log
$git log --grep="Message" # Log by message
$git log --after="2017-2-14" # Log in date
$git log --before="2017-2-14" # Log in date
$git log --author=pakin # Log by user
git remote
git remote
ขึ้นตอนนี้เราจะทำงานผ่าน git hosting ตัวอย่างนี้ผมจะใช้ github ละกัน ก่อนอื่น ต้องไปสมัคร Account github กันก่อน สมัครอะไรเสร็จแล้ว
เราจะมาสร้าง Repository ไว้ใน github กัน
- เราก็ไปสร้างชื่อของ Repository ของเราไว้ใน github ก่อนผมจะตั้งชื่อว่า test_git
- แล้วก็ทำการ Create repository เลย
เมื่อสร้างเรียบร้อยก็จะมี คำสั่งมาไว้พร้องหมดแล้วแต่ผมยังไม่มี Project นะสิ เดียวไปสร้าง Project แปปนึง
เดียวเราจะทำการสร้าง File ที่มีชื่อว่า index.html
ไว้ใน Folder นี้
touch index.html
และจากนั้นก็จะเอาตัว file นี้ไปเปิดใน text editor แล้วใส่ข้อความว่า Hello world
แบบนี้
** อย่าลืม Save ด้วยนะท่านๆ
จากนั้นเราต้องทำ git init
เพื่อสร้าง local repository บน project เรา
ผมจะข้ามขั้นตอน git config
ไปเลยนะ เพราะผมเคยทำไปแล้ว
เมื่อเรา git init เสร็จเรียบร้อยเราจะได้ Folder ที่ซ้อนอยู่ชื่อ .git เพื่อเก็บ local Repository
จากนั้น เราจะทำการ add file index.html ให้เป็น Staged
แล้วเราจะมาลอง ตรวจดูว่า git add เราได้ไหม ก็ไปใช้ git status ดู
ผมจะไม่ remove อะไร นะ ก็จะทำการ commit code ไปเลย โดยผมจะตั้งชื่อประวัติ commit ว่า first project ก่อนละกัน
จากนั้นเราจะทำ repository ให้มันเชื่อมกับ git hosting
$ git remote add origin <URL> #เพิ่ม Remote Repository ชื่อ origin$ git remote add origin https://github.com/earth774/test_git.git#เพิ่ม Remote Repository ใหม่ชื่อ origin
$ git remote set-url origin <New URL>$ git remote -v #แสดง Remote Repository
$ git config --list #แสดงคุณสมบัติต่างๆของ Git ซึ่งจะมี Remote Repository แสดงออกมาด้วย
เราเราสามารถตรวจสอบได้ว่า git ของเรา remote ไปยังไหนได้
git push
git push
เป็นการ upload source code ที่เราได้ stage ที่ commit ไปแล้ว จาก Local Repository นำขึ้นไปอยู่ใน Remote Repository ซึ่งก็คือที่เราสร้าง อยู่บน github นั้นเอง
$ git push origin master
$ git push -u origin master
เราจะทำการ push ไปยัง remote ชื่อว่า origin แล้ว Branch ที่มีชื่อว่า master
สำหรับบางคนอาจจะมี pop up login github ขึ้นมาเพื่อที่จะทำการ เข้าสู่ระบบนั้นเราก็จะเอารหัสที่เราเข้าใช้เข้าสู่ระบบ github นั้นแหละ ใส่เข้าไป
จากนั้นลองกลับมา โหลดหน้า github ที่เราได้สร้าง repository ใหม่อีกที
Code เราก็ อยู่บน git host เรียบร้อย
git fetch
git fetch
เป็นคำสั่งที่เอาข้อมูลล่าสุดที่อยู่บน Remote Repository ของเราลงมายัง Local Repository จะยังไม่ได้ Merge code จาก Remote Repository ลงมานะ
# รับการเปลี่ยนแปลงทุก Branch จาก Remote Repository
$ git fetch --all# รับการเปลี่ยนแปลง Branch master จาก Remote Repository ที่ชื่อ origin
$ git fetch origin master# แต่ทุกทีผมอยู่ไหน Branch ไหน ก็ใช้แค่คำสั่ง สั้นๆ ก็พอ
$ git fetch
git pull
git pull
เป็นคำสั่งที่เอาข้อมูลล่าสุดที่อยู่บน Remote Repository ของเราลงมายัง Local Repository แต่จะทำการ Merge code จาก Remote Repository ของเรามาลงใน Local
# แต่ทุกทีผมอยู่ไหน Branch ไหน ก็ใช้แค่คำสั่ง สั้นๆ ก็พอ
$ git pull# รับการเปลี่ยนแปลง Branch master จาก Remote Repository ที่ชื่อ origin
$ git pull origin master
git clone
git clone
เป็นคำสั่งที่จะเป็นคำสั้งที่ใช้สำหรับ Download Source code ที่เราเอาไปเก็บไว้บน git host มาลงไว้ในเครื่องของเรา คำสั้งนี้จะคุณหูคุณตากันมากสำหรับสายที่ชอบไปโหลด code คนอื่นมาลอง run ดู
$ git clone <...url...>$ git clone https://github.com/earth774/test_git.git
สรุป
ทั้งหมดในเนื่อหานี้เท่านี้น่าถือว่าพอใช้งานกันได้ เพราะ Blog นี้ผมอาจจะไม่ได้ลงรายละเอียกทุกคำสั้งของ git มาทั้งหมด เพราะอยากให้เห็นภาพเบื่องต้นว่ามันเอาไปใช้ยังไง แล้วทำไรได้บ้าง เดียวถ้าว่าๆ เดียวจะมาเขียนเรื่องการแตก สาขา หรือ branch เพื่อให้การทำงานเป็น team เป็นไปอย่างง่ายมากขึ้นนั้นเอง
ถ้าใครมีคำสั้งพื้นฐานที่ควรต้องรู้หรือเขียนผิดพลาดยังไงสามารถแนะนำกันเข้ามาได้ 😀😀😀😀😀😀😀