สวัสดีชาวโลกฮะ

ครั้งที่แล้ว เล่าถึง Docker ที่คอยอำนวยความสะดวกเหล่าโปรแกรมเมอร์ด้าน environment คราวนี้เป็นอีกเครื่องมือที่อำนวยความสะดวกด้าน source code ที่เวลาเราเขียนที ก็เขียนไปเป็นสิบเป็นร้อยไฟล์ ปัญหาตามมาเยอะแยะ

  • ถ้าเข้าใจ requirement ผิดไป แล้วเขียน code ไปเยอะแล้ว จะย้อนไปแก้ code จากตรงไหนดี
  • ถ้าเขียน code หลายๆ คนใน project เดียวกัน จะจัดระเบียบยังไง ไม่ให้คนอื่นเขียน code ทับซ้อนกันจนเกิดปัญหา
  • ถ้าจะ deploy บน production จะทำยังไงให้ง่ายที่สุด โดยไม่ต้อง copy ใส่ flashdrive หรือ zip ใส่ cloud ไป download ที่เครื่องปลายทาง
  • ถ้าต้องการให้คนอื่นสามารถนำ source code เราไปใช้งานต่อได้ แบบ open-source อย่างนี้
  • และอื่นๆ อีกมากมายพันประการ

อย่ากระนั้นเลย เรามาเริ่มใช้ Git กันเถอะ

Git คืออะไร

Git เป็นเครื่องมือตัวนึงที่ทำหน้าที่เป็น Repository หรือคลังสมบัติของเรานั่นเอง ใช้เก็บรักษา source code ต่างๆ และยังอำนวยความสะดวกในการปรับปรุง หรือแก้ไขอีกด้วย อย่างง่ายที่สุด คือ เก็บ source code ที่เป็น open-source ให้คนอื่นๆ หยิบไปใช้ หรือพัฒนาต่อได้

วิธีใช้งานของมัน คือ วาง source code ของเราไปไว้ใน git server ถ้าต้องการ update ก็วางทับ ถ้าต้องการย้อนกลับก็หยิบ version ก่อนหน้ามาได้ หรือถ้าต้องการใช้งานร่วมกับคนอื่นก็เปิดสิทธิให้เค้าสามารถดึงไปจาก git server หรือแม้กระทั่งให้สิทธิเค้าสามารถรวม source code กับเราได้เหมือนกันฮะ

Environment ที่เกี่ยวข้องมีตามรูปนี้เลยฮะ

  • working directory
    ก็คือ ที่อยู่ของไฟล์ source code ในเครื่องเราเองฮะ ที่ใช้ทำงานกันนั่นแหละ
  • staging
    ไฟล์ไหนที่เราจะเอาไปวางไว้ใน repository (ต่อไปผมจะเรียกย่อๆ ว่า repo ฮะ) มันจะเข้าไปอยู่ใน staging ก่อน เป็นอีกหนึ่งระดับเพื่อเอาไว้ตรวจสอบก่อน
  • local repo
    เมื่อเราตรวจสอบไฟล์ใน staging ว่าโอเคแล้ว ถูกต้องแล้ว การยืนยันจาก staging จะย้ายไฟล์ไปอยู่ที่ระดับ local repo ก่อนย้ายไปที่ cloud จริงๆ ของ Git server ฮะ
  • remote repo
    อันนี้คือปลายทางล่ะ เมื่อเราตรวจสอบทุกอย่างเรียบร้อยแล้ว source code เราก็จะไปอยู่ที่ cloud พร้อมให้เราหรือคนอื่นมาหยิบไปใช้งานต่อได้ฮะ

เริ่มต้นใช้ Git ยังไงดี

1. หา Git Server

มีหลายเจ้าให้เลือกสรรเลยฮะ เช่น

Github


เป็น Git server ชื่อดังของโลกเลยแหละ คิดว่าคงรู้จักหมดแล้วเนอะ จุดเด่นคือความเป็น open-source community แหละฮะ โปรเจคท์หลายตัวที่น่าสนใจจะเจอได้ที่นี่เลย

Gitlab


