วันศุกร์ที่ 24 พฤศจิกายน พ.ศ. 2560

การใช้งาน Git เบื้องต้น (บนเครื่อง Local)


          เมื่อเราติดตั้ง Git ลงบนเครื่องเสร็จเรียบร้อยแล้ว ก็ถึงเวลาลงมือเริ่มต้นใช้งานกันซะที ซึ่งการใช้งาน Git แบบออกเป็น 2 รูปแบบคือ การใช้งาน Git บนเครื่อง Local (เครื่องคอมฯของตนเอง) กับการใช้ Git บนเครื่อง Server โดยบทความนี้จะกล่าวถึงการใช้ Git บนเครื่อง Local ก่อน เริ่มต้นจากเราจะต้องตั้งค่าผู้ใช้งานใน Git ซึ่งเป็นการระบุตัวตนเพื่อเวลาที่มีการแก้ไขจะได้รู้ว่าใครเป็นคนแก้ไขไฟล์ ว่าแล้วก็คลิกไอคอน Git เพื่อเรียกโปรแกรมออกมาแล้วพิมพ์

git config --global user.name "ชื่อของผู้ใช้งาน"
git config --global user.email "อีเมลของผู้ใช้งาน"
          ถ้าเราต้องการเช็คการตั้งค่าของ Git ให้พิมพ์คำสั่งว่า

git config --list
          เนื่องจาก Git ใช้งาน Command line ของ Linux ในการสั่งการต่าง ๆ เช่น เปลี่ยนไดเรกทอรี สร้างไฟล์ แสดงไฟล์ที่อยู่ในไดเรกทอรีปัจจุบัน เป็นต้น เพราะงั้นเรามาทำความรู้จักคำสั่ง Command line ที่ใช้งานบ่อย ๆ กันก่อนดีกว่า

คำสั่ง Command line พื้นฐาน

  •  pwd  คำสั่งแสดงไดเรกทอรีปัจจุบัน
  •  cd  คำสั่งเปลี่ยนไดเรกทอรี
  •  ls  คำสั่งแสดงไฟล์ในไดเรกทอรีปัจจุบัน
  •  mkdir  คำสั่งสร้างไดเรกทอรี
  •  rm  คำสั่งลบไฟล์
  •  vi  คำสั่งสำหรับเขียนไฟล์
          คำสั่งพื้นฐานพวกนี้เป็นคำสั่งพื้นฐานที่ใช้งานบ่อย ซึ่งเราอาจจะได้เจอในขณะใช้งาน Git อยู่ ดังนั้นควรจดจำเอาไว้


Getting Started

          มาเริ่มต้นสร้างโปรเจกต์บนเครื่อง Local (หรือก็คือเครื่องคอมพิวเตอร์ของเพื่อน ๆ ) กัน อันดับแรกให้สร้างโฟลเดอร์เปล่า ๆ ขึ้นมาสักโฟลเดอร์นึง เอาเป็นชื่อโฟลเดอร์ว่า git ละกัน ให้เปิด Notepad หรือ Text Editor ขึ้นมาแล้วพิมพ์ตามโค้ดข้างล่าง จากนั้นก็เซฟเป็นชื่อ index.html เอาไปเก็บไว้ที่โฟลเดอร์ git ที่เราเพิ่งสร้างเมื่อสักครู่

<!doctype html>
<html lang="en">
 <head>
  <meta charset="UTF-8">
  <title>Git</title>
 </head>
 <body>
  Hello World Git!
 </body>
</html>
          จากนั้นให้เราเปลี่ยนไดเรกทอรีไปยังโฟลเดอร์ git โดยการใช้คำสั่ง  cd ชื่อไดเรกทอรีที่ต้องการเปลี่ยน 

$ cd /c/AppServ/www/git/
          ให้เราทำการสร้าง Git Repository ขึ้นมาด้วยคำสั่ง  git init 

$ git init
Initialized empty Git repository in C:/AppServ/www/git/.git/
          ซึ่ง Git จะทำการสร้างโฟลเดอร์ .git ขึ้นมาภายในไดเรกทอรีของเรา แต่เราจะมองไม่เห็นเพราะโฟลเดอร์ที่ว่านั้นถูกซ่อนเอาไว้อยู่ โดยเราสามารถใช้คำสั่ง  ls -al  เพื่อแสดงไฟล์ทั้งหมด (รวมถึงไฟล์ที่ถูกซ่อนอยู่ด้วย)

          เมื่อเราสร้าง Git Repository เสร็จแล้ว เราสามารถเช็คสถานะไฟล์ที่อยู่ภายในไดเรกทอรีได้ด้วยคำสั่ง  git status 

