Skip to main content

การใช้ Git กับโปรเจกต์ขนาดใหญ่

บทนำ​

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

1. การจัดการขนาดของ Repository​

ใช้ Git LFS (Large File Storage)​

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

ติดตั้ง Git LFS:

git lfs install

เพิ่มไฟล์ที่ต้องการให้ Git LFS จัดการ:

git lfs track "*.psd"

จากนั้นทำการเพิ่มไฟล์ที่ติดตามโดย Git LFS ลงใน repository:

git add .gitattributes
git commit -m "Track large files with LFS"

การใช้ .gitignore อย่างมีประสิทธิภาพ​

ใช้ไฟล์ .gitignore เพื่อไม่ให้ Git ติดตามไฟล์ที่ไม่จำเป็นหรือไฟล์ที่มีขนาดใหญ่เกินไป เช่น ไฟล์ที่สร้างจากการคอมไพล์หรือไฟล์ที่มีข้อมูลชั่วคราว

ตัวอย่าง .gitignore:

# Node.js
node_modules/

# Python
__pycache__/

# Build files
build/
dist/

# IDE config
.vscode/
.idea/

2. การแบ่งแยกโปรเจกต์​

การใช้ Submodules​

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

เพิ่ม Submodule:

git submodule add <repository_url> <path_to_submodule>

อัปเดต Submodule:

git submodule update --remote

การใช้ Subtree​

หากคุณต้องการให้โปรเจกต์ย่อยรวมอยู่ใน repository หลัก แต่ไม่ต้องการใช้ Submodule คุณสามารถใช้ Git Subtree แทน ซึ่งช่วยให้คุณสามารถรวมโค้ดจาก repository ย่อยโดยไม่ต้องพึ่งพา Submodule

ตัวอย่างการใช้ Git Subtree:

git subtree add --prefix=<path> <repository_url> <branch> --squash

3. การทำงานร่วมกันในทีม​

การใช้ Branches อย่างมีระเบียบ​

สำหรับโปรเจกต์ขนาดใหญ่ที่มีหลายทีมและหลายผู้พัฒนา การใช้ branches สำหรับคุณสมบัติใหม่ (feature branches) และการรวมโค้ด (pull requests) เป็นวิธีที่ดีในการจัดการการพัฒนา

ตัวอย่างการสร้าง branch สำหรับฟีเจอร์ใหม่:

git checkout -b feature/new-feature

จากนั้นเมื่อฟีเจอร์เสร็จสิ้นให้ทำการรวมกับ branch หลัก (เช่น main หรือ develop) โดยใช้ pull requests เพื่อให้สามารถตรวจสอบโค้ดและหลีกเลี่ยงปัญหาการรวมโค้ดที่ผิดพลาด

การใช้ Git Hooks​

ใช้ Git hooks เพื่อตรวจสอบคุณภาพของโค้ดก่อนที่การเปลี่ยนแปลงจะถูก commit หรือ push เช่น การใช้ pre-commit hook เพื่อตรวจสอบว่าโค้ดมีการจัดรูปแบบตามมาตรฐานหรือไม่

ตัวอย่างการตั้งค่า pre-commit hook:

git config --global core.hooksPath .githooks

จากนั้นสร้างไฟล์ในโฟลเดอร์ .githooks/pre-commit เพื่อใช้ตรวจสอบโค้ด

การใช้ Git Workflows​

เลือก workflow ที่เหมาะสมสำหรับโปรเจกต์ขนาดใหญ่ เช่น GitFlow หรือ GitHub Flow ซึ่งช่วยจัดการกับการพัฒนา, ทดสอบ, และการ deploy

  • GitFlow: มีการแยก feature, develop, release, และ hotfix branches
  • GitHub Flow: ใช้ main เป็น branch หลักและสร้าง branch สำหรับฟีเจอร์ใหม่ที่สามารถ merge ได้ผ่าน pull requests

4. การจัดการกับการ Merge และ Conflict​

การใช้ Rebase แทนการ Merge​

ในโปรเจกต์ขนาดใหญ่ที่มีหลาย branch การใช้ git rebase แทน git merge จะช่วยให้การรวมโค้ดมีประวัติที่สะอาดและเข้าใจง่าย โดยการ rebase จะช่วยให้คุณสามารถทำให้ branch ของคุณสอดคล้องกับ branch หลักโดยไม่ทิ้งการ commit ที่ไม่จำเป็น

ตัวอย่างการใช้ rebase:

git checkout feature-branch
git rebase main

การจัดการกับ Merge Conflicts​

การจัดการกับ merge conflict ในโปรเจกต์ขนาดใหญ่สามารถทำได้โดยการใช้เครื่องมือช่วยในการแก้ไข เช่น git mergetool หรือ IDE ที่มีฟีเจอร์ช่วยจัดการ conflict

การใช้ Pull Request Templates​

การใช้ Pull Request templates จะช่วยให้ทีมของคุณสามารถทำตามขั้นตอนที่เหมาะสมในการตรวจสอบโค้ดและลดข้อผิดพลาดในการรวมโค้ด

สรุป​

การใช้ Git ในโปรเจกต์ขนาดใหญ่สามารถทำได้โดยการใช้เทคนิคต่าง ๆ เช่น Git LFS, Submodules, Subtree, การจัดการ branches, Git hooks, และการใช้ Git workflows ที่เหมาะสม การทำตามขั้นตอนเหล่านี้จะช่วยให้การทำงานร่วมกันในทีมมีประสิทธิภาพมากขึ้นและช่วยให้โค้ดมีความสอดคล้องกันในทุกขั้นตอน