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

03 - Git Workflow Basics: Quy Trình Làm Việc Cá Nhân

Đối tượng: Junior mới onboard Thời gian học: 1 giờ Mục tiêu: Nắm vững quy trình làm việc Git hàng ngày


📖 Mục Lục

  1. Tổng Quan Workflow
  2. Bước 1: Chuẩn Bị Trước Khi Code
  3. Bước 2: Tạo Branch
  4. Bước 3: Code và Commit
  5. Bước 4: Push và Tạo PR
  6. Bước 5: Sau Khi Merge
  7. Xử Lý Tình Huống

1. Tổng Quan Workflow

Sơ đồ quy trình chuẩn

┌─────────────────────────────────────────────────────────────────────┐
│ WORKFLOW CÁ NHÂN │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ ┌───────────┐ ┌───────────┐ ┌───────────┐ ┌───────────┐ │
│ │ 1. PULL │───▶│ 2. BRANCH │───▶│ 3. CODE │───▶│ 4. PUSH │ │
│ │ cập nhật │ │ tạo mới │ │ & commit │ │ & PR │ │
│ └───────────┘ └───────────┘ └───────────┘ └───────────┘ │
│ │ │ │
│ └──────────────────────────────────────────────────┘ │
│ 5. CLEANUP │
│ (sau khi merge) │
│ │
└─────────────────────────────────────────────────────────────────────┘

Nguyên tắc vàng

┌─────────────────────────────────────────────────────────────────────┐
│ 5 NGUYÊN TẮC VÀNG │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 1️⃣ LUÔN pull trước khi bắt đầu làm việc │
│ │
│ 2️⃣ LUÔN tạo branch mới cho mỗi task │
│ │
│ 3️⃣ KHÔNG BAO GIỜ code trực tiếp trên main/develop │
│ │
│ 4️⃣ Commit thường xuyên, message rõ ràng │
│ │
│ 5️⃣ Push và tạo PR, KHÔNG merge tự ý │
│ │
└─────────────────────────────────────────────────────────────────────┘

2. Bước 1: Chuẩn Bị Trước Khi Code

Checklist đầu ngày

# 1. Chuyển về branch chính
git checkout develop
# hoặc
git checkout main

# 2. Lấy code mới nhất
git pull origin develop

# 3. Kiểm tra trạng thái
git status
# Phải thấy: "Your branch is up to date..."

# 4. Xem các branch đang có
git branch -a

⚠️ Lỗi hay gặp: Quên pull

❌ SAI:
$ git checkout develop
$ git checkout -b feature/login ← Tạo branch từ code CŨ!

✅ ĐÚNG:
$ git checkout develop
$ git pull origin develop ← Pull trước!
$ git checkout -b feature/login ← Tạo branch từ code MỚI

3. Bước 2: Tạo Branch

Quy tắc đặt tên branch

<type>/<short-description>

Ví dụ:
feat/user-login
feat/add-shopping-cart
fix/login-validation-error
fix/cart-total-calculation
hotfix/security-patch
TypeDùng khiVí dụ
feat/Tính năng mớifeat/add-payment
fix/Sửa bugfix/login-error
hotfix/Sửa bug khẩn cấphotfix/security-fix
refactor/Cải thiện coderefactor/cleanup-auth
docs/Tài liệudocs/api-guide
test/Thêm testtest/auth-unit-tests

Tạo branch mới

# Cách 1: Tạo và chuyển sang branch mới
git checkout -b feat/user-login

# Cách 2: Tạo branch (không chuyển)
git branch feat/user-login
git checkout feat/user-login

# Cách 3: Dùng switch (Git 2.23+)
git switch -c feat/user-login

Kiểm tra branch

# Xem branch hiện tại
git branch
# Output:
# develop
# * feat/user-login ← Dấu * = branch hiện tại

# Xem tất cả branch (cả remote)
git branch -a

✅ Best practices

✅ Tên ngắn gọn, mô tả được việc đang làm
feat/user-login

❌ Tên quá dài
feat/add-user-login-feature-with-google-oauth-and-remember-me

❌ Tên không rõ nghĩa
feat/abc
fix/bug

❌ Có khoảng trắng hoặc ký tự đặc biệt
feat/user login
feat/user_login!

4. Bước 3: Code và Commit

Quy trình code-commit