$ git status
On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        index.html

nothing added to commit but untracked files present (use "git add" to track)
          ผลลัพธ์จากคำสั่งนี้จะแสดงสถานะของไฟล์ในไดเรกทอรีที่บอกว่าไฟล์ index.html อยู่ในสถานะ Untracked (ไฟล์ที่ยังไม่ได้ถูก track โดย Git) ซึ่งถึงแม้จะมีไฟล์อยู่ในไดเรกทอรีของเราแล้ว แต่ Git ก็ยังไม่ได้ถือว่าไฟล์นี้อยู่ในระบบอยู่ดี เราจำเป็นต้องทำการเพิ่มไฟล์เข้าไปในระบบด้วยคำสั่ง  git add ชื่อไฟล์ที่จะเพิ่ม  เพื่อให้ Git จดจำและติดตามดูไฟล์นั้น ๆ ว่ามีการเปลี่ยนแปลงอะไรบ้าง

$ git add index.html
          หลังจากที่ใช้คำสั่งข้างบนไป จะส่งผลให้ไฟล์ index.html ของเราได้ถูก track โดย Git และสถานะของไฟล์ก็เปลี่ยนไปเป็น Staged (ไฟล์ที่พร้อมจะ commit) เรียบร้อย

$ git status
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   index.html
          เอาละ ในเมื่อไฟล์ index.html อยู่ในสถานะพร้อมที่จะ commit แล้ว งั้นเราก็มาลอง commit เพื่อให้ Git บันทึกข้อมูล (ที่เหมือนเป็นการ backup ไฟล์) กันเถอะ ใช้คำสั่ง  git commit -m "MESSAGE"  โดย MESSAGE คือข้อความช่วยจำว่าเราได้ทำการแก้ไขอะไรแล้วบ้าง ซึ่งเอาไว้อ่านภายหลังกรณีที่ต้องการเช็คประวัติการแก้ไข

$ git commit -m "add index.html file to git project."
[master (root-commit) 5ac2675] add index.html file to git project.
 1 file changed, 10 insertions(+)
 create mode 100644 index.html
          หลังจาก commit ข้อมูลแล้ว ทีนี้เรามาลองแก้ไขไฟล์ index.html กัน ให้เปิดไฟล์ index.html ด้วย Text Editor แล้วก็แก้ไขข้อความภายในไฟล์ ต่อด้วยสร้างไฟล์ index_2.html ขึ้นมา จากนั้นก็เซฟไฟล์ลงไปที่เดียวกับไฟล์ index.html แล้วพิมพ์  git status  เพื่อเช็คสถานะของไฟล์ ซึ่งจะได้ผลลัพธ์ดังนี้

$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   index.html

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        index_2.html

no changes added to commit (use "git add" and/or "git commit -a")
          ตอนนี้ไฟล์ index.html ก็มีสถานะเป็น Modified (ไฟล์ที่ถูกแก้ไขแล้ว แต่ยังไม่พร้อม commit ) ส่วนไฟล์ index_2.html ที่เพิ่งเพิ่มเข้าไปก็มีสถานะเป็น Untracked (ไฟล์ที่ยังไม่ได้ถูก track โดย Git) ณ จุดนี้เราสามารถเช็คได้ว่าไฟล์ index.html ที่เราได้แก้ไขไปมีจุดแตกต่างจากไฟล์เดิมตรงไหนบ้างด้วยคำสั่ง  git diff 

$ git diff
diff --git a/index.html b/index.html
index c279477..6a23919 100644
--- a/index.html
+++ b/index.html
@@ -5,6 +5,6 @@
                <title>Git</title>
        </head>
        <body>
-               Hello World Git!
+               Hello World Git! I'm developer.
        </body>
 </html>
