Git Command

Note về cách dùng git command

Cấu hình

Cấu hình các thông tin khi cài git lần đầu.

git config --global user.name "username"
git config --global user.email "email"
git config --global init.defaultBranch main

💡Cấu hình editor cho commit, rebase, git sẽ mở editor này options: "code --wait, vim, nano"

git config --global core.editor "vim"

Xem lại danh sách Config

git config --list --global

Khởi tạo local repo

Lệnh này tạo thư mục .git bên trong thư mục hiện tại. Thư mục hiện thành một kho lưu trữ Git

git init

Kết nối với kho lưu trữ từ xa (remote)

URL có thể là đường dẫn một thư mục Git

git clone <URL_của_kho_lưu_tr>

Ví dụ clone 1 repo từ GitHub

git clone https://github.com/nguyenvana/my-awesome-project.git

Đổi tên branch local (master sang main)

git branch -m master main

0) Khởi tạo & Remote

# Tạo repo mới (chọn tên nhánh cho thống nhất: main hoặc master)
git init -b main

# Thêm remote
git remote add origin <REMOTE_URL>

# Push lần đầu, đặt upstream
git push -u origin main

1) Staging & Commit

# Thêm tất cả file mới/sửa vào staging
git add .

# Thêm file cụ thể
git add path/to/file.ext

# Commit
git commit -m "message"

# Shorthand cập nhật *chỉ file đã được track*
git commit -a -m "message"   # Không thêm file mới!

2) Sửa commit cuối (amend)

git add file2.txt
git commit --amend --no-edit   # giữ nguyên message
git commit --amend -m "new message"

Chỉ dùng khi commit đó chưa push. Nếu đã push → cân nhắc --force-with-lease.

3) Xem lịch sử & khác biệt

git log --oneline                  # gọn 1 dòng/commit
git log -n 5                       # 5 commit gần nhất
git log --graph --oneline --decorate --all   # sơ đồ nhánh

git diff                           # khác biệt chưa staged
git diff --staged                  # khác biệt đã staged
git diff <A>...<B>                 # khác biệt của B so với merge-base(A,B)
git diff --name-status <A>...<B>   # chỉ danh sách file

4) Branch căn bản

# Tạo nhánh & chuyển sang
git checkout -b feature-xyz
# (Git mới) git switch -c feature-xyz

# Làm việc → add/commit
git add .
git commit -m "feat: ..."

# Push nhánh mới
git push -u origin feature-xyz

5) Merge (kết nhánh)

# Về main và cập nhật
git checkout main
git pull origin main

# Merge feature vào main
git merge feature-xyz      # nếu conflict → sửa file, rồi:
git add .
git commit -m "resolve conflicts"

git push origin main

6) Rebase (làm thẳng lịch sử)

Mục tiêu: “phát lại” commit của nhánh đang làm trên đỉnh main.

git checkout feature-xyz
git fetch origin
git rebase origin/main

# Nếu conflict:
#   1) sửa file
git add .
git rebase --continue
#   2) nếu muốn bỏ rebase:
git rebase --abort

Phản biện: Đang rebase không dùng git pull. Kết thúc sạch rồi mới git push. Nếu nhánh đã push trước đó, sau rebase có thể cần:

git push --force-with-lease

Dùng rebase trên nhánh cá nhân. Nhánh shared thì ưu tiên merge.

7) Khôi phục & quay lui

7.1) Khôi phục file lỡ xóa/chỉnh (chưa commit)

# Cách mới (khuyến nghị, Git ≥2.23)
git restore path/to/a.txt            # về lại từ HEAD
git restore --staged path/to/a.txt   # bỏ staging

# Cách cũ
git checkout -- path/to/a.txt

7.2) Reset (di chuyển HEAD về commit trước)

# Quay về commit trước, giữ thay đổi ở working dir (default: --mixed)
git reset HEAD~1

# Giữ cả staging (để commit lại ngay)
git reset --soft HEAD~1

# XÓA sạch thay đổi ở working + staging (nguy hiểm)
git reset --hard HEAD~1

Dùng --hard mất dữ liệu chưa commit. Nếu đã push, dùng git revert an toàn hơn:

git revert <commit_sha>

8) Đồng bộ remote

git fetch origin          # chỉ tải ref/obj, không merge
git pull origin main      # fetch + merge
git pull --rebase         # fetch + rebase (lịch sử thẳng)
git push origin <branch>

9) Xử lý conflict: Merge vs Rebase

  • Trong merge:

    1. git merge <branch>

    2. sửa conflict → git add .

    3. git commit (hoặc git merge --continue trên Git mới)

  • Trong rebase:

    1. git rebase <base>

    2. sửa conflict → git add .

    3. git rebase --continue

    4. hủy rebase: git rebase --abort

Đừng chạy git pull rồi lại git rebase --continue. Hai quy trình khác nhau.

10) Cherry-pick & Stash

# Lấy 1 commit cụ thể đưa sang nhánh hiện tại
git cherry-pick <commit_sha>

# Lưu thay đổi tạm thời
git stash
git stash list
git stash pop      # lấy ra và xóa entry
git stash apply    # lấy ra nhưng giữ entry

Cherry-pick commit chưa ổn định có thể gây xung đột dây chuyền. Stash nhiều lớp dễ rối — đặt message: git stash push -m "desc".

11) Các lệnh “tà đạo” (cân nhắc kỹ)

  • git push --force: ghi đè remote. Thay bằng --force-with-lease để không đè mất việc của người khác.

  • git rebase -i trên nhánh đã share: chỉ làm khi mọi người đồng thuận.

  • git reset --hard: tránh dùng trên nhánh share; local thì luôn chắc chắn đã backup.

  • git reflog delete, git gc: có thể làm khó việc cứu commit. Trước khi “dọn rác”, hãy chắc chắn team không cần các ref cũ.

12) Mẫu quy trình “sạch” khi làm feature

# Tạo nhánh từ main mới nhất
git checkout main
git pull --ff-only
git switch -c feat/x

# Làm việc → commit nhỏ, rõ
git add -p
git commit -m "feat(x): ..."

# Thường xuyên đồng bộ base
git fetch origin
git rebase origin/main    # hoặc merge nếu team policy

# Push và mở PR
git push -u origin feat/x

Last updated