วันอังคารที่ 28 พฤศจิกายน พ.ศ. 2560

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


          ในบทความที่แล้ว เราได้ฝึกใช้งาน Git บนเครื่องคอมพิวเตอร์ของตนเอง ซึ่งเพื่อน ๆ ก็คงพอจะเห็นประโยชน์จากการใช้งาน Git ไปบ้างแล้ว แต่ในความเป็นจริงถ้าเราจะใช้ Git ในการทำงานร่วมกับเพื่อน ๆ ในทีม ก็จำเป็นต้องย้าย Git ไปใช้งานบน Server โดยเว็ปไซต์ให้บริการ Git ที่แนะนำได้แก่ Github และ Bitbucket ซึ่งทั้งสองเว็บก็จะมีแนวคิดในการให้บริการที่แตกต่างกัน
  • Github จะเน้นไปทางด้าน Git Repository แบบสาธารณะ คือเปิดให้เราสามารถอัพโหลด Git Repository แบบที่ใคร ๆ ก็สามารถเข้าถึงได้อย่างฟรี ๆ ไม่จำกัดจำนวน แต่ถ้าจะทำ Git Repository แบบส่วนตัวก็ต้องเสียค่าใช้จ่าย
  • Bitbucket จะเน้นในด้านตรงข้ามของ Github นั่นคือเปิดให้อัพโหลด Git Repository แบบส่วนตัวได้ฟรีแบบไม่จำกัดจำนวน แต่มีการจำกัดจำนวนคนที่เข้าถึง Repository นั้น ๆ ต้องไม่เกิน 5 คน
          เราจะใช้บริการของ Bitbucket ที่ให้บริการ Git Repository แบบส่วนตัว โดยเราจะต้องสร้าง Git Repository ในเว็บ Bitbucket แล้วค่อยโหลดลงมาที่เครื่อง ซึ่งอันดับแรกก็ให้สมัครบริการในเว็บก่อน เข้าไป ที่นี่ แล้วกรอกอีเมลเริ่มสมัครได้เล้ยยยยย
กรอกอีเมล ชื่อ และรหัสผ่าน จากนั้นก็กดสมัคร
เมื่อสมัครเสร็จแล้วให้เราเข้าอีเมลไปกดยืนยันการสมัคร
หลังกดยืนยันแล้ว ให้เราตั้งชื่อ username เฉพาะตัว
กด Create a repository
ตั้งชื่อ Repository name จากนั้นก็กด Create repository
ให้ก็อปปี้ข้อความที่อยู่ในกรอบสีแดง

          ให้สร้างโฟลเดอร์เปล่า ๆ ขึ้นมา (เอาเป็นชื่อว่า git02 ละกัน) จากนั้นก็เปิด Git แล้วย้ายเข้าไปในโฟลเดอร์นั้น ๆ แล้ววางคำสั่งที่ได้ก็อปปี้มาจากในเว็บ
          ใส่รหัสผ่านแล้วกด Log in จากนั้น Git จะทำการโคลน Git Repository ที่เราสร้างขึ้นใน Bitbucket ลงมาในเครื่องของเรา

$ git clone https://wing_of_love@bitbucket.org/wing_of_love/test_git.git
Cloning into 'test_git'...
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
          คำสั่ง  git clone URLที่เก็บไฟล์Git  จะทำการดึงข้อมูล Git Repository มาจาก URL ลงมาที่เครื่องของเรา ทีนี้ให้เราลองเข้าไปใน git02 ดู ก็จะพบว่ามีโฟลเดอร์ test_git โผล่ขึ้นมาโฟลเดอร์นึง ภายในจะมีไฟล์ README.md อยู่ไฟล์เดียว ให้ลองใช้คำสั่ง git status

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.

nothing to commit, working tree clean
          จากผลลัพธ์จะเห็นได้ว่า Branch เริ่มต้นมีอยู่ 2 Branch ได้แก่ origin และ master โดยที่เครื่องของเราจะใช้งาน Branch master และที่เครื่อง Server จะใช้งาน Branch origin ซึ่งเมื่อเราแก้ไขไฟล์เสร็จแล้ว เราต้อง commit ใน master ก่อน จากนั้นจึงจะอัพโหลดไปยัง origin ว่าแล้วเราก็มาลองลงมือทำกันเลยดีกว่า เริ่มจากไปก็อปปี้ไฟล์ index.html จากในบทความที่แล้วมาใส่ในโฟลเดอร์ test_git

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.

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)
          วิธีใช้งานเบื้องต้นก็จะคล้าย ๆ กับในบทความที่แล้ว

$ git add index.html

$ git commit -m "Add index.html"
[master 45e7596] Add index.html
 1 file changed, 12 insertions(+)
 create mode 100644 index.html

$ git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)

nothing to commit, working tree clean
          หลังจาก commit ในเครื่องตนเองเสร็จแล้ว ถัดไปก็ให้ commit ขึ้น Server เพื่อแชร์ไฟล์ให้กับเพื่อนร่วมทีม ให้ใช้คำสั่ง  git push ชื่อBranchบนServer ชื่อBranchที่จะpushขึ้นไป 

$ git push origin master
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 441 bytes | 147.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://bitbucket.org/wing_of_love/test_git.git
   0c26f61..45e7596  master -> master
          ทีนี้พอเข้าไปเช็คใน Bitbucket ก็จะพบว่ามีไฟล์ index.html เพิ่มเข้ามาใน Server แล้ว


          ขั้นตอนถัดไป เราจะทำการแก้ไขไฟล์บน Server จากนั้นก็แก้ไขไฟล์ในเครื่องตนเอง แล้ว commit ขึ้น Server ซึ่งเป็นการจำลองสถานการณ์ที่เราและเพื่อนแก้ไขไฟล์เดียวกัน เริ่มโดยการคลิกที่ชื่อไฟล์ index.html เพื่อแก้ไขไฟล์

กดปุ่ม Edit เพื่อทำการแก้ไขไฟล์
 
เพิ่มข้อความ "This is message from Bitbucket." ลงไปในไฟล์ index.html แล้วกดปุ่ม Commit
 
ป๊อปอัพให้บันทึกข้อความช่วยจำ พอพิมพ์ข้อความเสร็จแล้วให้กดปุ่ม Commit

          ถัดไปให้แก้ไขไฟล์ index.html ในเครื่องของเรา โดยการเพิ่มข้อความ "This is message from MASTER(Local)." จากนั้นก็ commit ให้เรียบร้อย

$ git add index.html

$ git commit -m "Edit index.html in local"
[master 7a69d8d] Edit index.html in local
 1 file changed, 1 insertion(+)
          หลังจาก commit เสร็จแล้ว ให้ใช้คำสั่ง  git fetch  เพื่อดึงข้อมูล Git Repository มาจาก Server แล้วใช้คำสั่ง  git status  เพื่อเปรียบเทียบระหว่าง Git Repository ของ Server และเครื่องของเรา

$ git fetch
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 3 (delta 1), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From https://bitbucket.org/wing_of_love/test_git
   45e7596..7af3ffa  master     -> origin/master

$ git status
On branch master
Your branch and 'origin/master' have diverged,
and have 1 and 1 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)

nothing to commit, working tree clean
          จากคำสั่ง  git status  เราจะพบว่า Git Repository จาก Server และเครื่องของเรามีค่าไม่ตรงกัน ทำให้ใช้งานคำสั่ง git push เพื่ออัพโหลดไฟล์ไปยัง Server ไม่ได้

$ git push origin master
To https://bitbucket.org/wing_of_love/test_git.git
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'https://wing_of_love@bitbucket.org/wing_of_love/test_git.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
          เราจำเป็นต้องดึงอัพเดตล่าสุดมาจาก Server ก่อน ให้เราใช้คำสั่ง  git pull  เพื่ออัพเดต Git Repository ในเครื่องของเราให้กลายเป็นเวอร์ชันล่าสุด ซึ่งคำสั่ง  git pull  จะเป็นการทำ  git fetch  และต่อด้วย  git merge  โดยอัตโนมัติ

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

$ git add index.html

