Version Control คืออะไรนะ? จากความเข้าใจของ Junior Developer
Tags: git
Published: 2022-01-21 14:36:36


![Ref: https://www.pexels.com/photo/person-choosing-document-in-folder-4792285/](https://images.pexels.com/photos/4792285/pexels-photo-4792285.jpeg?auto=compress&cs=tinysrgb&dpr=2&h=750&w=1260)
เคยทำงานเอกสารเพื่อส่งอาจารย์ตรวจ แล้วต้องโดนแก้กลับมากันมั้ยครับ? ซักพัก ก็โดนให้ย้อนกลับไปดูเอกสารฉบับที่ส่งไปเมื่อ 3 วันก่อน ถ้าคนที่่เก็บเอกสารเก่าๆ เอาไว้ ก็จะแบ่งเอกสารเหล่านั้นเป็นเวอร์ชั่นๆ เช่น _แก้-ver1 แก้-ver2 แก้-ver[x]_ ไปเรื่อยๆ 

สิ่งนี้เองไม่ได้เกิดกับงานเอกสารเท่านั้น แต่กับงานพัฒนาซอฟต์แวร์ด้วยเช่นกัน การพัฒนาซอฟต์แวร์ สามารถเกิดการเพิ่มเติม แก้ไข เปลี่ยนแปลงตัว Source Code อยู่ตลอดเวลา 

แล้วเราจะ**ติดตามการเปลี่ยนแปลง**ของ Source Code กันได้อย่างไรกัน คงจะไม่ใช่การตั้งชื่อไฟล์เป็น Version กันใช่มั้ยครับ? นั้นเป็นที่มาของคำว่า **Version Control**

## **อะไรคือ Version Control ละ?**
สั้นๆ Version Control คือเครื่องมือที่ทำให้ Developer ติดตามการเปลี่ยนแปลงที่เกิดขึ้นใน Source Code ของโปรเจคได้ ซึ่งเมื่อติดตามได้ มันจึงทำให้

- การทำงานระหว่างกลุ่ม Developer ทำได้ง่ายขึ้น เพราะแต่ละคนก็พัฒนาของตัวเอง เมื่อต้องการจะรวมเข้ากับ Source ตรงกลาง ก็ทำการเช็คการเปลี่ยนแปลง (Change) และขอรวม Code version ของตัวเองเข้ามา (Merge)

- Developer สามารถทราบถึงประวัติการเปลี่ยนแปลง (History Change) และดึง Source Code ตามประวัติกลับมา หากว่า version ปัจจุบันทำให้โปรเจคเสียหายหรือผิดพลาด

- ทราบว่าใครเป็นผู้สร้างการเปลี่ยนแปลงภายใน source code ทำให้หาผู้เกี่ยวข้องได้ และสามารถช่วยกันแก้ไขปัญหาได้รวดเร็ว (Ideally)

* Repository หมายถึงโปรเจคหรือที่เก็บ Source Code เอาไว้เป็นที่เดียวกัน โดยใน หนึ่ง Repository อาจจะมี Repository ย่อย (Mono-Repository) เอาไว้อีกด้วย

![Ref: https://homes.cs.washington.edu/~mernst/advice/version-control.html#:~:text=Version%20control%20enables%20multiple%20people,interfere%20with%20another%20person's%20work.](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xji92n47f1nq16wm8g40.png)

**Version Control จะแบ่งได้ออกเป็น 2 รูปแบบใหญ่ ได้แก่**
- **Centralized Version Control**: คือการที่ Repository ถูกรวบรวมไว้ที่ server กลาง ดังนั้นการเปลี่ยนแปลงทั้งหมดจะต้องเชื่อมโยงกับ Repository บน Server เป็นหลัก ตัวอย่างเครื่องมือเช่น Subversion

- **Distributed Version Control**: คือการที่ Repository สามารถถูกคัดลอก (copy) ลงไปแต่ละเครื่องของ Developer ได้ และคนอื่นๆ จะไม่สามารถเข้าถึง version ต่างๆ เหล่านั้นได้ จนกว่าเราจะทำการส่ง version ของเราขึ้นไปที่ Repository กลาง เครื่องมือเช่น Git

*โดยในบทความนี้ เราจะพูดถึง Distributed VC ด้วยเครื่องมือ Git เป็นหลัก

## Git คืออะไร?
Git คือ Open Source สำหรับจัดการ ติดตาม การเปลี่ยนแปลงภายใน Project ตั้งแต่ขนาดเล็ก ไปจนถึงขนาดใหญ่ โดย Git จะสามารถติดตามการเปลี่ยนแปลงแบ่งเป็น Version ตามรูปด้านล่าง


![Ref: https://www.nobledesktop.com/learn/git/git-branches](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ipd4oiaad4ut06f2fzte.png)

โดยปกติในหนึ่งโปรเจคจะมีหลาย Features โดยเราจะนิยมเรียก features เหล่านี้ว่า branch โดยในแต่ละ branch ก็จะมี version ที่เกิดจากการพัฒนาปรับปรุงขึ้นมา

เราจะเรียก feature หลักของโปรเจคว่า master หรือ main branch โดยจะทำหน้าที่เป็นตัวหลักในการทำงาน อ้างอิง รวมไปถึงการนำไปใช้งาน (on production) ต่างๆ อีกด้วย 

**Local & Remote Repository**
ปกตินั้น การพัฒนาโปรเจค เราจะมีตัวเก็บ Repository หลักเอาไว้ เพื่อกระจาย อ้างอิง ให้ทุกคนภายในทีมพัฒนา เราจะเรียกว่า Remote Repository ซึ่ง repository ที่ถูกดึง (pull) ลงไปยังเครื่องของคนภายในทีมเพื่อพัฒนาต่อนั้น จะถูกเรียกว่า Local Repository


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/os6jl0n7v9b43c0cb3l9.png)

ซึ่งแต่ละคนภายในทีม จะยังไม่สามารถเห็นการเปลี่ยนแปลงของสมาชิกได้ หากการเปลี่ยนแปลง (Change) ยังอยู่ที่เครื่อง (Local) ของแต่ละคน โดยเมื่อต้องการเพิ่มเติม source code ให้โปรเจคหลัก เพื่อให้ทุกคนเห็นหรือนำไปใช้ จะต้องทำการส่ง (push) ขึ้นมาที่ Remote Repository ต่อไป

## คำสั่ง Git พื้นฐานและ usecase ใช้งาน
เราจะมีพูดถึงคำสั่งพื้นฐานสำหรับการใช้งาน Git ทั้งหมด 5 คำสั่ง ได้แก่ clone, add, commit, push, pull 

1.`git clone` : คือการดึง repository จาก remote ลงมาสู่ local โดยจะมีวิธีทำได้ 2 รูปแบบหลักๆ คือ https และ ssh (จะมีการอธิบายต่อในบทความต่อๆ ไปครับ )

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2d79j1s5s1n1dezaebbi.png)

2.`git pull` : จะเป็นการดึง code version จาก remote branch ลงมาสู่ local branch เช่นกัน แต่ความแตกต่างคือ จะมีความเจาะจงไปยัง branch มากกว่า


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wmpy0p2xrs99x42v6ncr.png)

