Git Repository — คือพื้นที่จัดเก็บซอร์สโค้ดของโปรเจกต์ที่ Git ติดตามการเปลี่ยนแปลงไฟล์ทุกครั้งตลอดการพัฒนา ที่เก็บประกอบด้วยประวัติทั้งหมดของ commits, branches และ tags ซึ่งช่วยให้นักพัฒนาสามารถทำงานร่วมกันบนโค้ดได้ ตาม Git, 2024 ที่เก็บเป็นพื้นฐานของระบบควบคุมเวอร์ชันใด ๆ และถูกใช้ในโปรเจกต์หลายล้านโปรเจกต์ทั่วโลก
ประเด็นสำคัญ
Git Repository — คือโครงสร้างข้อมูลที่ระบบควบคุมเวอร์ชันจัดเก็บข้อมูลเมตาและออบเจกต์ที่อธิบายประวัติการเปลี่ยนแปลงไฟล์ของโปรเจกต์ เมื่อนักพัฒนาเริ่มต้นที่เก็บด้วยคำสั่ง git init, Git จะสร้างโฟลเดอร์ที่ซ่อนอยู่ .git ในรากของโปรเจกต์
ภายในโฟลเดอร์นี้มีออบเจกต์ การอ้างอิง และไฟล์คอนฟิกทั้งหมดที่จำเป็นสำหรับการทำงานของระบบ ที่เก็บไม่ได้ผูกติดกับตำแหน่งเฉพาะ — นักพัฒนาสามารถสร้างมันในเครื่องแล้วเชื่อมต่อกับเซิร์ฟเวอร์ระยะไกลได้
Git ใช้โมเดล ที่เก็บแบบกระจาย: สมาชิกแต่ละคนในโปรเจกต์มีสำเนาประวัติทั้งหมดบนคอมพิวเตอร์ของตนเอง ซึ่งหมายความว่าการดำเนินการส่วนใหญ่ — commit, ดูประวัติ, สร้างสาขา — จะดำเนินการในเครื่องโดยไม่ต้องติดต่อเซิร์ฟเวอร์
ตาม เอกสารของ Git, สถาปัตยกรรมแบบกระจายทำให้ระบบทนทานต่อข้อผิดพลาด: หากเซิร์ฟเวอร์ล่ม ที่เก็บในเครื่องใดก็ตามสามารถเป็นแหล่งสำหรับกู้คืนประวัติทั้งหมดของโปรเจกต์ได้
ที่เก็บในเครื่อง — คือสำเนาของโปรเจกต์บนคอมพิวเตอร์ของนักพัฒนา ประกอบด้วยประวัติทั้งหมดของ commits, สาขาและแท็ก และอนุญาตให้ดำเนินการ commit, branch, merge และ rebase โดยไม่ต้องเชื่อมต่อเครือข่าย
ที่เก็บระยะไกล — โฮสต์บนเซิร์ฟเวอร์และทำหน้าที่เป็นจุดซิงโครไนซ์สำหรับสมาชิกทุกคนในทีม นักพัฒนาส่งการเปลี่ยนแปลงด้วยคำสั่ง git push และรับการเปลี่ยนแปลงของผู้อื่นด้วย git pull
การเชื่อมต่อระหว่างที่เก็บในเครื่องและที่เก็บระยะไกลถูกกำหนดค่าผ่าน remote origin — URL ของเซิร์ฟเวอร์ที่เก็บไว้ในคอนฟิก Git ที่เก็บในเครื่องหนึ่งสามารถเชื่อมต่อกับที่เก็บระยะไกลหลายแห่ง ซึ่งมีประโยชน์เมื่อทำงานกับ forks
ข้อได้เปรียบหลักของโมเดลนี้คือนักพัฒนาสามารถทำงานบนโค้ดแบบออฟไลน์และซิงโครไนซ์การเปลี่ยนแปลงเมื่อพร้อมที่จะส่งผลลัพธ์เท่านั้น
| คุณลักษณะ | ในเครื่อง | ระยะไกล |
|---|---|---|
| ตำแหน่ง | บนคอมพิวเตอร์ของนักพัฒนา | บนเซิร์ฟเวอร์ (GitHub, GitLab) |
| การเข้าถึงแบบออฟไลน์ | เข้าถึงการดำเนินการทั้งหมดได้เต็มที่ | ไม่สามารถใช้ได้หากไม่มีการเชื่อมต่อ |
| การซิงโครไนซ์ | Push/Pull กับระยะไกล | รับ push จากในเครื่อง |
| การสำรองข้อมูล | ไม่ได้รับการป้องกันจากการสูญหายของข้อมูล | จัดเก็บบนเซิร์ฟเวอร์พร้อมการสำรอง |
โมเดลการจัดเก็บของ Git แตกต่างจากระบบควบคุมเวอร์ชันอื่นโดยพื้นฐาน แทนที่จะจัดเก็บรายการการเปลี่ยนแปลง (เดลต้า) ระหว่างเวอร์ชัน Git จะจัดเก็บภาพรวมที่สมบูรณ์ของไฟล์โปรเจกต์ทั้งหมด ณ เวลาของแต่ละ commit
แต่ละออบเจกต์ในที่เก็บถูกระบุโดย SHA-1 hash เฉพาะ 40 ตัวอักษร หากเนื้อหาของไฟล์ไม่เปลี่ยนแปลงระหว่าง commits, Git จะไม่สร้างออบเจกต์ใหม่แต่ใช้ซ้ำของเดิม — ซึ่งช่วยประหยัดพื้นที่
Git ใช้ออบเจกต์สี่ประเภท: blob (เนื้อหาไฟล์), tree (โครงสร้างไดเรกทอรี), commit (ภาพรวมพร้อมข้อมูลเมตา) และ tag (การอ้างอิงที่มีชื่อถึง commit) ออบเจกต์ทั้งหมดถูกเก็บในโฟลเดอร์ .git/objects
ตาม Git Internals, โมเดลออบเจกต์ของ Git รับประกันความสมบูรณ์ของข้อมูล: การเปลี่ยนแปลงใด ๆ ในเนื้อหาไฟล์จะสร้าง hash ใหม่ ทำให้ไม่สามารถเปลี่ยนแปลงประวัติโดยไม่ถูกตรวจจับได้
โฟลเดอร์ .git คือหัวใจของที่เก็บ หากไม่มีมัน Git จะไม่สามารถติดตามการเปลี่ยนแปลงได้ และไดเรกทอรีธรรมดาก็เป็นเพียงชุดของไฟล์ การทำความเข้าใจโครงสร้างของโฟลเดอร์นี้ช่วยวินิจฉัยปัญหากับที่เก็บ
ไฟล์ HEAD สมควรได้รับความสนใจเป็นพิเศษ ในสถานะปกติมันมีการอ้างอิงเชิงสัญลักษณ์ไปยังสาขา เช่น ref: refs/heads/main ในสถานะ detached HEAD มันชี้ไปยัง commit โดยตรง — ซึ่งหมายความว่า commits ใหม่จะไม่ถูกผูกติดกับสาขาใด
การทำงานกับ Git repository รวมถึงชุดการดำเนินการพื้นฐานที่นักพัฒนาทำทุกวัน แต่ละการดำเนินการจะเปลี่ยนสถานะของที่เก็บโดยการเพิ่มออบเจกต์ใหม่หรือย้ายการอ้างอิง
การดำเนินการ push และ pull เป็นเพียงอย่างเดียวที่ต้องเชื่อมต่อกับเซิร์ฟเวอร์ระยะไกล การดำเนินการอื่นทั้งหมดดำเนินการในเครื่องทั้งหมด ซึ่งรับประกันความเร็วสูงแม้มีปริมาณประวัติมาก
แต่ละไฟล์ในที่เก็บผ่านสี่สถานะ: untracked (ไม่ถูกติดตาม), modified (ถูกแก้ไข), staged (ถูกเตรียม) และ committed (ถูก commit) Git ติดตามเฉพาะไฟล์ที่ถูกเพิ่มอย่างชัดเจนผ่าน git add หรืออยู่ในประวัติ commits แล้ว
การทำความเข้าใจโมเดลนี้คือกุญแจสำคัญในการทำงานกับ Git อย่างมีประสิทธิภาพ นักพัฒนาสามารถเลือกเตรียมเฉพาะส่วนหนึ่งของไฟล์ที่ถูกแก้ไขสำหรับ commit สร้าง commits ที่สมบูรณ์ตามตรรกะพร้อมคำอธิบายที่ชัดเจน
ที่เก็บระยะไกล มักถูกโฮสต์บนแพลตฟอร์มเฉพาะที่ให้อินเทอร์เฟซเว็บ ระบบจัดการการเข้าถึงและเครื่องมือเพิ่มเติมสำหรับการพัฒนาร่วมกัน
การเลือกแพลตฟอร์มขึ้นอยู่กับขนาดทีม ข้อกำหนดด้านความเป็นส่วนตัวและการผสานรวมที่จำเป็น สำหรับการพัฒนาแอพมือถือ มักเลือก GitHub เนื่องจากการสนับสนุนจากชุมชนที่กว้างขวางและการผสานรวมกับเครื่องมือ CI/CD สำหรับ iOS และ Android
ลองพิจารณาสถานการณ์ในทางปฏิบัติ: นักพัฒนา clone ที่เก็บที่มีอยู่ สร้างสาขาใหม่ ทำการเปลี่ยนแปลงและส่งไปยังเซิร์ฟเวอร์ แต่ละคำสั่งแสดงการทำงานกับส่วนประกอบต่าง ๆ ของที่เก็บ
# การโคลนที่เก็บระยะไกล
git clone https://github.com/user/mobile-app.git
# การนำทางไปยังไดเรกทอรีโปรเจกต์
cd mobile-app
# การสร้างสาขา feature ใหม่และสลับไปยังมัน
git checkout -b feature/auth
# การตรวจสอบสถานะของไฟล์ที่ถูกแก้ไข
git status
# การเพิ่มการเปลี่ยนแปลงทั้งหมดไปยังพื้นที่ staging
git add .
# การสร้าง commit พร้อมคำอธิบาย
git commit -m "Add authentication module"
# การส่งการเปลี่ยนแปลงไปยังที่เก็บระยะไกล
git push origin feature/auth
คำสั่ง git status เป็นหนึ่งในคำสั่งที่มีประโยชน์ที่สุดในการทำงานประจำวัน มันแสดงให้เห็นว่าไฟล์ใดถูกแก้ไข ไฟล์ใดถูกเตรียมสำหรับ commit และไฟล์ใดที่ไม่ถูกติดตามโดย Git เลย
สำหรับการวิเคราะห์ประวัติที่เก็บ ใช้คำสั่ง git log พร้อมกับแฟลกรูปแบบต่าง ๆ มันแสดงลำดับเวลาของ commits, ผู้เขียน, วันที่และตัวระบุ SHA-1
# การดูประวัติพร้อมการแสดงกราฟสาขา
git log --oneline --graph --all
# การดูการเปลี่ยนแปลงใน commit ที่ระบุ
git show a1b2c3d
# การเปรียบเทียบสถานะปัจจุบันกับ commit ล่าสุด
git diff HEAD
# การดูประวัติของไฟล์ที่ระบุ
git log --follow src/MainActivity.kt
แฟลก --graph แสดงกราฟ ASCII ของการแตกสาขา ซึ่งมีประโยชน์โดยเฉพาะในที่เก็บที่มีการทำงานบนหลายสาขา สำหรับโปรเจกต์มือถือที่มีการปล่อยเวอร์ชันบ่อยครั้ง กราฟภาพช่วยประเมินโครงสร้างการพัฒนาได้อย่างรวดเร็ว
คำถามที่พบบ่อย
ที่เก็บ คือพื้นที่จัดเก็บโค้ดทางเทคนิคที่มีประวัติการเปลี่ยนแปลง โปรเจกต์เป็นแนวคิดที่กว้างกว่าซึ่งรวมถึงที่เก็บ ระบบจัดการงาน เอกสาร และกระบวนการพัฒนา หนึ่งโปรเจกต์สามารถมีหลายที่เก็บ
สร้างที่เก็บใหม่ผ่านอินเทอร์เฟซเว็บของ GitHub โดยคลิกปุ่ม New ระบุชื่อ คำอธิบายและระดับการเข้าถึง จากนั้น clone ที่เก็บไปยังเครื่องในเครื่องหรือเชื่อมต่อกับที่เก็บในเครื่องที่มีอยู่ผ่าน git remote add origin
หากที่เก็บระยะไกลถูกลบจากเซิร์ฟเวอร์แต่นักพัฒนาอย่างน้อยหนึ่งคนมีสำเนาในเครื่อง สามารถกู้คืนที่เก็บได้ เพียงสร้างที่เก็บระยะไกลใหม่และรัน git push --force จากสำเนาในเครื่องที่มีประวัติทั้งหมด
Fork คือสำเนาของที่เก็บของคนอื่นในบัญชีของคุณ คุณได้รับสำเนาประวัติทั้งหมดและสามารถทำการเปลี่ยนแปลงใด ๆ โดยไม่กระทบต่อต้นฉบับ Forks ถูกใช้เพื่อเข้าร่วมโปรเจกต์โอเพนซอร์สผ่าน Pull Request
ใช้ git gc เพื่อบีบอัดออบเจกต์และลบข้อมูลที่ไม่สามารถเข้าถึงได้ ลบไฟล์ขนาดใหญ่ออกจากประวัติผ่าน git filter-branch หรือ git filter-repo สำหรับโปรเจกต์ที่มีไฟล์ไบนารี ให้พิจารณา Git LFS (Large File Storage)
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม