[Racap] เดี๋ยวนี้ใครๆก็ใช้ Git กันแล้ว น้องๆรู้ก่อนได้เปรียบนะเออ

Programming Nov 14, 2017

สวัสดี สวีดัด ทุกท่านคร๊าบบบ

ในการสมัครงาน คุณสมบัติหนึ่งที่ head hunter ชอบ คือ การทำงานแบบ Agile เพราะทุกที่ก็ใช้เหมือนกัน ในการทำงานในทีม Software Development ความเข้มข้นหรือกระบวนการก็ตามแต่ culture ขององค์กร (ซึ่งเราดองไว้นานมากยังไม่ได้เขียนเลย 555)

และอีกอย่างที่คนสัมภาษณ์เราพิจารณา นั่นคือ การใช้ Git เป็นนั่นเอง เพราะทำงานเป็นทีมเนาะ ทีมนึงมีหลายคน ต่างคนต่างทำงาน path ของตัวเอง และเอามาทั้งหมดมากองรวมกันในก้อนเดียว บางท่านมีพื้นฐานการใช้ SVN มาก็มีความคล้ายคลึงกัน แต่ SVN เก่ากว่าเท่านั้นเอ๊งง แถมเป็นเรื่องหนึ่งที่ต้องฝึกในชั้นอุดมศึกษาเลยทีเดียว เพราะเราไปเห็นสเตตัสของอาจารย์เราตอนไปสำรวจฝึกงาน เรื่องอันดับต้นๆของปัญหาที่เจอก็เรื่องการใช้ Git นี่แหละ (ยังมีเรื่องของ tool อื่นๆอีก ที่เราคาดว่าอาจารย์น่าไม่ได้สอนน้องๆ) ดังนั้น ไม่ใช่ว่าเรารู้ตอนทำงานเลยเว้ย ต้องรู้ก่อนไปฝึกงานอีก เพราะทุกบริษัทก็ใช้กันเนอะ ใช้ไม่เป็นพี่ๆก็ต้องสอนอีก สรุปรู้ก่อนนอกจากจะได้เปรียบแล้ว ยังทำให้พี่ๆทั้งหลายประทับใจด้วยนะเออ

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

และเนื่องจากเราจะลองเขียนบล็อกแบบ recap กับ free online course ซึ่งเราได้เรียนรู้มาจากการทำงานจริงด้วย คอร์สฟรีจาก udacity ชื่อว่า GitHub & Collaboration และใน codecademy ก็มีเช่นกัน ชื่อคอร์ส learn git (แต่ตอนนี้ลดบทเรียนเรียนฟรีจนมาเสียเงินมากขึ้น ช่วงหลังเลยไม่อยากเข้าไปเรียนเท่าไหร่)

มาเริ่มกันเลยดีกว่าาาาา

ก่อนอื่นเลย มารู้จักหน้าตากันคร่าวๆก่อน

Repository มี 2 ประเภท คือ

1. Local Repository ง่ายๆก็บนเครื่องเรานั่นแหละ จะใช้คำสั่งบน command line หรือ terminal
2. Remote Repository เอาไปอัพบน internet ซะ เช่น GitHub GitLab และเจ้าอื่นๆ เหมาะกับการทำงานเป็นทีม

นอกจากจะใช้ผ่าน terminal (ขี้เกียจใช้สองคำกล่าวถึงเรื่อยๆ ขอตามความเคยชินดีกว่า) ก็มีโปรแกรมที่เป็น GUI ที่เห็นหลักๆก็ของ GitHub เอง และ SourceTree ที่ใช้กันหลายบริษัทเลย

GitHub Desktop : https://desktop.github.com
SourceTree : https://www.sourcetreeapp.com, แต่ปุ่ม fetch หายไปแหะ

เริ่มต้นที่ 3 คำสั่งเริ่มต้นกันก่อนเลย

git remote : manage a repo จัดการ repo นั่นแหละ

git push : send change to remote ส่งก้อน source code ไปที่ repository

git pull : retrive and automatically merge updates ดึงเข้ามาในเครื่องเรา
ภาพประกอบก็จะเป็นแบบนี้

