Praneat Blog

Yosapol Jitrak
Game Developer & Game Infrastructure
22 May 2018

Basic of Git command

ก่อนหน้านี้ผมได้เขียนผมความเกี่ยวกับทำไมเราต้องรู้จัก และใช้ Version Control System มาสักพักล่ะ
คราวนี้ผมจะมาต่อกันที่เรื่องคำสั่งที่เป็นพื้นฐานของ Git กัน
ส่วนเรื่องการติดตั้งนั้นผมขอข้ามนะครับ เนื่องจากไม่ยากมาก และขึ้นอยู่กับ OS ที่แต่ละท่านใช้ด้วย


ต้องบอกก่อนว่าทำไมผมถึงเริ่มที่การใช้ Git Command
ทำไมถึงไม่เริ่มที่ Git GUI (Graphic User Interface) ซึ่งมันน่าจะง่ายกว่าเยอะ
จริง ๆ แล้ว ผมก็เป็นคนนึงที่เริ่มใช้ Git จาก GUI นั้นแหละ
แต่ก็เจอบางงานที่ไม่สามารถใช้ Git GUI ได้ เช่น ทำงานบนเครื่อง Server ที่มีแต่ Command line
รวมถึงหากเข้าใจคำสั่งต่าง ๆ แล้ว เราสามารถเปลี่ยนไปใช้กับแบบที่มี GUI ได้ไม่ยากเลย
เพราะจริง ๆ แล้ว แบบที่มี GUI นั้น เบื้องหลังมันก็คือ Command นั้นแหละ แค่เราไม่ต้องพิมพ์เอง
ผมจึงตัดสินใจเขียนการใช้ Git Command



Tools ที่ต้องใช้

หากเป็น Mac หรือ Linux user ก็จะใช้ Terminal ได้เลย
ส่วน Windows นั้นก็ใช้ได้หลายอย่าง Command line หรือ MinTTY ที่ลงมาพร้อม Git for Windows
หรือหากใครอยากจะลองใช้ Terminal ของ Windows Subsystem for Linux ก็ได้


เข้าเรื่องสักทีหลังจากเกริ่นมานาน
อย่างแรกเลย เราต้องไปที่ Directory หรือ Folder ที่เราต้องการจะทำ Version Control เสียก่อน
ด้วย Command line tool ของเรา




git init คือ การเริ่มสร้าง Git repository ขึ้นมา
เป็นการทำให้ Folder นี้ และ Sub folder สามารถใช้ Command ต่าง ๆ ของ Git ได้

    ~$git init




git status คือ การเช็คสถานะไฟล์ต่าง ๆ ที่อยู่ใน Git repository ของเรา

    ~$git status

แต่ตอนนี้ repository ของเราว่างเปล่า เราต้องสร้างไฟล์มาก่อน
ตัวอย่างนี้ผมจะสร้างไฟล์ชื่อ test
ในไฟล์เขียนไว้ว่า Hello world นะครับ
จะเห็นว่าไฟล์ test ของเรานั้นอยู่ในกลุ่มของสถานะ Untracked files


ตรงนี้อาจจะมีหลายคนเริ่มสงสัยล่ะว่ามันคืออะไร
งั้นผมขอยกสถานะต่าง ๆ มีอะไรบ้างก่อนเลยแล้วกันครับ

  • Untracked คือสถานะที่ยังไม่ถูกติดตามโดย Git (ส่วนใหญ่เป็นสถานะของไฟล์ที่สร้างใหม่)
  • Staged คือสถานะที่พร้อมจะถูก commit
  • Unstaged คือสถานะของไฟล์ที่ถูกติดตามแล้ว ซึ่งถูกแก้ไขเพิ่ม แต่ยังไม่ได้เตรียม commit
  • Deleted คือสถานะของไฟล์ที่ถูกลบออก




git add คือ การเปลี่ยนให้ไฟล์ของเราถูกติดตามด้วย Git กรณีที่ไฟล์ของเราอยู่ในสถานะ Untracked
หรือหากสถานะไฟล์ของเราอยู่ใน Unstaged ก็จะถูกเปลี่ยนเป็น Staged ให้
จริง ๆ แล้วเราสามารถเลือกแค่บางส่วนของไฟล์ที่ต้องการจะ Staged ได้
หรือสามารถเลือกไฟล์ทั้ง Directory ที่ต้องการก็ได้
แต่เพื่อความเข้าใจง่ายจึงเลือกทั้งไฟล์ไปก่อนครับ

    ~$git add <file_name>

และเมื่อ git status ดูอีกครั้งจะเห็นว่าไฟล์ test ของเราอยู่ในสถานะ Staged เรียบร้อยแล้ว




git commit อธิบายง่าย ๆ คือ การทำ Checkpoint เป็นประวัติให้กับ Repository
เราสามารถย้อนกลับมาดูว่าทำอะไรไปบ้าง หรือทำการย้อน Commit หรืออะไรต่าง ๆ ได้มากมาย
เราจะไม่ลงลึกมากครับ เพราะเดี๋ยวจะยืดยาว และเบื่อหน่ายกันไปเสียก่อน

    ~$git commit