\ No newline at end of file
          ผลจากการใช้คำสั่ง  git diff  จะเห็นว่าโค้ดสีแดงมาจากไฟล์เก่า ส่วนโค้ดสีเขียวคือโค้ดที่ถูกแก้ไขแล้ว ถัดไปเราก็จะมาเพิ่มไฟล์เพื่อให้ Git ทำการติดตามด้วยคำสั่ง git add ซึ่งถ้าเราอยากเพิ่มหลาย ๆ ไฟล์พร้อมกัน เราก็สามารถใช้คำสั่ง  git add *  แทนการใส่ชื่อไฟล์ก็ได้ จากนั้นก็พิมพ์  git status  เพื่อเช็คสถานะของไฟล์

$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   index.html
        new file:   index_2.html
          ในเมื่อไฟล์พร้อมแล้ว เราก็ commit ไฟล์กันเล้ยยยยย

$ git commit -m "Edit index.html and Add index_2.html"
[master 144196b] Edit index.html and Add index_2.html
 2 files changed, 11 insertions(+), 1 deletion(-)
 create mode 100644 index_2.html
          เราสามารถเช็คประวัติการ commit ได้ด้วยคำสั่ง  git log 

$ git log
commit 144196ba102684d343d00152029b97a4d3383a6f (HEAD -> master)
Author: AiNoTsubasa <ooo@hotmail.com>
Date:   Mon Nov 20 13:33:17 2017 +0700

    Edit index.html and Add index_2.html

commit 0011b6471ae73350921773d80d010d5e4d64fc93
Author: AiNoTsubasa <ooo@hotmail.com>
Date:   Mon Nov 20 13:14:31 2017 +0700

    add index.html file to git project.


การกู้ไฟล์

          "ถ้าเราเผลอลบไฟล์ทิ้งไปละ...จะกู้ไฟล์กลับมายังไง?" ไม่ยากครับ อันดับแรกให้เราลองลบไฟล์ index_2.html ออกไปก่อน แล้วใช้คำสั่ง  git status  เช็คสถานะ

$ git status
On branch master
Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        deleted:    index_2.html

no changes added to commit (use "git add" and/or "git commit -a")
          จะเห็นว่า Git ได้รับรู้การหายไปของไฟล์ index_2.html แล้ว วิธีกู้ไฟล์กลับคืนมาก็ให้ใช้คำสั่ง  git checkout ชื่อไฟล์ที่ถูกลบไปแล้ว  เพียงแค่นี้ไฟล์ก็จะกลับมาอยู่ในไดเรกทอรีของเราแล้ว แต่ถ้าเราลบไฟล์ออกไปแล้ว และเผลอใช้คำสั่ง  git add ชื่อไฟล์ที่ถูกลบไปแล้ว  ซึ่งเป็นการบันทึกการลบไฟล์ index_2.html ให้พร้อมที่จะ commit ก็จะไม่สามารถกู้คืนไฟล์ได้ด้วยคำสั่ง git checkout ได้ ให้ใช้คำสั่ง  git reset HEAD ชื่อไฟล์ที่ถูกลบไปแล้ว  เพื่อลบบันทึกการลบไฟล์ index_2.html ก่อน จากนั้นค่อยใช้คำสั่ง  git checkout ชื่อไฟล์ที่ถูกลบไปแล้ว  เพื่อกู้ไฟล์กลับมาอีกที

$ git reset HEAD index_2.html
Unstaged changes after reset:
D       index_2.html
          แต่ถ้าลบไฟล์ index_2.html ใช้คำสั่ง  git add ชื่อไฟล์ที่ถูกลบไปแล้ว  และ commit ไปเรียบร้อยแล้ว ให้ใช้คำสั่ง  git reset --soft HEAD~1  ก่อน ตามด้วยคำสั่ง  git reset HEAD ชื่อไฟล์ที่ถูกลบไปแล้ว  เพื่อลบบันทึกการลบไฟล์ index_2.html ก่อน จากนั้นค่อยใช้คำสั่ง  git checkout ชื่อไฟล์ที่ถูกลบไปแล้ว  เพื่อกู้ไฟล์กลับมาอีกที


