Đăng ngày 7 phút đọc
Hướng dẫn Git toàn diện cho người mới
Hướng dẫn toàn diện về Git cho người mới, bao gồm branch, rebase, merge và workflow thực tế.
- Git
- GitHub
Trong bài này
Tôi viết bài này vì hai lý do: để có một tài liệu cá nhân có thể quay lại khi cần, và để có thứ gì đó cụ thể chia sẻ với bạn bè và đồng nghiệp đang bắt đầu học Git.
Một điều trước: học CLI. Không phải vì GUI tool tệ — một số thực sự rất tốt — mà vì CLI buộc bạn phải hiểu điều gì đang thực sự xảy ra. Khi có gì đó đi sai (và sẽ có), biết các lệnh là sự khác biệt giữa fix trong 30 giây và mất một tiếng ngồi không hiểu gì.
1. Cài Đặt Git & Cấu Hình Tài Khoản
Tải về
Giữ mặc định khi cài trừ khi bạn biết mình muốn thay đổi gì. Restart terminal sau khi cài xong.
git --version
git config --global user.name "Tên của bạn"
git config --global user.email "email@cuaban.com"
git config --listFlag --global áp dụng cài đặt này cho tất cả repository trên máy. Git gắn tên và email của bạn vào mỗi commit — nếu không khớp với tài khoản GitHub, commit sẽ không hiện đúng trong profile của bạn.
2. Các Khái Niệm Cốt Lõi
Trước khi chạm vào bất kỳ lệnh nào, hãy hiểu bạn đang làm việc với gì:
- Commit — một snapshot đã lưu của code tại một thời điểm cụ thể.
- Branch — một nhánh phát triển độc lập. Bạn có thể làm tính năng trong branch riêng mà không động đến bất cứ thứ gì khác.
- Remote — bản sao của repository trên server (GitHub, GitLab, v.v.).
- Staging Area — vùng chuẩn bị. File đi vào đây trước khi được commit.
- Push — gửi commit local lên remote.
- Pull — lấy commit từ remote về máy local.
- Merge — kết hợp thay đổi từ một branch vào branch khác, tạo ra merge commit.
- Rebase — replay lại các commit của branch bạn lên trên commit mới nhất của branch khác, giữ lịch sử thẳng.
Branch là cách bạn tổ chức công việc. Branch main giữ ổn định. Mọi thứ khác có branch riêng.
3. Kiểm Tra Tình Trạng
git status # có gì thay đổi, đã stage, chưa track
git branch # liệt kê branch local, * đánh dấu branch hiện tạiTrước khi tạo branch mới hay checkout, luôn chạy git status trước. Biết mình đang ở đâu trước khi di chuyển tránh được rất nhiều nhầm lẫn.
4. Vòng Lặp Cốt Lõi: Add → Commit → Push → Pull
Đây là những gì bạn sẽ làm hàng chục lần mỗi ngày.
Stage thay đổi
git add .Stage tất cả file đã thay đổi. Dùng git add <tên-file> nếu chỉ muốn stage file cụ thể.
Commit
git commit -m "Mô tả rõ ràng về những gì bạn thay đổi"Viết commit message có nghĩa. "fix bug" không cho bạn biết gì sau 3 tháng. "fix tổng giỏ hàng không cập nhật khi thay đổi số lượng" thì thực sự hữu ích.
Push
git push origin mainLần push đầu tiên của branch mới cần set upstream:
git push -u origin <tên-branch>Sau đó chỉ cần git push là đủ.
Pull
git pull origin mainPull trước khi bắt đầu làm việc. Pull trước khi push. Pull thường xuyên. Điều này giữ bản local của bạn đồng bộ và tránh những conflict mất cả buổi chiều.
5. Làm Việc Với Branch
Tạo và chuyển sang branch mới
git checkout -b feature-loginLệnh này tạo branch và chuyển sang nó trong một bước.
Chuyển sang branch đã tồn tại
git checkout feature-login
# hoặc
git switch feature-loginCommit và push trên branch
git add .
git commit -m "Thêm validation cho form đăng nhập"
git push origin feature-loginĐừng bao giờ commit thẳng vào main cho bất cứ thứ gì quan trọng. Tạo branch, làm việc, merge vào.
6. Rebase vs Merge
Đây là chỗ mọi người hay bị nhầm lẫn. Cả hai đều kết hợp thay đổi — chỉ là theo cách khác nhau.
Tình huống ban đầu:
main: A──B──C──G
feature-x: B──D──E──FRebase
git checkout feature-x
git fetch origin
git rebase origin/mainKết quả:
main: A──B──C──G
feature-x: D'──E'──F'Các commit của branch (D, E, F) được replay lại trên commit mới nhất của main. Lịch sử trông thẳng — một đường thẳng. D', E', F' là commit mới với cùng thay đổi nhưng hash khác.
Dùng rebase khi: bạn muốn lịch sử sạch, dễ đọc. Tốt cho feature branch trước khi merge vào main.
Merge
git checkout feature-x
git merge origin/mainKết quả:
main: A──B──C──G
feature-x: B──D──E──F──MMerge tạo commit M mới kết hợp cả hai lịch sử. Các commit gốc giữ nguyên.
Dùng merge khi: bạn muốn giữ toàn bộ lịch sử những gì đã xảy ra và khi nào.
Lưu ý: Đừng bao giờ rebase commit đã push lên remote branch dùng chung. Rebase viết lại commit hash — nếu người khác đã có những commit đó, nó tạo ra conflict.
7. Pull Request
Sau khi push feature branch, mở Pull Request trên GitHub để merge vào main.
git push origin feature-loginVào GitHub → repo của bạn → sẽ thấy banner "Compare & pull request". Tạo PR, thêm mô tả, review, merge.
Sau khi merge:
git branch -d feature-login # xóa local
git push origin --delete feature-login # xóa trên remoteDọn dẹp branch sau khi merge. Branch cũ không dùng nữa là noise.
8. Các Workflow Thường Gặp
Thêm project local có sẵn lên GitHub
cd /duong-dan/den/project
git init
git add .
git commit -m "Initial commit"
git branch -M main
git remote add origin git@github.com:username/ten-repo.git
git push -u origin mainTạo project mới từ đầu
mkdir my-project && cd my-project
git init
echo "# My Project" >> README.md
git add README.md
git commit -m "Initial commit"
git branch -M main
git remote add origin git@github.com:username/my-project.git
git push -u origin mainClone repo có sẵn
git clone git@github.com:username/ten-repo.git
cd ten-repo9. Giữ Feature Branch Cập Nhật
Trong khi bạn làm việc trên branch, main vẫn tiếp tục thay đổi. Cập nhật branch thường xuyên.
Với rebase (sạch hơn):
git checkout feature-login
git fetch origin
git rebase origin/mainVới merge (an toàn hơn nếu có người khác cùng dùng branch):
git checkout feature-login
git merge origin/mainLàm điều này trước khi mở PR. Merge branch lỗi thời vào main là cách conflict xảy ra.
10. Giải Quyết Conflict
Khi Git không thể tự động merge hai phiên bản của một file, nó đánh dấu conflict:
<<<<<<< HEAD
phiên bản của bạn
=======
phiên bản của họ
>>>>>>> origin/mainMở file, quyết định phiên bản đúng là gì, xóa các dấu conflict, sau đó:
git add <tên-file>
git rebase --continue # nếu đang rebase
git commit # nếu đang mergeConflict trông đáng sợ vài lần đầu. Thực ra rất thẳng thắn khi bạn hiểu mình đang nhìn gì.
11. Thói Quen Giúp Tránh Vấn Đề
- Pull trước khi bắt đầu làm việc, mỗi lần.
- Commit nhỏ và tập trung — một thay đổi logic mỗi commit.
- Đặt tên branch mô tả:
feature/user-auth,bugfix/cart-total,hotfix/broken-image. - Cập nhật feature branch từ main trước khi mở PR.
- Xóa branch sau khi merge.
- Không bao giờ force-push lên
mainhay branch dùng chung.
12. Tóm Tắt Trực Quan
main: A──B──C──G
feature-x: B──D──E──F
Sau rebase:
main: A──B──C──G
feature-x: D'──E'──F'
Sau merge:
main: A──B──C──G──M
↑
merge feature-x vàoĐó là mental model. Lưu ở đâu đó để tham khảo khi mọi thứ trở nên rối rắm.