มาเริ่มการสร้าง repository ใน github ก่อน ขอข้ามวิธีสร้างเนอะ น่าจะสร้างได้ไม่ยากอยู่แล้ว สร้างเสร็จจะได้หน้าตาเป็นแบบนี้ เพราะเรายังไม่ได้อัพไฟล์ขึ้น github

จากด้านบนมี 3 แบบ ขอพูดแค่สองแบบพอ

แบบแรก สร้างขึ้นมาใหม่จาก command line เลย

การสร้างไฟล์ อาจจะสร้างขึ้นมาก่อน โดยใช้คำสั่ง touch นำหน้าชื่อไฟล์ เช่น touch README.md หรือจะเขียนแบบสตรีมไฟล์ก็ echo "# This is my git" > README.md

ใช้คำสั่ง git init ที่ path ที่เราต้องการ ในเครื่องเรา จากนั้นก็เพิ่มไฟล์เข้า repo โดยใช้คำสั่ง git add ตามด้วยชื่อไฟล์ เช่น git add README.md หรือจะเพิ่มทั้งหมดที่มีก็ง่ายเลยแบบนี้ git add . เมื่อเพิ่มไฟล์เสร็จก็ตามด้วย commit ไฟล์ อารมณ์คล้ายๆจุดเซฟในเกมส์ง่ะ โดยใช้คำสั่ง git commit แล้วตามด้วยข้อความ เช่น git commit -m "Intial project" ทุกครั้งที่เรา commit จะมีเลข commit number ของแต่ละ commit ด้วยนะ

จากนั้นเพิ่ม repository ใน GitHub ของเรา เวลาที่เราจะ push file ขึ้นไป ก็จะทำใน path นี้ โดยใช้คำสั่ง git remote นั่นเอง และมี 2 คำศัพท์เพิ่มเติม คือ

  • remote shortname หมายถึง เรียก repository path url ย่อๆว่าอะไร ส่วนใหญ่ใช้คำว่า origin ตาม default นะ
  • branch หมายถึง กิ่งก้านสาขาของ repository นั้น แบบ default สุดเลยชื่อ master การทำงานขอยกจากในทีมมาทำเลยแล้วกัน น่าจะอธิบายและอ่านเข้าใจง่ายกว่า ตัว Android Application มีหลาย feature ที่ต้องทำ ดังนั้นจะแตก branch หลัก คือ develop ออกมาเขียนโค้ดตาม requirement (ก็คือไม่ต้อง backup ของเดิม เหมือนเราก็อปของเดิมมาแก้), browse คือ เพิ่ม feature browse, exo คือ เปลี่ยน player ให้เป็น exoplayer, artist มีการแก้หน้า artist, fix1.5 แก้บัคที่เกิดขึ้นหลังจากปล่อย version 1.5 ออกมา เป็นต้น

กลับมาที่เดิม หลังจาก commit เสร็จก็ใช้คำสั่ง remote เพื่อจัดการ repository ของเรา โดยบอก git ว่า local repository path นี้จะ link กับ remote repository นี้ ดังนั้น ใช้คำสั่งแบบนี้git remote add <shortname> <git_path> เช่น

git remote add origin https://github.com/mikkipastel/my-travel-plan.git 

ในตอนนี้ source code ของเรายังอยู่ในเครื่องเรา หรือในส่วน local repository และเพิ่งสร้างสะพานไปยัง remote repository ดังนั้นเราจะนำไฟล์ไปใส่ใน repository ด้วยคำสั่ง git push แบบนี้git push -u <shortname> <branch> เช่น git push -u origin master เป็นอันเสร็จสิ้นพิธีกรรมในแบบแรก

แบบที่สอง เขียนโค้ดโปรเจกนี้ไปได้พักนึงแล้ว commit ใน local repository มาเยอะแล้ว เอาขึ้น github ดีกว่ากันเหนียว

ในเมื่อคุณได้ใช้วิทยาวุธ Git อย่างเต็มที่ ถึงเวลาแล้วที่จะใช้อย่างจริงจังใน github ซะที
ใช้สองคำสั่งสุดท้ายจากวิธีแรก นั่นคือ

git remote add origin https://github.com/mikkipastel/my-travel-plan.git
git push -u origin master 