$ git commit -m "Update index.html"
[master 6d43d08] Update index.html

$ git push origin master
Counting objects: 6, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (6/6), 635 bytes | 317.00 KiB/s, done.
Total 6 (delta 2), reused 0 (delta 0)
To https://bitbucket.org/wing_of_love/test_git.git
   7af3ffa..6d43d08  master -> master


การใช้ Reset

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

          เริ่มต้นโดยการเปิดไฟล์ index.html ขึ้นมา จากนั้นก็เพิ่มข้อความว่า "This is Error Message." จากนั้นก็เซฟไฟล์แล้วก็ commit

$ git add index.html

$ git commit -m "Add error message into index.html"
[master 75975d8] Add error message into index.html
 1 file changed, 1 insertion(+)
          จากนั้นให้เราใช้คำสั่ง git log เพื่อแสดงประวัติการ commit ซึ่งเราจะเห็นเลขรหัสของแต่ละ commit (ตัวอักษรสีเหลือง ๆ นั่นแหละ) รวมไปถึงว่าแต่ละ commit นั้นมีใครเป็นคนแก้ไข

$ git log
commit 75975d8ff0f3f596b2fcf8b5b65d68a2c085689f (HEAD -> master)
Author: AiNoTsubasa <ooo@hotmail.com>
Date:   Mon Nov 27 09:36:29 2017 +0700

    Add error message into index.html

commit 6d43d088d0656689c7680ac8a1f3f08f8d5b3823 (origin/master, origin/HEAD)
Merge: ed2e63e 7af3ffa
Author: AiNoTsubasa <ooo@hotmail.com>
Date:   Fri Nov 24 21:09:06 2017 +0700

    Update index.html

commit ed2e63efe2895d98e1cd0ca57e86645a1b669d77
Author: AiNoTsubasa <ooo@hotmail.com>
Date:   Fri Nov 24 20:26:21 2017 +0700

    Edit index.html in local

commit 7af3ffa9ca5f27c4df64b80fca5592c89e445d10
Author: Akatsuki <akatsuki.sunshine@hotmail.com>
Date:   Fri Nov 24 07:58:55 2017 +0000

    index.html edited online with Bitbucket

commit 45e7596bc91e15c9e29a90dc2812d5b62586c595
Author: AiNoTsubasa <ooo@hotmail.com>
Date:   Fri Nov 24 14:02:08 2017 +0700

    Add index.html

commit 0c26f61a6c9802f21b3a3faf6d7c07d52660aca3
Author: Akatsuki <akatsuki.sunshine@hotmail.com>
Date:   Thu Nov 23 07:42:42 2017 +0000

    Initial commit
          ให้เราก็อปปี้หมายเลข commit 7 ตัวแรกของ commit ที่เราต้องการจะย้อนกลับ แล้วใช้คำสั่ง  git reset หมายเลขcommit7ตัวแรก  เพื่อลบการ commit ล่าสุด และใช้คำสั่ง  git status  ในการเช็คสถานะ

$ git reset 6d43d08
Unstaged changes after reset:
M       index.html

$ git status
On branch master
Your branch is up-to-date with 'origin/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

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


การใช้ .gitignore

          การ add ไฟล์ด้วยคำสั่ง  git add *  ถือเป็นวิธีที่ง่ายและสะดวกมาก เพราะเป็นการ add ไฟล์ทั้งหมดในทีเดียวโดยที่เราไม่จำเป็นต้องระบุชื่อไฟล์ แต่สิ่งที่ตามมาก็คือการ add ไฟล์ที่ไม่ต้องการเข้าไปด้วย (เช่น ไฟล์ที่บันทึก Log ของระบบ เป็นต้น) ซึ่งเราก็มีวิธีแก้ปัญหานี้ด้วยการกำหนดไฟล์ที่ไม่ต้องการ add ลงในไฟล์ .gitignore

          อันดับแรกให้สร้างไฟล์ log_file.txt ขึ้นมา จากนั้นให้ใช้คำสั่ง  git status  เพื่อเช็คสถานะแล้วจะพบว่ามีไฟล์ log_file.txt ให้รอการ add ไฟล์อยู่

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.

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

        log_file.txt