┌─────────────────────────────────────────────────────────────────────┐
│ CHU KỲ CODE-COMMIT │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ │
│ ┌────▶│ CODE │────┐ │
│ │ │ (15-30p) │ │ │
│ │ └─────────────┘ │ │
│ │ ▼ │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ COMMIT │◀───────────│ REVIEW │ │
│ │ │ │ git diff │ │
│ └─────────────┘ └─────────────┘ │
│ │
│ → Commit thường xuyên (mỗi 15-30 phút hoặc mỗi task nhỏ) │
│ → Mỗi commit = 1 thay đổi logic │
│ │
└─────────────────────────────────────────────────────────────────────┘

Ví dụ thực tế

# === Bước 1: Code UI ===
# (Viết code giao diện login...)

# Xem đã thay đổi gì
git status
git diff

# Stage và commit
git add src/components/LoginForm.jsx
git commit -m "feat: add login form UI"

# === Bước 2: Code validation ===
# (Thêm validation...)

git status
git diff

git add src/components/LoginForm.jsx
git commit -m "feat: add form validation for login"

# === Bước 3: Code API call ===
# (Thêm gọi API...)

git add src/services/auth.js src/components/LoginForm.jsx
git commit -m "feat: integrate login API"

Khi nào nên commit?

✅ NÊN commit khi:
├── Hoàn thành 1 chức năng nhỏ
├── Code chạy được (không broken)
├── Trước khi thử nghiệm thay đổi lớn
├── Cuối ngày làm việc
└── Trước khi nghỉ trưa

❌ KHÔNG NÊN commit khi:
├── Code đang broken
├── Chưa test
├── Commit quá to (> 500 dòng)
└── Message không rõ ràng

Commit message template

# Format chuẩn
<type>: <mô tả ngắn gọn>

# Ví dụ
feat: add login form with email/password
fix: resolve null error when user not found
refactor: extract validation to separate hook
docs: add API documentation for auth endpoints
test: add unit tests for login validation

Git stash - Lưu tạm khi cần

# Tình huống: Đang code dở, có bug cần fix gấp

# 1. Lưu tạm code đang làm
git stash
# hoặc với message
git stash save "WIP: login form"

# 2. Chuyển sang fix bug
git checkout fix/urgent-bug
# ... fix bug ...
git checkout feat/user-login

# 3. Lấy lại code đang làm
git stash pop

# Xem danh sách stash
git stash list

# Xóa stash cụ thể
git stash drop stash@{0}

5. Bước 4: Push và Tạo PR

Push lên remote

# Push lần đầu (set upstream)
git push -u origin feat/user-login

# Các lần sau
git push

Tạo Pull Request

┌─────────────────────────────────────────────────────────────────────┐
│ TẠO PULL REQUEST │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 1. Vào GitHub/GitLab │
│ │
│ 2. Click "New Pull Request" / "Create Merge Request" │
│ │
│ 3. Chọn: │
│ - Base branch: develop (hoặc main) │
│ - Compare branch: feat/user-login │
│ │
│ 4. Điền thông tin: │
│ - Title: [FEAT] Add user login feature │
│ - Description: Mô tả chi tiết │
│ - Reviewers: Chọn người review │
│ - Labels: feature, in-review... │
│ │
│ 5. Click "Create Pull Request" │
│ │
└─────────────────────────────────────────────────────────────────────┘

PR Description template

## What does this PR do?
Add user login feature with email/password

## Changes
- Add LoginForm component
- Add form validation
- Integrate with auth API
- Add error handling

## How to test
1. Go to /login
2. Enter email and password
3. Click Submit
4. Should redirect to dashboard

## Screenshots (if UI changes)
[Attach screenshots]

## Checklist
- [ ] Code follows style guidelines
- [ ] Self-reviewed
- [ ] Added tests
- [ ] Documentation updated

Sau khi tạo PR

# Nếu reviewer yêu cầu sửa:

# 1. Sửa code theo feedback
# 2. Commit
git add .
git commit -m "fix: address PR feedback"

# 3. Push
git push

# PR tự động cập nhật

6. Bước 5: Sau Khi Merge

Dọn dẹp branch

# 1. Chuyển về branch chính
git checkout develop

# 2. Pull code mới (bao gồm PR vừa merge)
git pull origin develop

# 3. Xóa branch local
git branch -d feat/user-login