หลังจากที่เราอัพไฟล์ขึ้น remote repository ถ้าเราลืมว่าโฟลเดอร์นี้มี remote repository อันไหน สามารถใช้คำสั่ง git remote -v ดูได้นะ

หลังจากที่เรา push code ขึ้นไปแล้ว ถ้ามี update เราก็ pull code เข้ามา โดยใช้คำสั่งgit pull <shortname> <branch> เช่น git pull origin master หลังจาก pull แล้ว code บางส่วนทับกันก็แก้ให้เรียบร้อย (คือมันจะ merge ทุกอย่างรวมกัน จะมีทับกันตอนที่เรา pull code ในส่วนที่เรายังไม่ได้ commit ข้ึนไป) ก่อนที่จะ push code ขึ้นไปใหม่เนอะ

มีคำสั่งนึงที่คล้ายกันกับ pull คือ fetch นั่นเอง ซึ่งมีความต่างกันดังนี้

  • pull : retrive and automatically merge update ตามความหมาย คือ ดึงตัวที่ update มา แล้ว merge ทั้งก้อนรวมเข้าด้วยกัน
  • fetch :  retrive update ดึงว่ามีอะไร update บ้าง จบ./

ถ้าเทียบกับกัน sourceTree หล่ะ
ที่เราใช้กัน ก็กดเลือกไฟล์ที่จะ commit แล้วก็ใส่ข้อความลงไป และเราสามารถเลือกบางส่วนของไฟล์ commit ขึ้นไปได้ โดยขึ้น state ไป แล้วกด commit จากนั้น push code เพื่อเข้า remote repository เวลามีใคร update อะไรจะมี notification แจ้งเตือน และเรากด fetch มาดูก่อนว่ามีอะไร update กันทับ ถ้าไม่ทับหรือแก้จนไม่ทับ ก็ pull เข้ามาเลย

สรุปคำสั่ง

  • remote : git remote add origin <git_url>
    อันนี้ไว้จัดการ repository ก็คือ link ระหว่าง local repository กับ remote repository นั่นแหละ ต้อง set ก่อนทุกครั้งที่ทำงานเนอะ ซึ่งตอนไปเพิ่มใน sourceTree ไม่ได้ใช้แบบนี้อ่ะ ไป checkout ก่อนเนอะ
  • commit : git commit -m "<message>"
    เพิ่มการเปลี่ยนแปลงของไฟล์ ว่าเราแก้ไขไฟล์พวกนี้ไปทำไม เช่น แก้บัค เพิ่ม feature ตาม requirement
  • push : git push origin master
    ส่ง code ที่ commit แล้วขึ้นไปบน remote repository
  • pull : git pull origin master
    ดึง code ทั้งหมดที่ update เข้าเครื่องเรา
  • fetch : git fetch origin master
    ดูว่าใน remote repository มีอะไรอัพเดตบ้าง

FORK นั่นคือ ส้อม นั่นเอง เดี๋ยวนะ มันใช่หรอ ก็ประมาณนึงนะ เขาเปรียบเทียบเป็นส้อมไง แบบมันสามารถแตกแขนงออกไปได้งี้ คำสั่งที่ใช้ คือ git clone นะ

สรุป git clone แบบง่ายๆก็คือ การเอาของเขามาเป็นของเรา ดังนั้นใน github จะมีเขียนว่าเราไป clone มาจากใคร

ใน udacity หรือ codelab เอง ก็จะมีโปรเจกตัวอย่างให้เรา clone เพื่อย่นระยะเวลาการเรียนให้สั้นลง

เช่น โปรเจกน้องหมีตัวแตกมีคนอยากเอาไปลองทำบ้างเง้ ก็ clone จากของเราไป ด้วยคำสั่ง

git clone https://github.com/mikkipastel/BearEatEverything.git 

หรือทำบนหน้าเว็บก็ได้ โดยกด Fork เอา

การดู log ของแต่ละ repository นั่น ใช้คำสั่งแบบนี้

git log
git log -- grep <content> เช่น git log --grep bug
git log -- oneline --graph --decorate --all
git shortlog -s -n
git shortlog --author=<author_name>