การใช้งาน Branch

          ในการพัฒนาระบบอาจมีบางครั้งที่เราต้องการเพิ่มฟีเจอร์ใหม่ ๆ ลงไปในระบบ ซึ่งก็มีความเป็นไปได้ว่าพอใส่ลงไปแล้ว เจ้าฟีเจอร์ใหม่ดันสร้างปัญหาทำให้เกิด error จนเราไม่สามารถแก้ไขโค้ดให้กลับไปเป็นเหมือนเดิมได้ แต่ถ้าเราใช้ Git เข้ามาช่วย ก็จะตัดปัญหากรณีนี้ออกไปได้ ด้วยการแตกโค้ดออกมาเป็น Branch ใหม่ ซึ่งเราสามารถเพิ่มเติม แก้ไข หรือปู้ยี่ปู้ยำโค้ดใน Branch ใหม่ได้โดยไม่ส่งผลกระทบต่อ Master พอเราแก้ไขและทดสอบจนแน่ใจว่าสามารถใช้งานได้แล้วค่อยเซฟกลับมาที่ Master เหมือนเดิม วิธีแตก Branch ก็เพียงแค่ใช้คำสั่ง  git branch ชื่อBranchใหม่  และดูรายชื่อ Branch ทั้งหมดได้ด้วยคำสั่ง  git branch 

$ git branch new_branch

$ git branch
* master
  new_branch
          จากผลลัพธ์จะเห็นได้ว่าตอนนี้บรรทัด Master มี * นำหน้า ซึ่งแสดงว่าตอนนี้เรากำลังทำงานอยู่บน Master จากนั้นให้แก้ไขไฟล์ index.html โดยเพิ่มประโยคว่า "This is message from MASTER" แล้วก็ commit

$ git add index.html
$ git commit -m "add new message into index.html(master)"
[master eb340a5] add new message into index.html(master)
 1 file changed, 1 insertion(+)
          เราได้แก้ไขไฟล์ใน Master เรียบร้อยแล้ว ให้เราสลับไปทำงานที่ Branch อื่น โดยใช้คำสั่ง  git checkout ชื่อBranch 

$ git checkout new_branch
Switched to branch 'new_branch'
          ถึงตรงจุดนี้ เราก็จะสลับมาทำงานใน new_branch แล้ว ให้เราเพิ่มประโยคว่า "This is message from NEW_BRANCH" ลงในไฟล์ index.html แล้วเข้าไปในไดเรกทอรีที่เก็บไฟล์ จากนั้นก็ก๊อบปี้ไฟล์ index_2.html แล้วเปลี่ยนชื่อเป็น index_3.html ถัดไปก็ให้เพิ่มไฟล์ index.html กับไฟล์ index_3.html ลงไปใน Git Repository แล้วก็ commit

$ git add *

$ git commit -m "Edit index.html and add index_3.html into new_branch."

[new_branch ca4a667] Edit index.html and add index_3.html into new_branch.

 2 files changed, 11 insertions(+)

 create mode 100644 index_3.html
          ทีนี้เราลองมาดูประวัติการแก้ไขของ Git ทั้งใน master และ new_branch กัน
          จะเห็นได้ว่าประวัติที่บันทึกไว้ใน master กับ new_branch มีข้อแตกต่างกัน ให้เราเปลี่ยนกลับมาที่ master แล้วลองเช็คในไดเรกทอรีที่เก็บไฟล์ดู เราก็จะพบว่าไฟล์ในไดเรกทอรีมีอยู่แค่ 2 ไฟล์ โดยไฟล์ index_3.html ที่เราเพิ่มลงไปใน new_branch ได้หายไป (ตามรูปข้างล่าง) นั่นเป็นเพราะสิ่งที่เรากระทำอยู่ใน new_branch จะไม่ส่งผลต่อ master ดังนั้นเราจึงสามารถแตก Branch ใหม่ออกมาเพื่อแก้ไขโค้ดตามใจชอบได้โดยไม่กระทบต่อ Master
          เมื่อเราแก้ไขโค้ดใน new_branch และทำการทดสอบจนมั่นใจว่าสามารถใช้งานได้จริง ๆ ให้เราสลับกลับไป master ก่อน จากนั้นค่อยใช้คำสั่ง  git merge ชื่อbranchที่ต้องการจะรวม 