# 4. Xóa branch remote (nếu chưa tự xóa)
git push origin --delete feat/user-login

# 5. Dọn các branch đã bị xóa trên remote
git fetch --prune

Script dọn dẹp nhanh

# Xóa tất cả branch đã merge
git branch --merged | grep -v "main\|develop" | xargs git branch -d

Workflow hoàn chỉnh - Ví dụ

# ======= NGÀY 1: BẮT ĐẦU TASK =======

# 1. Cập nhật code
git checkout develop
git pull origin develop

# 2. Tạo branch mới
git checkout -b feat/add-cart

# 3. Code và commit
# ... code ...
git add .
git commit -m "feat: add cart component"
# ... code tiếp ...
git add .
git commit -m "feat: add item to cart"

# 4. Push lên remote
git push -u origin feat/add-cart

# ======= NGÀY 2: TIẾP TỤC =======

# 1. Cập nhật branch hiện tại với develop mới
git checkout develop
git pull origin develop
git checkout feat/add-cart
git merge develop # Merge develop vào branch

# 2. Tiếp tục code
# ... code ...
git add .
git commit -m "feat: calculate cart total"
git push

# ======= NGÀY 3: TẠO PR =======

# 1. Đảm bảo code mới nhất
git checkout develop
git pull origin develop
git checkout feat/add-cart
git merge develop # Giải quyết conflict nếu có
git push

# 2. Tạo PR trên GitHub

# ======= SAU KHI PR MERGED =======

git checkout develop
git pull origin develop
git branch -d feat/add-cart

7. Xử Lý Tình Huống

7.1. Tạo branch nhầm từ branch khác

# Tình huống: Tạo branch từ feat/old thay vì develop

# Cách 1: Nếu chưa commit gì
git checkout develop
git checkout -b feat/correct-branch

# Cách 2: Nếu đã commit
git checkout develop
git cherry-pick abc1234 # Copy từng commit cần thiết

7.2. Commit nhầm vào branch khác

# Tình huống: Commit nhầm vào develop

# 1. Lưu commit hash
git log -1 # Copy hash, vd: abc1234

# 2. Undo commit trên develop
git reset HEAD~1

# 3. Stash changes
git stash

# 4. Tạo branch đúng
git checkout -b feat/correct-branch

# 5. Lấy lại changes
git stash pop
git add .
git commit -m "correct message"

7.3. Cập nhật branch với code mới từ develop

# Cách 1: Merge (an toàn, giữ history)
git checkout feat/my-feature
git merge develop

# Cách 2: Rebase (sạch hơn, nhưng cần cẩn thận)
git checkout feat/my-feature
git rebase develop

# Sau rebase, cần force push
git push --force-with-lease

7.4. Muốn undo commit cuối

# Undo nhưng giữ thay đổi (staging area)
git reset --soft HEAD~1

# Undo nhưng giữ thay đổi (working directory)
git reset HEAD~1

# Undo hoàn toàn (XÓA thay đổi)
git reset --hard HEAD~1 # ⚠️ Cẩn thận!

7.5. File .gitignore không hoạt động

# Nguyên nhân: File đã được track trước khi thêm vào .gitignore

# Giải quyết:
git rm -r --cached node_modules
git add .
git commit -m "chore: remove node_modules from tracking"

📋 Quick Reference

Quy trình 5 bước

1. git checkout develop && git pull
2. git checkout -b feat/xxx
3. (code) → git add . → git commit
4. git push -u origin feat/xxx → Tạo PR
5. (sau merge) → git checkout develop && git pull && git branch -d feat/xxx

Lệnh hay dùng

Tình huốngLệnh
Bắt đầu ngàygit checkout develop && git pull
Tạo branchgit checkout -b feat/xxx
Commitgit add . && git commit -m "message"
Push lần đầugit push -u origin feat/xxx
Cập nhật từ developgit merge develop
Lưu tạmgit stash
Lấy lạigit stash pop

✅ Checklist Workflow

□ Luôn pull trước khi tạo branch mới
□ Đặt tên branch theo quy tắc
□ Commit thường xuyên với message rõ ràng
□ Push và tạo PR, không merge tự ý
□ Dọn dẹp branch sau khi merge

➡️ Bước Tiếp Theo

Học file 04-team-workflow.md - Quy trình làm việc nhóm


Tài liệu thuộc bộ Git Training Documentation v1.0