เมื่อเรากดยืนยันคำสั่งด้วยปุ่ม Enter Git จะให้เราเขียน Commit message
ด้วยโปรแกรม Text editor ที่เป็น Default
ซึ่งคุณผู้อ่านสามารถเปลี่ยน Default text editor ได้เองครับ
ตรงนี้จะให้เขียนเตือนความจำเราว่าทำอะไรไปบ้างใน commit นี้
เมื่อทำการเซฟ และออกจาก Text editor จะมีผลสรุปให้
ว่าเราทำการเปลี่ยนแปลงอะไรไปบ้างใน Commit นี้




git log คือ การแสดงประวัติของ Repository ที่ผ่านมา

    ~$git log




git diff มีไว้สำหรับตรวจสอบความเปลี่ยนแปลงของไฟล์ที่ติดตามอยู่
ให้ดูที่สี หรือดูเครื่องหมาย +, - หน้าบรรทัดก็ได้
โดยสีเขียว หรือ + หมายความว่าไฟล์มีการเพิ่มบรรทัดนี้เข้ามาใหม่จาก commit หรือที่ add ไว้รอบล่าสุด
โดยสีแดง หรือ - หมายความว่าไฟล์มีการลบบรรทัดนี้จาก commit หรือที่ add ไว้รอบล่าสุด

    ~$git diff

ตัวอย่างนี้ผมจะแก้ไฟล์ test ของเรา
จากของเดิมในไฟล์เขียนไว้ว่า
Hello world นะครับ
เป็น Test changed
โดยจะเห็นว่ามีการลบบรรทัดเดิม คือ Hello world เป็น Test changed




git checkout คำสั่งนี้มีความสามารถ 2 อย่าง
อย่างแรก คือ สลับ branch (ตอนนี้ขอยังไม่กล่าวถึงนะครับ)
อย่างที่สอง คือ ยกเลิกการเปลี่ยนแปลงของไฟล์
และตอนนี้เราจะสนใจที่การยกเลิกการเปลี่ยนแปลงของไฟล์

    ~$git checkout <file_name>

ต่อจากเดิมที่เราได้ทำการแก้ไขไฟล์ test ไปก่อนหน้านี้แล้ว
จะเห็นได้ว่าเมื่อเรา checkout ไฟล์ test แล้ว
เป็นการยกเลิกการเปลี่ยนแปลงของไฟล์ test กลับไปเป็นเหมือนเดิม




คำสั่งก่อนหน้านี้ทั้งหมดนั้น จะทำงานอยู่บนเครื่องเราเพียงเครื่องเดียวเท่านั้น ซึ่งจะเรียกว่า local
หากต้องการทำงานร่วมกับผู้อื่น หรือให้ออนไลน์ได้มักจะต้องทำการฝากไว้ที่ผู้ให้บริการ Git Hosting
เช่น GitHub, Bitbucket เป็นต้น ซึ่งเราจะเรียกว่า remote




git remote คำสั่งนี้ไว้สำหรับจัดการ repository ที่ติดตามทั้งหมด
ก่อนหน้านี้หากได้ทำตามทั้งหมดแล้ว สามารถเอา repository ของเราขึ้น remote ได้
เพื่อเป็นการสำรองงานไว้บน Server และสามารถแชร์กับผู้อื่นได้
โดยให้ทำการสมัคร Account และสร้าง Repository จากผู้ให้บริการ Git Hosting ให้เรียบร้อยเสียก่อน

ตอนนี้เราจะใช้คำสั่ง git remote add เพื่อให้ repository ของเรารู้ว่า sync กับ remote ไหนอยู่บ้าง

    ~$git remote add <name> <url>

คุณผู้อ่านจะต้องเอา url ของตัวเองนะครับ url นี้แค่ตัวอย่างเท่านั้น


หากต้องการตรวจสอบว่าสำเร็จหรือไม่ ให้ใช้คำสั่ง git remote -v ไว้สำหรับโชว์ remote ที่ติดตามอยู่

    ~$git remote -v




git push คำสั่งนี้ไว้สำหรับเอางานเราขึ้น remote repository

    ~$git push




git clone คำสั่งนี้ไว้สำหรับติดตั้ง repositiory เดิมจาก remote ที่มีอยู่ก่อนแล้ว

    ~$git clone <url>

คุณผู้อ่านสามารถลอง clone project ของผมได้เลยครับ

    ~$git clone https://github.com/Eji4h/Git-command-sample




git pull คำสั่งนี้ไว้สำหรับ update repository ใน local ของเรา จาก remote
(คำสั่งนี้ผมขอข้าม ไม่ทำตัวอย่างให้ดูนะครับ)

    ~$git pull



จากคำสั่งที่ยกมาก็เป็นคำสั่งพื้นฐานสำหรับการใช้งาน Git เบื้องต้นเพียงเท่านั้น
ยังเพียงพอแค่สำหรับทำงานคนเดียว
คำสั่งแต่ละคำสั่งมี option มากมาย
เราสามารถใช้คำสั่ง --help ในการถามว่าคำสั่งที่เราสนใจอยู่นั้นมีรายละเอียดอย่างไรบ้าง


รู้สึกว่าบทความนี้ค่อนข้างจะยาวเลย คราวหน้าจะมาต่อให้กับการทำ branch ของ Git นะครับ