Chuyển tới nội dung chính

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

  1. Tổng Quan Về Team Workflow
  2. Vai Trò Các Branch
  3. Luồng Merge Chuẩn
  4. Quy Trình Từ Issue → PR
  5. Code Review Process
  6. Xử Lý Conflict Trong Team
  7. 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

BranchPush trực tiếpForce pushXóa đượcTạ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 #123
  • Fixes #123
  • Resolves #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ốngLệnh
Cập nhật developgit checkout develop && git pull
Tạo feature branchgit checkout -b feat/xxx
Cập nhật từ developgit merge origin/develop
Push lần đầugit push -u origin feat/xxx
Xóa branch localgit branch -d feat/xxx
Xóa branch remotegit 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