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 ที่เหมาะสม การทำตามขั้นตอนเหล่านี้จะช่วยให้การทำงานร่วมกันในทีมมีประสิทธิภาพมากขึ้นและช่วยให้โค้ดมีความสอดคล้องกันในทุกขั้นตอน