เป็นเจ้าดังอีกเจ้าเช่นเดียวกันฮะ จุดเด่น คือ มี CI/CD มาตั้งแต่แรก ทำให้เราทำ automation ได้สะดวกมากๆ ฮะ (แต่ตัวนี้ผมยังไม่เคยเล่นนะ ฮา)

BitBucket


ผมใช้ตัวนี้ที่ทำงานฮะ จุดเด่นคือ มัน Integrate กับระบบของ Atlassian เช่น Jira หรือ Confluence หมายความว่า ถ้าเราใช้ product ของ Atlassian อยู่แล้ว การใช้ BitBucket จะทำให้ชีวิตง่ายขึ้นเยอะเลยฮะ

หรือเราจะใช้ server ของเราเองมาทำ Git ก็ได้ฮะ

2. มี Git account

ต่อจากข้างบนฮะ ถ้าเราเลือก server ได้แล้ว เราก็ต้องมี Git account สำหรับเข้า repo ของเราฮะ นั่นคือ เราสมัครสัก server นึงก่อนเลย พอมี account แล้วทำลำดับต่อไป

3. ติดตั้ง Git ลงในเครื่อง

  • Windows
    ถ้าเป็น ​Windows ก็ download จาก https://git-scm.com/download/win ได้เลยฮะ
  • Unix
    สามารถใช้คำสั่ง yum install git-core หรือ apt install git-core ได้เลยฮะ (ขึ้นอยู่กับแต่ละ Distro)
  • OSX
    จะติดตั้งมาตั้งแต่แรกแล้วฮะ ตั้งแต่ OSX Maverick ฮะ

หรือถ้าติดตั้งไม่ได้ยังไง ลองดูที่ลิงก์นี้ได้ฮะ https://git-scm.com/book/en/v2/Getting-Started-Installing-Git

4. สร้าง Repo กันก่อน

Repo ก็เหมือนกับ folder ของ source code เรื่องนี้ฮะ เป็น folder ใหญ่เลย เราก็สร้างมันมาก่อน อย่างในรูปข้างล่าง คือผมสร้าง repo ชื่อ test_git

5. ผูก Public key ของเครื่องเรากับ Git server

ขั้นตอนต่อมาคือ ผูกให้เครื่องของเรากับ Git server สามารถแลกเปลี่ยนไฟล์กันได้ เพราะเราต้องการให้มัน sync กันฮะ จึงต้องใช้ Public key เพื่อผูกเครื่องของเราเข้ากับ Git server ทำแบบนี้ฮะ

สร้าง Public key ก่อน

ดูวิธีสร้างจากลิงก์นี้ฮะ https://confluence.atlassian.com/bitbucket/set-up-an-ssh-key-728138079.html ซึ่ง Windows กับ OSX ก็ทำต่างกันฮะ

เพิ่ม Public key

เปิดไฟล์ Public key ที่ว่า (เป็นไฟล์ .pub) แล้ววางลงในหน้า Setting > SSH key ของ Git account เราฮะ

6. เริ่มต้น sync ระหว่าง Git กับเครื่องเรา

ใช้คำสั่ง git init เพื่อเริ่มต้นสร้างไฟล์ .git ซึ่งเจ้านี่จะเป็นตัวกลางระหว่าง Git server กับเครื่องเราเลยล่ะฮะ

git init

สำคัญตรงนี้ฮะ เราจะ sync ไฟล์ของเราเข้ากับที่ที่มีไฟล์ .git อยู่นะฮะ

ผูก Git repo เข้ากับ .git ด้วยคำสั่งนี้ฮะ

git remote add origin [git_url]

ซึ่ง git_url หาได้จากตรงนี้ฮะ (ของ Github นะ) ให้อยู่ในรูปของ [email protected]:abc/repo.git

พอเรา git remote add origin แล้วเครื่องเราก็พร้อมจะ sync Git แล้วฮะ

สามารถใช้ git remote show origin เพื่อให้เราแน่ใจว่าทุกอย่างเรียบร้อยฮะ

7. ตั้งค่า กำหนดตัวตนของเรา

git config – global user.email "[email protected]"
git config – global user.name "my name"

มีผลตอนเรา upload Git มันจะแสดงในประวัติการเปลี่ยนแปลง source code หรือเรียกว่า commit ฮะ

8. ปรับไฟล์ให้ตรงกัน

