เมื่อเราติดตั้ง 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 คำสั่งสำหรับเขียนไฟล์
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 ที่ระบุ
0 comments:
แสดงความคิดเห็น