Chuyển đến nội dung
Jok Holk
EN | VI

Đă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.

bash
git --version
git config --global user.name "Tên của bạn"
git config --global user.email "email@cuaban.com"
git config --list

Flag --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

bash
git status       # có gì thay đổi, đã stage, chưa track
git branch       # liệt kê branch local, * đánh dấu branch hiện tại

Trướ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

bash
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

bash
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

bash
git push origin main

Lần push đầu tiên của branch mới cần set upstream:

bash
git push -u origin <tên-branch>

Sau đó chỉ cần git push là đủ.

Pull

bash
git pull origin main

Pull 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

bash
git checkout -b feature-login

Lệnh này tạo branch và chuyển sang nó trong một bước.

Chuyển sang branch đã tồn tại

bash
git checkout feature-login
# hoặc
git switch feature-login

Commit và push trên branch

bash
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──F

Rebase

bash
git checkout feature-x
git fetch origin
git rebase origin/main

Kế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

bash
git checkout feature-x
git merge origin/main

Kết quả:

main:      A──B──C──G
feature-x:    B──D──E──F──M

Merge 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.

bash
git push origin feature-login

Và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:

bash
git branch -d feature-login                    # xóa local
git push origin --delete feature-login         # xóa trên remote

Dọ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

bash
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 main

Tạo project mới từ đầu

bash
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 main

Clone repo có sẵn

bash
git clone git@github.com:username/ten-repo.git
cd ten-repo

9. 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):

bash
git checkout feature-login
git fetch origin
git rebase origin/main

Với merge (an toàn hơn nếu có người khác cùng dùng branch):

bash
git checkout feature-login
git merge origin/main

Là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/main

Mở file, quyết định phiên bản đúng là gì, xóa các dấu conflict, sau đó:

bash
git add <tên-file>
git rebase --continue    # nếu đang rebase
git commit               # nếu đang merge

Conflict 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 main hay 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.