สมมติว่า ที่ repo มีไฟล์อยู่แล้ว เราต้องการ download มันลงมาที่เครื่อง ใช้คำสั่งนี้ฮะ

git clone [git_url] [local_path]

จะเห็นเลยว่า พอเรา clone มันจาก git_url ลงมาที่ local_path มันก็จะ copy มาทั้งหมดเลยฮะ และ local_path นี่แหละจะเป็น working repo ของเรา

9. ปรับไฟล์ไปยัง staging

เมื่อไฟล์ตรงกันระหว่างเครื่องเรากับ Git แล้ว ก็ได้เวลาที่เราจะ copy จากเครื่องเราไปที่ปลายทางล่ะฮะ

เริ่มต้นเลย เราก็จะเข้าไปที่ working repository ก่อนฮะ

เช็คสถานะว่าไฟล์ที่จะ upload เป็นอย่างไร

git status

รูปนี้ คือ ยังไม่มีไฟล์อะไรเลย จึงไม่แสดงชื่อไฟล์ใดๆ ขึ้นมาฮะ

รูปข้างล่าง คือ ผมสร้างไฟล์เปล่าๆ มาตัวนึง ชื่อ test.txt

ต่อมา เราก็จะเพิ่มไฟล์ตัวนี้ไปยัง staging ด้วยคำสั่ง

git add [path_folders_or_files]

จะเห็นได้ว่า เรามี new file: test.txt มาแล้วนะ

ถ้าไม่อยากให้ไฟล์ไหนอยู่ใน staging ก็ลบออก ด้วยคำสั่ง

git rm -- cached [path_folders_or_files]

จะเห็นว่าไฟล์ test.txt ไปอยู่ที่ untracked files แทนแล้วฮะ

ปล. ถ้าเราต้องการที่จะลบไฟล์ทิ้งไปเลยทั้งใน staging และใน working directory สามารถใช้คำสั่ง

git rm -f [path_folders_or_files]

10. ปรับไฟล์ไปที่ local repo

ขอ add test.txt อีกรอบนะฮะ แล้วเมื่อ staging ไฟล์จนครบแล้ว เราก็ยืนยันอีกที ด้วยคำสั่ง

git commit -m "description"

มันจะให้เราใส่ข้อความประกอบไปด้วยว่าทำอะไรไป ตรง "description" นี้คือฟรีสไตล์เลยฮะ เขียนอธิบายคร่าวๆ ไปว่าเกิดอะไรบ้าง ดูย้อนหลังจะได้รู้ความเปลี่ยนแปลง

11. ปรับไฟล์ไปที่ remote repo

เมื่อยืนยันแล้ว มันจะยังไม่เปลี่ยน source code ที่ Remote repo ทันที มันจะอยู่ในรูปของกิ่ง (branch) เพื่อให้เราตัดสินใจว่าจะแก้ไขอะไรต่อไหม ถ้าเราต้องการรวมกิ่งนี้เข้ากับ Remote repo ก็ใช้คำสั่ง

git push origin master

มันคือกิ่งปัจจุบัน (origin ถ้าไม่มีการตั้งค่าอื่นๆ) ถูกรวมเข้ากับ folder หลัก (master) ที่ Repo ฮะ

12. ดูผลที่ Git server

ชัดเจนเลยฮะ ที่เรา push ไปตะกี้เป็น commit ของ test.txt ด้วยข้อความที่เราใส่ไป เท่านี้ก็สำเร็จแล้วฮะ

ทิ้งท้าย

นี่เป็นแค่ตัวอย่างของการใช้ Git แบบง่ายๆ เราสามารถเล่นกับมันได้หลายวิธีมากฮะ ไม่ว่าจะเป็นการแตกกิ่ง การรวมกิ่ง การยกเลิกกิ่ง ซึ่งเข้าไปดู document เต็มๆ ได้ที่ https://git-scm.com/docs ฮะ

ถ้าเจออะไร จะมาแชร์ให้อ่านกันนะฮะ

บาย ~

References

https://git-scm.com/

https://dev.to/mollynem/git-github–workflow-fundamentals-5496

https://stackshare.io/stackups/bitbucket-vs-github-vs-gitlab

medium.com/@iamgique/