04 - Team Workflow: Quy Trình Làm Việc Nhóm
Đối tượng: Tất cả thành viên team Thời gian học: 1-2 giờ Mục tiêu: Chuẩn hoá quy trình Git trong team, giảm conflict
📖 Mục Lục
- Tổng Quan Về Team Workflow
- Vai Trò Các Branch
- Luồng Merge Chuẩn
- Quy Trình Từ Issue → PR
- Code Review Process
- Xử Lý Conflict Trong Team
- Vai Trò Và Trách Nhiệm
1. Tổng Quan Về Team Workflow
Nguyên tắc cốt lõi
┌─────────────────────────────────────────────────────────────────────┐
│ NGUYÊN TẮC TEAM WORKFLOW │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 1️⃣ "Branch càng nhiều càng tốt nhưng phải SẠCH" │
│ → Mỗi task = 1 branch, xong việc = xóa branch │
│ │
│ 2️⃣ "1 Branch = 1 Feature hoặc 1 Bug" │
│ → Không trộn nhiều việc trong 1 branch │
│ │
│ 3️⃣ "Không ai push trực tiếp vào main/develop" │
│ → Luôn qua Pull Request │
│ │
│ 4️⃣ "Code phải được review trước khi merge" │
│ → Ít nhất 1 người review │
│ │
│ 5️⃣ "Conflict giải quyết ở FEATURE branch, không phải develop" │
│ → Cập nhật feature branch thường xuyên │
│ │
└─────────────────────────────────────────────────────────────────────┘
Git Flow của team (Simplified)
Production
│
┌───────────────────────────────────┼───────────────────────────────────┐
│ │ │
│ ┌────▼────┐ │
│ │ main │ ← Stable, deployed │
│ └────┬────┘ │
│ │ │
│ │ merge (PR) │
│ │ │
│ ┌────▼────┐ │
│ │ develop │ ← Integration branch │
│ └────┬────┘ │
│ │ │
│ ┌───────────────────┼───────────────────┐ │
│ │ │ │ │
│ ┌────▼────┐ ┌────▼────┐ ┌────▼────┐ │
│ │feat/A │ │feat/B │ │fix/C │ │
│ └─────────┘ └─────────┘ └─────────┘ │
│ Dev A Dev B Dev C │
│ │
└───────────────────────────────────────────────────────────────────────┘
2. Vai Trò Các Branch
2.1. Branch main (Protected)
┌─────────────────────────────────────────────────────────────────────┐
│ BRANCH: main │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ Vai trò: Code production, đang chạy trên server │
│ Quyền push: ❌ KHÔNG AI được push trực tiếp │
│ Merge từ: develop (qua PR, sau khi test OK) │
│ Protection: Branch protection ON │
│ │
│ ✅ Làm được: │
│ - Merge từ develop qua PR (cần approval) │
│ - Hotfix qua PR (khẩn cấp) │
│ │
│ ❌ KHÔNG làm: │
│ - Push trực tiếp │
│ - Force push │
│ - Merge không qua PR │
│ │
└─────────────────────────────────────────────────────────────────────┘
2.2. Branch develop (Semi-protected)
┌─────────────────────────────────────────────────────────────────────┐
│ BRANCH: develop │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ Vai trò: Integration branch, tập hợp features │
│ Quyền push: ❌ KHÔNG push trực tiếp │
│ Merge từ: Feature branches (qua PR) │
│ Test: CI/CD chạy test tự động │
│ │
│ ✅ Làm được: │
│ - Merge feature branches qua PR │
│ - Tạo feature branch từ đây │
│ │
│ ❌ KHÔNG làm: │
│ - Push trực tiếp │
│ - Force push │
│ │
└─────────────────────────────────────────────────────────────────────┘
2.3. Feature Branches
┌─────────────────────────────────────────────────────────────────────┐
│ FEATURE BRANCHES │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ Naming: feat/*, fix/*, refactor/*, docs/* │
│ Tạo từ: develop │
│ Merge vào: develop (qua PR) │
│ Owner: Developer sở hữu task │
│ │
│ ✅ Làm được: │
│ - Push thoải mái │
│ - Force push (nếu chỉ mình làm) │
│ - Rebase │
│ │
│ ⚠️ Lưu ý: │
│ - Cập nhật từ develop thường xuyên │
│ - Xóa sau khi merge │
│ │
└─────────────────────────────────────────────────────────────────────┘
Bảng tổng hợp
| Branch | Push trực tiếp | Force push | Xóa được | Tạo từ |
|---|---|---|---|---|
main | ❌ | ❌ | ❌ | - |
develop | ❌ | ❌ | ❌ | - |
feat/* | ✅ | ⚠️ | ✅ | develop |
fix/* | ✅ | ⚠️ | ✅ | develop |
hotfix/* | ✅ | ⚠️ | ✅ | main |
3. Luồng Merge Chuẩn
3.1. Luồng Feature thông thường
┌─────────────────────────────────────────────────────────────────────┐
│ LUỒNG MERGE: Feature → Develop → Main │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ feat/login ──PR──▶ develop ──PR──▶ main │
│ │ │ │
│ │ │ │
│ Review + Review + │
│ CI Pass QA Pass │
│ │
└─────────────────────────────────────────────────────────────────────┘
Timeline:
─────────────────────────────────────────────────────────────────────▶
1. Tạo feat/login từ develop
2. Code và commit
3. Push và tạo PR → develop
4. Review + CI check
5. Merge vào develop
6. Test trên develop (QA)
7. Tạo PR từ develop → main
8. Review + QA approval
9. Merge vào main
10. Deploy production
3.2. Luồng Hotfix (khẩn cấp)
┌─────────────────────────────────────────────────────────────────────┐
│ LUỒNG HOTFIX (KHẨN CẤP) │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ main │
│ │ │
│ ┌────────┴────────┐ │
│ │ │ │
│ ▼ │ │
│ hotfix/xxx │ │
│ │ │ │
│ │ ┌────────────┘ │
│ ▼ ▼ │
│ main develop │
│ │
│ 1. Tạo hotfix từ main │
│ 2. Fix nhanh │
│ 3. Merge vào main (deploy) │
│ 4. Merge vào develop (đồng bộ) │
│ │
└─────────────────────────────────────────────────────────────────────┘
# Quy trình hotfix
git checkout main
git pull origin main
git checkout -b hotfix/critical-bug
# Fix bug
git add .
git commit -m "hotfix: fix critical security issue"
git push -u origin hotfix/critical-bug
# Tạo PR vào main (cần approval khẩn cấp)
# Sau khi merge vào main, merge vào develop
git checkout develop
git pull origin develop
git merge main
git push origin develop
4. Quy Trình Từ Issue → PR
4.1. Sơ đồ quy trình
┌─────────────────────────────────────────────────────────────────────┐
│ TỪ ISSUE ĐẾN PRODUCTION │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ ISSUE │───▶│ BRANCH │───▶│ COMMIT │───▶│ PR │ │
│ │ #123 │ │feat/#123 │ │ │ │ │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
│ │ │ │
│ │ ▼ │
│ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ └────────▶│ CLOSE │◀───│ MERGE │◀───│ REVIEW │ │
│ auto-close │ ISSUE │ │ │ │ │ │
│ └──────────┘ └──────────┘ └──────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────┘
4.2. Bước 1: Nhận Issue
Issue #123: Add user login feature
├── Title: [FEAT] User Login
├── Description: As a user, I want to login...
├── Labels: feature, priority-high
├── Assignee: @you
└── Milestone: Sprint 5
4.3. Bước 2: Tạo Branch từ Issue
# Quy tắc đặt tên: <type>/<issue-number>-<short-description>
# Ví dụ cho Issue #123
git checkout develop
git pull origin develop
git checkout -b feat/123-user-login
# Các ví dụ khác:
# feat/45-shopping-cart
# fix/78-login-error
# refactor/92-cleanup-auth
4.4. Bước 3: Code và Commit
# Commit message tham chiếu issue
git commit -m "feat: add login form UI
Refs #123"
git commit -m "feat: add login validation
Part of #123"
# Commit cuối cùng để close issue tự động
git commit -m "feat: complete login feature
Closes #123"
Từ khóa auto-close issue:
Closes #123Fixes #123Resolves #123
4.5. Bước 4: Tạo PR
# PR Title
[FEAT] Add user login feature (#123)
# PR Description
## Related Issue
Closes #123
## What does this PR do?
- Add login form with email/password
- Add form validation
- Integrate with auth API
## How to test
1. Go to /login
2. Enter valid credentials
3. Click Submit
4. Should see dashboard
## Checklist
- [x] Self-reviewed
- [x] Tests added
- [x] Documentation updated
5. Code Review Process
5.1. Quy trình review
┌─────────────────────────────────────────────────────────────────────┐
│ CODE REVIEW PROCESS │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ ┌───────────┐ │
│ │ Author │ │
│ │ tạo PR │ │
│ └─────┬─────┘ │
│ │ │
│ ▼ │
│ ┌───────────┐ ┌───────────┐ ┌───────────┐ │
│ │ CI Check │───▶│ Reviewer │───▶│ Reviewer │ │
│ │ (auto) │ │ review │ │ approve │ │
│ └───────────┘ └─────┬─────┘ └─────┬─────┘ │
│ │ │ │
│ ▼ │ │
│ ┌───────────┐ │ │
│ │ Request │ │ │
│ │ changes │ │ │
│ └─────┬─────┘ │ │
│ │ │ │
│ ▼ ▼ │
│ ┌───────────┐ ┌───────────┐ │
│ │ Author │ │ MERGE │ │
│ │ fix │───▶│ │ │
│ └───────────┘ └───────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────┘
5.2. Checklist cho Author (người tạo PR)
Trước khi request review:
□ Self-review code của mình
□ Test locally
□ CI/CD pass
□ PR description đầy đủ
□ Screenshots nếu có UI changes
□ Không có console.log / debug code
□ Code format đúng
□ Không có conflict với develop
5.3. Checklist cho Reviewer
Khi review:
□ Code có làm đúng yêu cầu không?
□ Logic có hợp lý không?
□ Có bug tiềm ẩn không?
□ Có security issue không?
□ Performance có OK không?
□ Code có readable không?
□ Test coverage đủ chưa?
□ Naming convention đúng chưa?
5.4. Cách comment review
✅ Comment TỐT:
"Đề xuất dùng useMemo ở đây để tránh re-render không cần thiết"
"Logic này có thể bị null pointer nếu user chưa login"
"Có thể extract thành custom hook để reuse"
❌ Comment XẤU:
"Code xấu"
"Sửa lại đi"
"???"
5.5. Thời gian review
┌─────────────────────────────────────────────────────────────────────┐
│ SLA CODE REVIEW │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ PR nhỏ (< 100 lines): Trong 4 giờ làm việc │
│ PR trung bình (< 500): Trong 1 ngày làm việc │
│ PR lớn (> 500): Trong 2 ngày làm việc │
│ │
│ ⚠️ Lưu ý: │
│ - PR càng nhỏ càng được review nhanh │
│ - Chia PR lớn thành nhiều PR nhỏ │
│ │
└─────────────────────────────────────────────────────────────────────┘
6. Xử Lý Conflict Trong Team
6.1. Nguyên tắc quan trọng
┌─────────────────────────────────────────────────────────────────────┐
│ CONFLICT GIẢI QUYẾT Ở FEATURE BRANCH │
│ KHÔNG PHẢI Ở DEVELOP! │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ ✅ ĐÚNG: │
│ feat/login ← merge develop ← resolve conflict │
│ Sau đó merge feat/login → develop (clean) │
│ │
│ ❌ SAI: │
│ Merge feat/login → develop → conflict → sửa trên develop │
│ │
└─────────────────────────────────────────────────────────────────────┘
6.2. Quy trình cập nhật branch
# Trước khi tạo PR, cập nhật branch với develop
# Bước 1: Fetch code mới
git fetch origin
# Bước 2: Merge develop vào feature branch
git checkout feat/login
git merge origin/develop
# Nếu có conflict:
# Bước 3: Resolve conflict
# - Mở file conflict
# - Chọn code đúng
# - Xóa markers <<<<< ===== >>>>>
# Bước 4: Commit merge
git add .
git commit -m "Merge develop into feat/login"
# Bước 5: Push
git push
# Bây giờ PR sẽ không có conflict
6.3. Ai resolve conflict?
Tình huống: feat/A và feat/B cùng sửa file X
Timeline:
1. Dev A tạo PR trước → merge OK
2. Dev B tạo PR sau → có conflict
→ Dev B phải resolve conflict (vì tạo PR sau)
Cách làm:
1. Dev B: git merge origin/develop vào feat/B
2. Dev B: Resolve conflict
3. Dev B: Push
4. PR của Dev B giờ clean
6.4. Khi nào cần họp để resolve?
Cần họp khi:
├── 2 người sửa cùng 1 logic
├── Không biết nên giữ code nào
├── Conflict liên quan đến architecture
└── Cần quyết định của Tech Lead
Không cần họp:
├── Conflict đơn giản (import, format)
├── Rõ ràng nên giữ code nào
└── Chỉ là thêm code, không đè nhau
7. Vai Trò Và Trách Nhiệm
7.1. Cấu trúc team Git
┌─────────────────────────────────────────────────────────────────────┐
│ CẤU TRÚC TEAM GIT │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ │
│ │ Tech Lead │ │
│ │ (Owner) │ │
│ └──────┬──────┘ │
│ │ │
│ ┌──────────────┼──────────────┐ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌───────────┐ ┌───────────┐ ┌───────────┐ │
│ │Git Master │ │Git Master │ │ Senior │ │
│ │(Reviewer) │ │(Reviewer) │ │(Reviewer) │ │
│ └─────┬─────┘ └─────┬─────┘ └─────┬─────┘ │
│ │ │ │ │
│ └──────────────┼──────────────┘ │
│ │ │
│ ┌────────────────┼────────────────┐ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌───────────┐ ┌───────────┐ ┌───────────┐ │
│ │ Developer │ │ Developer │ │ Junior │ │
│ └───────────┘ └───────────┘ └───────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────┘
7.2. Trách nhiệm từng vai trò
Tech Lead / Owner
Quyền:
├── Merge vào main
├── Approve PR vào main
├── Setup branch protection
├── Cấu hình CI/CD
└── Force push (nếu cần - hiếm khi)
Trách nhiệm:
├── Review PR quan trọng
├── Quyết định merge vào main
├── Giải quyết conflict phức tạp
└── Training team về Git
Git Master / Reviewer
Quyền:
├── Approve PR vào develop
├── Merge vào develop
└── Review code
Trách nhiệm:
├── Review PR của team
├── Đảm bảo code quality
├── Hỗ trợ Junior resolve conflict
└── Giữ history sạch
Developer
Quyền:
├── Tạo branch từ develop
├── Push lên feature branch
└── Tạo PR
Trách nhiệm:
├── Tuân thủ quy trình
├── Self-review trước khi request review
├── Resolve conflict trên feature branch
└── Update branch thường xuyên
Junior Developer
Quyền:
├── Tạo branch từ develop
├── Push lên feature branch
└── Tạo PR
Trách nhiệm (thêm):
├── Hỏi khi không chắc chắn
├── Pair với Senior khi resolve conflict
└── Học từ code review feedback
📋 Quick Reference
Quy trình chuẩn
1. Nhận Issue #123
2. git checkout develop && git pull
3. git checkout -b feat/123-feature-name
4. Code & commit
5. git push -u origin feat/123-feature-name
6. Tạo PR → develop
7. Request review
8. Address feedback (nếu có)
9. Reviewer approve
10. Merge (bởi Git Master)
11. Xóa branch
Commands hay dùng
| Tình huống | Lệnh |
|---|---|
| Cập nhật develop | git checkout develop && git pull |
| Tạo feature branch | git checkout -b feat/xxx |
| Cập nhật từ develop | git merge origin/develop |
| Push lần đầu | git push -u origin feat/xxx |
| Xóa branch local | git branch -d feat/xxx |
| Xóa branch remote | git push origin --delete feat/xxx |
✅ Checklist Team Workflow
□ Không push trực tiếp vào main/develop
□ Luôn tạo branch cho mỗi task
□ Đặt tên branch theo quy ước
□ Cập nhật branch với develop trước khi tạo PR
□ Self-review trước khi request review
□ Xóa branch sau khi merge
➡️ Bước Tiếp Theo
Học file 05-branching-strategy.md - Chiến lược Branch chi tiết
Tài liệu thuộc bộ Git Training Documentation v1.0