**ตัวอย่าง:** เราพัฒนา shopping cart บน local branch จากนั้น เพื่อนได้อัพเดท code บางอย่างเข้า remote branch เดียวกัน เราสามารถ pull code ลงมาเพื่อตรวจสอบหรือใช้งานได้

3.`git add` : เราต้องเข้าใจก่อนว่า ในการพัฒนา source code บน local branch นั้น เวลาที่มีการเปลี่ยนแปลง ตัว git จะทำงานติดตาม (track) และหากว่าเราต้องการที่จะเก็บการเปลี่ยนแปลงนั้นไว้ แต่ยังไม่แน่ใจว่าจะอัพเดทเวอร์ชั่นใหม่มั้ย เราจะเรียกพื้นที่ตรงนั้นว่า stage change โดยการใช้ git add หมายถึงการนำไฟล์ที่เปลี่ยนแปลงเข้าสู่ stage change นั้นเอง


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w5de0iurjfosmh0bhglt.png)

4.`git commit` : จะเป็นคำสั่งที่มักใช้ต่อกับ git add กล่าวคือ เมื่อเรามั่นใจแล้วว่า ต้องการให้การเปลี่ยนแปลงใน source code นั้นอัพเดทเวอร์ชั่นแน่ๆ เราจะทำการย้าย การเปลี่ยนแปลง (change) จาก stange change เข้าสู่ branch history ด้วยการ commit


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ibz3u7is013trpv1d5v4.png)

5.`git push` : คือการนำการเปลี่ยนแปลงที่อยู่ใน branch history บน local branch ขึ้นสู่ remote branch เพื่อให้สมาชิกในทีมได้ตรวจสอบหรือนำไปใช้งานต่อไป


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/l75i5hwgr99zr7fn30hu.png)

## สรุป
Version Control นั้นสามารถช่วยให้การติดตามการเปลี่ยนแปลงของ source กcode ภายในโปรเจคนั้นทำได้ง่าย ซึ่งก่อให้เกิดการพัฒนาเป็นทีมได้อย่างเป็นระบบ เกิดขึ้นพร้อมกันได้ ตั้งแต่โปรเจคขนาดเล็ก - ขนาดใหญ่ได้

ในบทความต่อไป เราจะมาลงมือติดตั้ง git โดยใช้ github เป็น remote repository และทดลองใช้งานคำสั่งต่างๆ จากด้านบน และที่มีเพิ่มเติมกันครับ :)

## อ้างอิงและขอบคุณ (Appreciate & Reference)
- https://homes.cs.washington.edu/~mernst/advice/version-control.html#:~:text=Version%20control%20enables%20multiple%20people,interfere%20with%20another%20person's%20work.
- https://towardsdatascience.com/version-control-101-getting-started-with-git-3b2c78d91184
- https://www.toolsqa.com/git/local-repository-remote-repository/#:~:text=Git%20remote%20is%20just%20a,git%20remote%20for%20the%20same.
- https://www.pexels.com/photo/person-choosing-document-in-folder-4792285/
- https://www.nobledesktop.com/learn/git/git-branches
- https://git-scm.com/