$ git merge new_branch
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.
          เมื่อเรารันคำสั่ง merge แลัว จะพบว่าไฟล์ index_3.html ปรากฏอยู่ใน master และมีข้อความแจ้ง merge fail อันเนื่องมาจาก Merge Conflict ซึ่งเป็นข้อขัดแย้งที่เกิดจากการแก้ไขไฟล์ใน master และได้ทำการ commit ก่อนที่จะทำการ merge จึงทำให้ Git ไม่สามารถตัดสินใจได้ว่าจะเลือกเก็บการเปลี่ยนแปลงของ master หรือของ new_branch กันแน่ (ณ จุดนี้ เราสามารถยกเลิกการ merge ได้ด้วยการใช้คำสั่ง  git merge --abort  ) วิธีแก้ไขคือ ให้เราทำการเปิดไฟล์มาแก้ไขแล้วค่อยทำการ commit อีกครั้ง

<!doctype html>
<html lang="en">
 <head>
  <meta charset="UTF-8">
  <title>Git</title>
 </head>
 <body>
  Hello World Git! I'm developer.
<<<<<<< HEAD
  This is message from MASTER.
=======
  This is message from NEW_BRANCH
>>>>>>> new_branch
 </body>
</html>
          เมื่อเราเปิดไฟล์ index.html ก็จะพบกับส่วนที่เกิดข้อขัดแย้ง ซึ่งอยู่ภายใต้เครื่องหมาย <<<<<<< และ >>>>>>> โดยข้อความที่แตกต่างของ master จะอยู่ระหว่าง <<<<<<< HEAD กับ ======= และข้อความที่แตกต่างของ branch จะอยู่ระหว่าง ======= กับ >>>>>> ชื่อbranch ซึ่งเราจะต้องทำการแก้ไขและลบเครื่องหมายของส่วนขัดแย้งออก

$ git status

On branch master

You have unmerged paths.

  (fix conflicts and run "git commit")

  (use "git merge --abort" to abort the merge)

Changes to be committed:

        new file:   index_3.html

Unmerged paths:

  (use "git add <file>..." to mark resolution)

        both modified:   index.html
          เมื่อแก้ไข conflict เรียบร้อยแล้ว ให้เราเพิ่มไฟล์ทั้งคู่เข้า Staging และ commit เป็นอันดับถัดไป เมื่อ commit เรียบร้อยแล้ว เราสามารถลบ Branch ที่ไม่ใช้ด้วยคำสั่ง  git branch -d ชื่อBranchที่ต้องการลบ 

$ git branch -d new_branch
Deleted branch new_branch (was ca4a667).
          ถึงตรงนี้เพื่อน ๆ ก็คงจะใช้งาน Git แบบพื้นฐานเป็นแล้ว ซึ่งในบทความนี้จะเป็นการใช้งาน Git บนเครื่องคอมพิวเตอร์ของตนเอง และบทความถัดไปก็จะเป็นการใช้งาน Git บน Server สุดท้ายนี้ขอลาไปด้วยสรุปคำสั่งของ Git ที่ใช้ในบทความนี้ละกัน แล้วพบกันใหม่ในบทความถัดไปนะฮ้าฟฟฟฟฟ

สรุปคำสั่ง

git init : ใช้สร้าง Git Repository
git status : ใช้เช็คสถานะไฟล์ในไดเรกทอรี
git add ชื่อไฟล์ : ใช้เพิ่มไฟล์ให้ Git ติดตาม
git commit -m "MESSAGE" : ใช้ commit โดย MESSAGE คือข้อความช่วยจำเกี่ยวกับการเปลี่ยนแปลงในครั้งนี้
git diff : ใช้แสดงจุดที่เปลี่ยนไปจากไฟล์เดิม
git log : ใช้แสดงประวัติการ commit
git checkout ชื่อไฟล์ที่ถูกลบไปแล้ว : ใช้กู้ไฟล์ที่ถูกลบไปแล้ว
git reset HEAD ชื่อไฟล์ : ยกเลิกสถานะ Staging ของไฟล์ให้กลับไปเป็น Unstages
git reset --soft HEAD~1 : ใช้สำหรับยกเลิกการ commit ก่อนหน้านี้
git branch : ใช้แสดงรายชื่อ branch ทั้งหมด
git branch ชื่อbranch : สร้าง branch ใหม่
git checkout ชื่อbranch : สลับไปใช้งาน branch ที่ระบุ
git merge ชื่อbranch : ใช้รวมไฟล์จาก branch ที่ระบุ มายัง branch ปัจจุบัน
git merge --abort : ใช้ยกเลิกการรวมไฟล์
git branch -d ชื่อbranch : ลบ branch ที่ระบุ

Share:

0 comments:

แสดงความคิดเห็น