Cách Sử Dụng Git
Hiểu về version control và Git
Git là để cho version control trong lập trình. Git giúp theo dõi mọi thay đổi trong code, ai sửa gì, khi nào, cho phép làm việc nhóm hiệu quả.
Ý tưởng lõi: Version control giống như footprint của code, hay lịch sử chỉnh sửa của Google Docs.
Version Control Là Gì?
Tưởng tượng mình làm file báo cáo. Mình có thể lưu kiểu:
baocao_v1.docxbaocao_v2_final.docxbaocao_v2_final_final.docx
Loạn, lằng nhằng. Version control giải quyết bằng cách:
- Theo dõi mọi thay đổi tự động
- Cho phép quay lại bất kỳ phiên bản nào
- Nhiều người làm việc cùng lúc được
- Biết ai sửa gì, khi nào
Git Là Gì?
Git là hệ thống version control phổ biến nhất. Nó chạy trên máy mình và theo dõi thay đổi trong một thư mục (gọi là "repository" hay "repo").
| Thuật ngữ | Ý nghĩa |
|---|---|
| Repository (Repo) | Thư mục chứa file được Git theo dõi |
| Commit | Một snapshot lưu lại các thay đổi tại một thời điểm |
| Branch | Những "nhánh" (phiên bản) của repository được rẽ nhánh từ nhánh chính (tưởng tượng như timeline trong multi-universe của Marvel) |
| Merge | Gộp các branch lại để đồng bộ |
| Clone | Sao chép một repo về máy |
| Pull | Lấy thay đổi mới nhất từ remote (một repo được lưu trên server như Github) |
| Push | Đẩy thay đổi của bạn lên remote |
Quy Trình Git Cơ Bản
Quy trình hoạt động của Git nhìn như này:
Máy Của Bạn GitHub (Remote)
┌─────────────────┐ ┌─────────────────┐
│ Working Files │ │ │
│ ↓ │ │ Repository │
│ Staging Area │ push → │ │
│ ↓ │ ← pull │ │
│ Local Commits │ │ │
└─────────────────┘ └─────────────────┘
Thao tác ở terminal:
# 1. Xem có gì thay đổi
git status
# 2. Stage những thay đổi muốn lưu
git add . # Thêm tất cả các file vào staging area
git add specific-file.js # Thêm một file
# 3. Commit kèm message
git commit -m "Add login feature" # "-m" là viết tắt của "message", dấu "" đằng sau là nơi viết nội dung commit
# 4. Push lên GitHub
git push
Branches
Branch (cành, nhánh) cho phép mình làm feature mà không ảnh hưởng code chính.
Tưởng tượng mình có một ứng dụng hoàn chỉnh, có CI/CD từ branch main của Github repo lên một server production như Railway hay Vercel. Mình muốn thêm tính năng mới, ví dụ như hệ thống đăng nhập. Con đường số 1 là code trực tiếp trên main. Đây là con đường rất nguy hiểm, ví dụ như bạn commit và push trong lúc làm việc. Khi có lỗi bất ngờ phát sinh, mà chưa qua review rõ ràng, thì ứng dụng production sẽ bị ảnh hưởng ngay lập tức.
Ở mặt khác, giả sử mình làm việc trên không chỉ một mà nhiều feature:
- login
- admin dashboard
- payment gateway
Mỗi feature mình giao cho một người, và đồng thời cả 3 người đều viết code và push lên cùng 1 nhánh main. Chắc chắn là sẽ có conflict xảy ra, và khi đó sẽ ảnh hưởng trực tiếp lên app đang chạy ổn định trên production.
Thay vào đó, mình tạo một branch mới tên feature/add-login, và các branch khác cho từng tính năng mới rồi làm việc trên đó. Khi nào hoàn thành, mình sẽ push lên trên branch đó để qua review và testing kỹ càng. Khi nào đã chắc chắn, ổn định rồi, mình merge lại với branch main để tính năng mới được xuất hiện trên production.
Branch Hoạt Động Như Thế Nào
main: A → B → C → D → E
↘
feature: X → Y → Z
↘
merge → F
Cách đặt tên Branch của Team AI
Để giúp cho việc quản lý branch dễ dàng hơn, mình tuân theo quy tắc đặt tên branch như sau:
| Branch | Mục đích |
|---|---|
main | Code production, luôn deploy được |
feature/xxx | Feature mới đang phát triển |
fix/xxx | Sửa bug |
experiment/xxx | Thử nghiệm cách tiếp cận mới |
Ví dụ:
feature/add-login: Thêm hệ thống đăng nhậpfix/payment-bug: Sửa lỗi thanh toánexperiment/new-ui: Thử giao diện mới
Các command về Branch
# Tạo và chuyển sang branch mới
git checkout -b feature/add-login
# Chuyển sang branch có sẵn. Ví dụ đang ở branch feature/add-login và muốn chuyển qua main:
git checkout main
# Xem tất cả branch của repo
git branch
# Xóa branch (-d là delete)
git branch -d feature/add-login
Các Tình Huống Thường Gặp
Lỡ Sửa Nhầm Branch
Mình code 1 tí rồi nhận ra là mình lẽ ra phải code trên branch feature/add-login thay vì main. Lúc đó, mình không thể xoá toàn bộ folder rồi clone lại repo, cũng không thể bỏ hết các thay đổi rồi làm lại từ đầu được. Khi đó:
# Cất tạm thay đổi
git stash
# Chuyển sang branch đúng (Chuyển sang feature/add-login từ main)
git checkout feature/add-login
# Lấy lại thay đổi đã cất
git stash pop
Muốn Hoàn Tác Commit Cuối
# Hoàn tác commit nhưng giữ thay đổi
git reset --soft HEAD~1
# Hoàn tác commit và xóa luôn thay đổi (NGUY HIỂM)
git reset --hard HEAD~1
Bị Merge Conflict
Khi Git không tự merge được:
- Mở file bị conflict
- Tìm các dấu conflict:
<<<<<<< HEAD phần code cũ ======= thay đổi mới bị conflict >>>>>>> branch-name - Sửa lại, giữ phần mình muốn
- Xóa các dấu conflict
git add .vàgit commit
Muốn Xem Có Gì Thay Đổi
# Xem thay đổi chưa commit
git diff
# Xem lịch sử commit
git log --oneline
# Xem ai sửa dòng nào
git blame filename.js
Best Practice
Commit Message
Commit message là thông điệp để giao tiếp giữa những người làm việc trên cùng một repo. Một commit message tốt giúp người khác (và cả mình trong tương lai) hiểu được mục đích của thay đổi. Phần này là bắt buộc cần phải thực hiện chỉn chu
| Tốt | Như đấm vào mắt |
|---|---|
| "Add keyword export CSV functionality" | "update" |
| "Fix clustering timeout for large datasets" | "fix bug" |
| "Refactor API client error handling" | "changes" |
Tần Suất Commit
- Commit thường xuyên: Từng phần nhỏ, logic
- Push đều đặn: Đừng để mất công
- Mỗi commit một việc: Dễ review và revert hơn
Quick Reference
| Tôi muốn... | Lệnh |
|---|---|
| Xem trạng thái | git status |
| Lưu thay đổi | git add . && git commit -m "message" |
| Upload lên GitHub | git push |
| Lấy thay đổi mới nhất | git pull |
| Tạo branch | git checkout -b branch-name |
| Chuyển branch | git checkout branch-name |
| Xem lịch sử | git log --oneline |
| Hoàn tác commit cuối | git reset --soft HEAD~1 |