หรือเราอยากรู้ว่า commit เลขนี้มีอะไรเปลี่ยนแปลงบ้าง ตรวจสอบได้โดยคำสั่ง git show <commit_number>

และสุดท้ายเขาก็อธิบายการใช้ GitHub เบื้องต้น

  • Issue : ถ้ามีบัคก็บอกเขาได้ เช่น อันนี้มันใช้ไม่ได้อะค่ะ ใส่ถูกทุกอย่างแล้ว ทำไงดีค่ะพี่ค่ะ
  • Pull Request : สมมุติว่าเรา clone repository ชุดนึงไปเล่น แล้วเฮ้ย อันนี้บัค เราก็แก้ให้ และอยากให้เจ้าของเขารับรู้ ก็ส่ง pull request ไป
  • Star & Watch : Star ง่ายๆก็คือ ติดดาว repository ที่เราชอบ หรืออะไรก็ตามแต่แล้วกัน Watch ก็จะลึกกว่า คือดูความเป็นไปของ repository ได้ ใน github มันจะอยู่ใกล้ๆกันกับ Fork ด้วย

ส่วนที่เกี่ยวกับ Git
- การดึงของใน repo มาลงที่เครื่องเรา จะใช้คำสั่งดังนี้

git remote add <point_of_source_repo> <git_url>
เช่น git remote add upstream git://xx.yyy

จากนั้นก็ checkout repo ของ branch ที่ชื่อว่า master ลงเครื่อง
git checkout master

ถ้ามีของเก่าอะไรงี้ ก็ merge รวมไปกัน อาจจะมีแก้โค้ดบ้างถ้ามันไม่ตรงกันอะนะ
git merge master

แล้ว push ลงเครื่องซะ
git push origin master

- ในกรณีมือพี่ล่ะลั่นไปเองงงง เผลอไป commit ในสิ่งที่ไม่อยาก commit (interactive squash commit) ก็ใช้คำสั่ง rebase เลยจ้า
git rebase [-I HEAD~3]

มาดูตัวอย่างกันดีกว่า

เหตุการณ์สมมุติที่ 1 : เปลี่ยนไปทำ branch อื่น

git checkout instant
git add .
git commit -m "init instant"
git push -u origin instant

เหตุการณ์สมมุติที่ 2 : แค่ชั้นอยากจะเพิ่ม README.mdgit clone <git_url>touch README.md

git add README.md
git add .
git commit -m "add README"
git push -u origin mastergit pull

ปิดท้ายบล็อกนี้ด้วย document ของ Git https://git-scm.com/doc มีภาษาไทยด้วยนะ แต่อ่านภาษาอังกฤษอ่ะดีแล้ว เพราะเขาแปลไม่เสร็จ 555

ลิ้งค์เพิ่มเติม :
https://try.github.io/levels/1/challenges/1
https://www.codeschool.com/courses/try-git

และ short note จากตอนเรียนที่ codecademy จริงๆคือก็อปมานั่นแหละ

git init : creates a new Git repository
git status : inspects the contents of the working directory and staging area
git add <filename> :adds files from the working directory to the staging area
git diff <filename> : shows the difference between the working directory and the staging area
git commit -m "comment" : permanently stores file changes from the staging area in the repository
git log : shows a list of all previous commits
git checkout HEAD filename: Discards changes in the working directory.
git reset HEAD filename: Unstages file changes in the staging area.
git reset SHA: Can be used to reset to a previous commit in your commit history.
git branch: Lists all a Git project's branches.
git branch branch_name: Creates a new branch.
git checkout branch_name: Used to switch from one branch to another.
git merge branch_name: Used to join file changes from one branch to another.
git branch -d branch_name: Deletes the branch specified.
git clone: Creates a local copy of a remote.
git remote -v: Lists a Git project's remotes.
git fetch: Fetches work from the remote into the local copy.
git merge origin/master: Merges origin/master into your local branch.
git push origin <branch_name>: Pushes a local branch to the origin remote.

Tags

Minseo Chayabanjonglerd

I am a full-time Android Developer and part-time contributor with developer community and web3 world, who believe people have hard skills and soft skills to up-skill to da moon.