nothing added to commit but untracked files present (use "git add" to track)
          ถัดไปให้ทำการสร้างไฟล์ .gitignore ขึ้นมา ด้วยคำสั่ง  vi .gitignore  จากนั้นก็กดคีย์บอร์ดปุ่ม i เพื่อเริ่มเขียนข้อความว่า *.txt (เป็นการระบุว่าทุกไฟล์ที่มีนามสกุล .txt) จากนั้นกดคีย์บอร์ดปุ่ม Esc พิมพ์ :qw แล้วกดคีย์บอร์ดปุ่ม Enter เพื่อเป็นการบันทึกและออกจากโหมดการพิมพ์ข้อความ แล้วใช้คำสั่ง  git status  จะเห็นว่าไฟล์ที่ต้อง add เปลี่ยนไปจาก log_file.txt เป็น .gitignore แทน เนื่องจากในไฟล์ .gitignore ระบุไว้ว่าไม่ให้ track ทุกไฟล์ที่มีนามสกุล .txt

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.

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

        .gitignore

nothing added to commit but untracked files present (use "git add" to track)
          ที่เหลือก็แค่ commit แล้ว push ขึ้น Server เพียงเท่านี้เราก็สามารถควบคุมไฟล์ที่จะให้ Git คอยตาม track ได้แล้ว ทำให้เราสามารถใช้คำสั่ง  git add *  ได้อย่างสบายใจ (ฮา)

$ git add .gitignore
warning: LF will be replaced by CRLF in .gitignore.
The file will have its original line endings in your working directory.

$ git commit -m "Add gitignore file."
[master 84c5454] Add gitignore file.
 1 file changed, 1 insertion(+)
 create mode 100644 .gitignore

$ git push origin master
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 324 bytes | 162.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://bitbucket.org/wing_of_love/test_git.git
   6d43d08..84c5454  master -> master

          สรุป Git ถือเป็นเคริ่องมือที่มีประโยชน์ (ตามที่ได้กล่าวเอาไว้แล้ว) และช่วยสนับสนุนในการพัฒนาระบบ ดังนั้นการใช้งาน Git ถือเป็นสิ่งที่นักพัฒนาต้องเรียนรู้และใช้ให้เป็น และหวังว่าบทความการใช้งาน Git เบื้องต้นนี้จะช่วยให้เพื่อน ๆ เข้าใจและสามารถเริ่มต้นใช้งาน Git ได้

สรุปคำสั่ง

git clone URLที่เก็บไฟล์Git : ใช้ดึงข้อมูล Git Repository มาจาก URL ลงมาที่เครื่องของเรา
git push ชื่อBranchบนServer ชื่อBranchที่จะpushขึ้นไป : ใช้ในการส่ง commit จากเครื่องของเราไปอัพเดตที่ Git Repository บน Server
git pull : ใช้อัพเดต Git Repository ในเครื่องของเราให้เป็นตาม Git Repository บน Server
git fetch : ใช้โหลด Git Repository ของ Server ลงมาที่เครื่องของเราเพื่อใช้เปรียบเทียบความแตกต่างของ Git Repository จากทั้งสองที่
git reset หมายเลขcommit7ตัวแรก : ใช้ย้อนกลับไป commit ที่ต้องการ

วันศุกร์ที่ 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 ที่ระบุ

วันอังคารที่ 21 พฤศจิกายน พ.ศ. 2560

วิธีติดตั้ง Git ก่อนจะเริ่มใช้งาน


          ในบทความที่แล้วเราได้ทำความรู้จักและเห็นประโยชน์ของ Git ไปบ้างแล้ว ซึ่งปัจจุบันถือว่าเป็นเครื่องมือสำคัญที่นักพัฒนาต้องรู้จักใช้ให้เป็น แต่ถ้าเรายังไม่ติดตั้ง Git แล้วเราจะเริ่มต้นใช้งาน Git ได้ยังไงละ เพราะงั้นในบทความนี้เราจะมาติดตั้ง Git เพิ่มเริ่มใช้งานกันดีกว่า .....เริ่มต้นให้เข้าไปยังเว็บ Git Download ไฟล์ติดตั้งจะแสดงขึ้นมาให้กดโหลดโดยอัตโนมัติ หลังจากโหลดไฟล์ติดตั้งเสร็จแล้วก็กดดับเบิ้ลคลิกเริ่มติดตั้งเล้ยยยยย

หน้าข้อมูลลิขสิทธิ์ของโปรแกรม คลิก Next > โลด

เลือกพาทที่ติดตั้งโปรแกรมจากนั้นก็คลิก Next >

เลือกสิ่งที่เราต้องการจะติดตั้ง

ตั้งชื่อโฟลเดอร์ที่จะติดตั้งแล้วก็คลิก Next >

เลือกว่าจะใช้งาน Git ผ่าน Command Line แบบไหน จากนั้นก็คลิก Next >
  • Use Git from Git Bash only: ใช้งาน Git ผ่าน Git Bash (แนะนำให้เลือกตัวนี้)
  • Use Git from the Windows Command Prompt: ใช้งาน Git ผ่าน Command Prompt ของ Windows
  • Use Git and optional Unix tools from the Windows Command Prompt: ใช้งาน Git และคำสั่งของ Unix ผ่าน Command Prompt ของ Windows (ไม่แนะนำตัวเลือกนี้เพราะจะมีการเพิ่มคำสั่งลงใน Command Prompt ซึ่งอาจจะมีบางคำสั่งไปเขียนทับกับคำสั่งเดิมของ Command Prompt)

เลือกว่าจะให้ Git ใช้ SSH ตัวไหน แล้วคลิก Next >
  • Use OpenSSH: ใช้ ssh ที่มาพร้อมกับ Git (แนะนำให้เลือกตัวนี้ จะได้ไม่ต้องวุ่นวาย ฮา)
  • Use (Tortoise)Plink: ใช้ plink ต้องเลือกพาทที่ติดตั้ง plink ด้วย

เลือก HTTPS transport ที่จะให้ใช้ จากนั้นก็คลิก Next >
  • Use the OpenSSL library: ใช้การตรวจสอบ Server certificates โดยไฟล์ ca-bundle.crt (เลือกตัวนี้เพราะเราไม่ได้ใช้งานในนามบริษัท)
  • Use the bative Windows Secure Channel library: ใช้การตรวจสอบ Server certificates โดย Windows Certificate Stores ซึ่งสามารถใช้ใบรับรองของบริษัทได้

เลือกการขึ้นบรรทัดใหม่ แล้วคลิก Next > (เนื่องจากการขึ้นบรรทัดใหม่บน Windows จะใช้ CRLF 
ซึ่งต่างจากระบบ Unix จึงต้องมีการเลือกให้ Git จัดการการขึ้นบรรทัดใหม่)
  • Checkout Windows-style, commit Unix-style line endings (แนะนำให้เลือกตัวนี้)
  • Checkout as-is, commit Unix-style line endings
  • Checkout as-is, commit as-is

เลือกตัวจำลอง terminal ที่จะใช้ใน Git Bash จากนั้นคลิก Next >
  • Use MinTTY (the default terminal of MSYS2) (เลือกตัวนี้)
  • Use Windows' default console window

เลือกฟีเจอร์เสริมที่จะเปิดใช้งาน แล้วคลิก Install

รอการติดตั้งจ้าาาาา

ติดตั้งเสร็จแล้ว คลิก Finish โล้ดดดดด

          ในบทความนี้เราก็ได้ติดตั้ง Git เสร็จเป็นที่เรียบร้อยแล้ว บทความถัดไปเราจะมาเริ่มต้นใช้งาน Git กัน Let's GO!!

 

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

ทำความรู้จักกับ Git เครื่องมือสำคัญของเหล่า Developer


          ช่วงนี้ห่างหายจากการเขียนบทความไปนาน (เนื่องจากงานรัดตัว) วันนี้เลยจะมาเขียนบทความเล็ก ๆ เพื่อไม่ให้ลืมกันสักหน่อย ส่วนเรื่องที่จะเขียนในวันนี้ก็เกี่ยวข้องกับเครื่องมือตัวนึงที่นักพัฒนาควรจะรู้จักและใช้งานให้เป็นเพื่อความสะดวกสบายของชีวิต

          ปัญหาส่วนหนึ่งในการพัฒนาโปรแกรมก็คือการจัดการไฟล์ของโปรเจค ซึ่งสร้างความลำบากในการพัฒนาโปรแกรมไม่ว่าจะเป็น
  • copy และเปลี่ยนชื่อไฟล์เพื่อ backup ไฟล์โค้ดเดิมก่อนจะทำการแก้ไข ทำให้พื้นที่ในคอมพิวเตอร์หดหายไปอย่างรวดเร็ว (ตามรูปข้างบน)
  • เผลอลบไฟล์ทิ้ง
  • ทำไฟล์หาย
  • เซฟไฟล์ใส่ Flash Drive ส่งให้เพื่อนในทีม หรือใช้สำหรับย้ายไฟล์ไปยังคอมพิวเตอร์อีกเครื่อง
  • เกิดปัญหาเวลาเพื่อน ๆ ในทีมแก้ไขไฟล์เดียวกัน ทำให้เสียเวลาในการรวมโค้ดในไฟล์
  • แก้ไขโค้ดจนทำให้โปรแกรมทำงานผิดพลาดแล้วไม่สามารถ undo ในส่วนที่ผิดพลาดได้
          เพื่อให้เห็นภาพ เราลองมาคิดถึงสถานะการณ์ในการพัฒนาโปรแกรมกันดู กรณีที่เราเขียนโค้ดเพียงคนเดียว ถ้าเป็นโปรเจคค่อนข้างใหญ่แน่นอนว่าจะต้องใช้เวลาในการพัฒนานานกว่าหนึ่งวันอยู่แล้ว ซึ่งวันรุ่งขึ้นเราก็ต้องเขียนโค้ดเพิ่มหรือไม่ก็แก้ไขโค้ดเก่าให้ดียิ่งขึ้น แต่การจะเขียนโค้ดลงไปเลยนั้นก็อาจส่งผลให้โค้ดส่วนที่ผ่าน ๆ มาเกิดข้อผิดพลาดจนไม่สามารถทำงานได้ เพื่อป้องกันกรณีแบบนี้เราก็ต้องทำการ backup โค้ดเก่าเก็บเอาไว้ก่อน ด้วยวิธีดั้งเดิมอย่างการ copy และเปลี่ยนชื่อไฟล์ (ตามรูปข้างบน) ข้อเสียนอกจากจะเปลืองพื้นที่แล้ว ยังก่อให้เกิดความสับสนเวลากลับมาหาไฟล์เก่า ๆ อีกด้วย


          กรณีที่พัฒนาโปรแกรมเป็นทีม (สมมุติจำนวนคนเป็น 3 คนล่ะกัน) แล้วแต่ละคนต่างก็แก้ไขไฟล์เดียวกันเพิ่มฟีเจอร์ใหม่ ๆ ลงไปจนทำให้โค้ดในไฟล์ของแต่ละคนไม่เหมือนกัน (รูปข้างบน) แบบนี้ก็งานเข้าแล้วสิ คนที่มีหน้าที่รวมไฟล์ของแต่ละคนเข้าด้วยกันก็ต้องมานั่งไล่อ่านโค้ดทุกไฟล์ทีละบรรทัดเพื่อหาดูว่าจะรวมโค้ดเข้ากันยังไง

          สิ่งเหล่านี้เป็นปัญหาที่เหล่านักพัฒนาโปรแกรมน่าจะเคยเจอมาก่อน ยิ่งทำงานเป็นทีม ปัญหาที่ตามมาก็จะมากขึ้น แต่ไม่ต้องกลัว เพราะปัจจุบันนี้มีเครื่องมือที่จะช่วยให้นักพัฒนาไม่ต้องเจอกับปัญหาเหล่านี้ วีรบุรุษขี่ม้าขาวที่มาช่วยเหลือเหล่านักพัฒนานั้นก็คือ Git นั่นเอง

Git คืออะไร


          Git คือ Version Control หรือระบบที่บันทึกการเปลี่ยนแปลงของไฟล์ ซึ่งเราสามารถเรียกไฟล์ที่แก้ไขไปแล้วย้อนกลับมาได้ ทำให้เราไม่ต้องกลัวว่าจะเผลอลบไฟล์ทิ้ง หรือแก้ไขโค้ดจนทำให้โปรแกรมเกิดข้อผิดพลาดแล้วไม่สามารถเรียกคืนโค้ดเก่าได้ นอกจากนี้เรายังสามารถเช็คประวัติของไฟล์ได้ ไม่ว่าจะเป็นไฟล์นั้นถูกสร้างโดยใคร ถูกแก้ไขโดยใคร และยังสามารถช่วยในการ merge โค้ดที่ถูกแก้ไขในไฟล์เดียวกันได้ซึ่งจะช่วยลดเวลาในการรวมโค้ดด้วยตัวเองเป็นอย่างมาก ดังนั้น Git จึงเป็นเครื่องมือที่เหมาะกับนักพัฒนา โดยเฉพาะโปรเจคที่ต้องพัฒนากันเป็นทีม

          ในการทำงาน..... Git จะมองข้อมูลเป็นเสมือนภาพถ่าย (Snapshot) เมื่อมีการบันทึกสถานะของโปรเจค เจ้า Git ก็จะทำการถ่ายภาพของไฟล์ทั้งหมดในตอนนั้นและบันทึกการอ้างอิงไปยัง Snapshot นั้น ถ้าไฟล์ใดไม่ได้มีการแก้ไขเปลี่ยนแปลง Git ก็จะไม่บันทึกไฟล์นั้น แต่จะทำการเชื่อมโยงไปยังไฟล์เดิมที่เคยถูกบันทึกเอาไว้อยู่แล้ว โดยสถานะของไฟล์ในโฟลเดอร์ Git จะแบ่งออกเป็น 4 สถานะ ได้แก่ Untracked, UnmodifiedModified และ Staged โดย
  • Untracked หมายถึง ไฟล์ยังไม่ได้ถูก Git ติดตาม
  • Unmodified หมายถึง ไฟล์ที่ถูก Git ติดตามอยู่ และไม่มีแก้ไขอะไร
  • Modified หมายถึง ไฟล์ที่ถูก Git ติดตามอยู่ และมีการแก้ไขแล้ว
  • Staged หมายถึง ไฟล์ที่ถูก Git ติดตามอยู่ และพร้อมที่จะ commit บันทึกลงฐานข้อมูล
          เมื่อทำการบันทึกไฟล์ลงในฐานข้อมูล แล้วเราเผลอลบไฟล์นั้นทิ้งไปหรือแก้ไขโค้ดผิดพลาดทำให้เกิด error จนโปรแกรมพัง เราก็ยังสามารถกู้คืนโดยเรียกข้อมูลจากที่เราบันทึกไว้ก่อนหน้านั้นได้ ดังนั้นการทำงานของ Git ก็เสมือนเป็นการทำ backup ไฟล์เอาไว้นั่นเอง

          นอกจากจะใช้เพื่อการ backup ไฟล์แล้ว Git ยังถูกใช้บน Server เพื่อสนับสนุนการทำงานแบบทีมหรือมีการแก้ไขไฟล์จากหลาย ๆ แหล่ง โดยเว็ปไซต์ยอดนิยมที่ให้บริการ Git ได้แก่ Github , Bitbucket , Gitlab เป็นต้น

          บทความนี้แสดงให้เห็นถึงข้อดีและการทำงานคร่าว ๆ ของ Git ซึ่งจะช่วยให้เราเข้าใจถึงความจำเป็นในการใช้งาน Git ในการพัฒนาแอปพลิเคชัน ส่วนบทความถัดไปเราจะมาติดตั้ง Git เพื่อเริ่มใช้งานกัน แล้วพบกันใหม่ในบทความหน้าจ้าาาาา