🐙 Git và GitHub CLI
Lệnh Git cơ bản và nâng cao cho quản lý phiên bản, nhánh, repo từ xa, stash, tag và GitHub CLI.
🔹 Lệnh cơ bản
| Lệnh | Ví dụ | Mô tả | 
|---|---|---|
| git add | Thêm tệp vào khu vực staging | |
| git add file.txt | Đưa một tệp cụ thể vào staging cho commit tiếp theo | |
| git add . | Đưa tất cả thay đổi trong thư mục hiện tại và bên dưới vào staging | |
| git add -p | Chọn tương tác các phần của tệp để đưa vào staging (hữu ích cho commit một phần) | |
| git clone | Nhân bản một repository vào thư mục mới | |
| git clone -b branch_name URL | Clone chỉ nhánh được chỉ định (thay vì mặc định) | |
| git clone --depth 1 URL | Clone chỉ commit mới nhất (shallow copy) để tiết kiệm thời gian và dung lượng | |
| git commit | Ghi lại thay đổi vào repository | |
| git commit -m "Initial commit" | Commit với thông điệp mà không cần mở editor | |
| git commit -a -m "Fix bugs" | Stage và commit tất cả tệp đã chỉnh sửa với thông điệp | |
| git commit --amend | Cập nhật commit cuối (đổi thông điệp hoặc thêm thay đổi) | |
| git commit --fixup abc1234 | Tạo commit fixup để squash tự động sau này khi rebase tương tác | |
| git config | Lấy và đặt tùy chọn repo hoặc toàn cục | |
| git config --global user.name "Name" | Đặt username Git toàn cục | |
| git config --global user.email "email@example.com" | Đặt email Git toàn cục | |
| git config --list | Liệt kê tất cả cài đặt Git (tên, email, editor, v.v.) | |
| git diff | Hiển thị thay đổi giữa commit, commit và working tree, v.v. | |
| git diff HEAD | Xem thay đổi kể từ commit cuối (chưa stage) | |
| git diff --staged | Xem thay đổi sẽ có trong commit tiếp theo | |
| git diff --word-diff HEAD~1 | Hiển thị thay đổi ở mức từ | |
| git grep | Tìm kiếm bên trong tệp repository | |
| git grep "functionName" | Tìm tất cả chỗ xuất hiện của  | |
| git grep -n "TODO" | Tìm dòng chứa  | |
| git grep -i "login" | Tìm từ  | |
| git init | Tạo repo Git trống hoặc khởi tạo lại repo hiện có | |
| git init my-project | Khởi tạo repo mới trong thư mục my-project | |
| git init --bare | Khởi tạo repo bare | |
| git log | Hiển thị commit log | |
| git log --oneline | Hiển thị lịch sử commit ở dạng ngắn gọn (một dòng) | |
| git log --graph --all | Hiển thị tất cả nhánh trong biểu đồ trực quan | |
| git log -p --stat | Hiển thị patch và thống kê thay đổi file cho commit | |
| git reset | Bỏ stage file, giữ thay đổi trong working directory | |
| git reset HEAD file.txt | Xóa tệp khỏi staging (giữ chỉnh sửa) | |
| git reset --hard HEAD~1 | Quay lại một commit và xóa tất cả thay đổi (không thể đảo ngược!) | |
| git reset --soft HEAD~1 | Hoàn tác commit cuối nhưng giữ thay đổi để commit lại | |
| git reset --mixed HEAD~1 | Hoàn tác commit nhưng giữ thay đổi chưa stage trong working directory | |
| git show | Hiển thị nhiều loại đối tượng | |
| git show <commit_hash> | Hiển thị thay đổi và thông điệp của commit cụ thể | |
| git show HEAD~1 | Hiển thị commit trước commit hiện tại | |
| git show --stat | Hiển thị tóm tắt thay đổi file cho commit mới nhất | |
| git status | Hiển thị trạng thái working tree | |
| git status -s | Hiển thị trạng thái ở dạng ngắn gọn | |
| git status -b | Hiển thị nhánh hiện tại và trạng thái file | 
🌿 Nhánh và Hợp nhất
| Lệnh | Ví dụ | Mô tả | 
|---|---|---|
| git branch | Tạo, liệt kê hoặc xóa nhánh | |
| git branch new-feature | Tạo nhánh mới tên  | |
| git branch -d old-feature | Xóa nhánh local tên  | |
| git checkout | Chuyển nhánh hoặc khôi phục file từ commit khác | |
| git checkout main | Chuyển sang nhánh  | |
| git checkout -b new-branch | Tạo và chuyển sang nhánh mới  | |
| git switch | Chuyển nhánh (thay thế đơn giản cho checkout) | |
| git switch main | Chuyển sang nhánh  | |
| git switch -c feature-x | Tạo và chuyển sang nhánh mới  | |
| git switch new-feature | Chuyển sang nhánh hiện có  | |
| git merge | Kết hợp thay đổi từ nhánh khác vào nhánh hiện tại | |
| git merge new-feature | Merge nhánh  | |
| git merge --no-ff new-feature | Luôn tạo merge commit (ngay cả khi có thể fast-forward) | |
| git merge --abort | Hủy merge và hoàn tác thay đổi nếu có xung đột | |
| git rebase | Di chuyển hoặc áp dụng lại commit lên commit gốc mới | |
| git rebase main | Reapply commit của nhánh bạn lên trên nhánh  | |
| git rebase -i HEAD~3 | Chỉnh sửa tương tác 3 commit cuối | |
| git rebase --abort | Dừng và hoàn tác rebase đang chạy | |
| git rebase -i --autosquash HEAD~5 | Tự động squash commit được đánh dấu fixup hoặc squash trong rebase tương tác | |
| git cherry-pick | Áp dụng commit cụ thể từ nhánh khác | |
| git cherry-pick <hash> | Áp dụng commit cụ thể (bằng hash) vào nhánh hiện tại | |
| git cherry-pick --continue | Tiếp tục cherry-pick sau khi giải quyết xung đột | |
| git cherry-pick A^..B | Áp dụng dải commit từ  | 
📡 Repository từ xa
| Lệnh | Ví dụ | Mô tả | 
|---|---|---|
| git remote | Quản lý liên kết tới repository từ xa (như GitHub) | |
| git remote -v | Hiển thị tên remote và URL | |
| git remote add origin URL | Thêm repository từ xa tên  | |
| git pull | Tải và tự động merge thay đổi từ nhánh remote | |
| git pull origin main | Fetch và merge thay đổi từ remote  | |
| git pull --rebase origin main | Fetch và rebase nhánh hiện tại trên remote thay vì merge | |
| git push | Đẩy thay đổi local lên repository từ xa | |
| git push origin main | Push nhánh  | |
| git fetch | Tải thay đổi từ remote mà không merge | |
| git fetch origin | Fetch tất cả cập nhật từ remote  | |
| git fetch origin main | Fetch chỉ nhánh  | |
| git fetch --all | Fetch cập nhật từ tất cả remote | |
| git fetch --prune | Dọn nhánh bị xóa — xóa tham chiếu local đến nhánh đã bị xóa trên remote | |
| git fetch --dry-run | Xem trước nội dung sẽ fetch mà không tải về | |
| git fetch origin +main | Cập nhật mạnh mẽ nhánh tracking local ( | 
📦 Stash và Dọn dẹp
| Lệnh | Ví dụ | Mô tả | 
|---|---|---|
| git stash | Lưu tạm thời thay đổi chưa commit (work in progress) | |
| git stash | Lưu tệp đã sửa và staged, sau đó revert working directory về commit cuối | |
| git stash apply | Áp dụng lại stash mới nhất (stash vẫn được giữ) | |
| git stash pop | Áp dụng và xóa stash mới nhất | |
| git stash list | Hiển thị danh sách tất cả stash | |
| git stash branch feature-fix | Tạo nhánh mới và áp dụng stash mới nhất vào đó | |
| git clean | Xóa vĩnh viễn tệp chưa được track (không trong Git) | |
| git clean -f | Xóa tệp chưa track trong thư mục hiện tại | |
| git clean -fd | Xóa tệp và thư mục chưa track | |
| git clean -n | Xem trước cái sẽ bị xóa (dry run an toàn) | 
🏷️ Tag
| Lệnh | Ví dụ | Mô tả | 
|---|---|---|
| git tag | Tạo, liệt kê hoặc xóa tag để đánh dấu mốc cụ thể (như phát hành) | |
| git tag -a v1.0 -m "Version 1.0" | Tạo annotated tag tên  | |
| git tag -d v1.0 | Xóa tag local tên  | |
| git push | Đẩy commit, nhánh và tag từ local lên repository từ xa | |
| git push origin --tags | Push tất cả tag local lên remote (hữu ích sau khi gắn nhiều tag) | |
| git push origin v1.0 | Push một tag cụ thể (vd:  | |
| git push origin :refs/tags/v1.0 | Xóa tag remote  | 
🛠️ Giải quyết xung đột
| Lệnh | Ví dụ | Mô tả | 
|---|---|---|
| git mergetool | Mở công cụ trực quan để giúp giải quyết xung đột merge | |
| git mergetool --tool=meld | Dùng công cụ merge cụ thể (như Meld) để sửa xung đột | |
| git rerere | Để Git ghi nhớ cách bạn đã giải quyết xung đột trước đó | |
| git config --global rerere.enabled true | Bật tự động sử dụng lại cách giải quyết xung đột cũ | |
| git rerere status | Hiển thị file có lưu cách giải quyết xung đột | |
| git rerere diff | Hiển thị thay đổi Git đã lưu cho lần dùng sau | 
⚙️ Lệnh nâng cao
| Lệnh | Ví dụ | Mô tả | 
|---|---|---|
| git bisect | Dùng tìm kiếm nhị phân để tìm commit gây ra bug | |
| git bisect start | Bắt đầu tìm kiếm nhị phân giữa commit tốt và commit lỗi để tìm bug | |
| git bisect bad | Đánh dấu commit hiện tại là “bad” (có bug) | |
| git bisect good <commit> | Đánh dấu commit “good” (không có bug) | |
| git blame | Hiển thị ai là người chỉnh sửa cuối cùng mỗi dòng của tệp, với revision và tác giả | |
| git blame file.txt | Hiển thị tác giả và commit cho từng dòng trong tệp | |
| git blame -L 10,20 file.txt | Hiển thị blame chỉ cho dòng 10 đến 20 | |
| git blame --show-email file.txt | Hiển thị email tác giả cùng với thay đổi | |
| git reflog | Xem và quản lý reflog của di chuyển nhánh và HEAD | |
| git reflog show main@{1.week.ago} | Xem nhánh  | |
| git reflog expire --expire=30.days --dry-run | Xem trước mục reflog cũ hơn 30 ngày có thể xóa (chưa thay đổi gì) | |
| git reflog delete HEAD@{2} | Xóa mục reflog cụ thể (cẩn thận vì có thể ảnh hưởng khôi phục) | |
| git submodule | Thêm, khởi tạo, cập nhật hoặc kiểm tra submodule (repo bên trong repo) | |
| git submodule add URL path | Thêm repo ngoài làm submodule vào đường dẫn chỉ định | |
| git submodule update --init | Khởi tạo và tải tất cả submodule trong repo | |
| git submodule foreach git pull | Chạy  | |
| git submodule sync --recursive | Đồng bộ URL submodule sau khi thay đổi tệp  | |
| git submodule update --remote --merge | Cập nhật submodule lên commit mới nhất từ nhánh remote | |
| git archive | Tạo archive (zip, tar, v.v.) của file từ commit hoặc nhánh cụ thể | |
| git archive --format=zip HEAD > archive.zip | Tạo archive ZIP của file dự án tại HEAD | |
| git archive -o release.tar.gz HEAD | Tạo archive  | |
| git archive --format=tar --prefix=project/ HEAD \| gzip > project.tar.gz | Tạo archive  | |
| git gc | Xóa file không cần thiết và tối ưu repo để tăng hiệu suất | |
| git gc --aggressive | Dọn dẹp và tối ưu toàn diện (có thể chậm nhưng hiệu quả) | |
| git gc --prune=now | Xóa ngay tất cả object không thể truy cập (nguy hiểm nếu không chắc chắn) | |
| git shortlog | Tóm tắt nhanh tác giả và commit của họ | |
| git shortlog -e | Hiển thị danh sách tác giả với email (để phân tích đóng góp) | |
| git shortlog -s -n | Hiển thị số commit của mỗi tác giả, sắp xếp theo số commit | |
| git shortlog -sne | Như trên nhưng kèm tên và email — hữu ích cho theo dõi chi tiết | |
| git revert | Tạo commit mới hoàn tác thay đổi từ commit trước đó mà không viết lại lịch sử | |
| git revert HEAD | Hoàn tác commit cuối bằng cách tạo commit mới đảo ngược thay đổi | |
| git revert <commit_hash> | Hoàn tác commit cụ thể bằng hash, thêm commit mới đảo ngược | 
🐙 GitHub CLI
ghcho phép bạn quản lý GitHub từ terminal.
| Lệnh | Ví dụ | Mô tả | 
|---|---|---|
| gh auth login | Xác thực với máy chủ GitHub để cho phép lệnh CLI tương tác với tài khoản của bạn | |
| gh auth login --with-token < mytoken.txt | Xác thực bằng personal access token được lưu trong tệp ( | |
| gh auth login --hostname enterprise.internal | Xác thực vào máy chủ GitHub Enterprise (không phải github.com) | |
| gh repo clone | Clone một repository GitHub về máy local | |
| gh repo clone user/repo | Clone repository repo thuộc sở hữu  | |
| gh repo clone cli/cli -- --depth=1 | Clone repository nhưng chỉ tải commit mới nhất để nhanh và nhẹ hơn | |
| gh repo clone cli/cli workspace/cli | Clone repository vào thư mục tùy chỉnh  | |
| gh issue list | Liệt kê issue trong repository GitHub, có thể lọc theo tiêu chí khác nhau | |
| gh issue list --assignee "@me" | Liệt kê issue được gán cho bạn | |
| gh issue list --state all | Liệt kê issue bất kể trạng thái (open hoặc closed) | |
| gh issue list --search "error no:assignee sort:created-asc" | Liệt kê issue khớp với “error”, chưa được gán, sắp xếp theo ngày tạo tăng dần | |
| gh pr create | Tạo pull request trên GitHub qua CLI | |
| gh pr create --title "..." | Tạo pull request với tiêu đề cho trước | |
| gh pr create --project "Roadmap" | Liên kết pull request với một dự án GitHub tên “Roadmap” | |
| gh pr create --base develop --head monalisa:feature | Tạo PR từ nhánh  | |
| gh repo create | Tạo repository GitHub mới từ CLI | |
| gh repo create my-project | Tạo repository mới tên  | |
| gh repo create my-project --public --clone | Tạo repository public và clone nó về local | |
| gh repo create my-project --private --source=. --remote=upstream | Tạo repository private từ thư mục hiện tại và thêm remote tên  | 
💡 Git Aliases (Phím tắt hữu ích)
Thiết lập alias tiện lợi để tăng tốc các lệnh Git thường dùng:
git config --global alias.br branch                                       # viết tắt cho: git branch
git config --global alias.ci commit                                       # viết tắt cho: git commit
git config --global alias.co checkout                                     # viết tắt cho: git checkout
git config --global alias.graph "log --oneline --graph --all --decorate"  # biểu đồ lịch sử đẹp
git config --global alias.last "log -1 HEAD"                              # hiển thị commit cuối cùng
git config --global alias.st status                                       # viết tắt cho: git status🚀 Lệnh Git nâng cao cho chuyên nghiệp
| Lệnh | Ví dụ | Mô tả | 
|---|---|---|
| git filter-repo | Một công cụ mạnh mẽ và hiệu quả để viết lại lịch sử Git nhằm xóa hoặc chỉnh sửa file, tác giả hoặc đường dẫn; thay thế git filter-branch với tốc độ và độ an toàn cao hơn | |
| git filter-repo --path secret.txt --invert-paths | Viết lại lịch sử repo hiệu quả để xóa file hoặc thư mục nhạy cảm mà không gặp vấn đề hiệu suất như  | |
| git filter-repo --replace-text replacements.txt | Thay thế hàng loạt chuỗi hoặc mẫu trong toàn bộ lịch sử (ví dụ: loại bỏ thông tin xác thực) | |
| git filter-repo --subdirectory-filter src | Tách lịch sử thư mục con thành một repository mới, giữ nguyên metadata commit | |
| git worktree | Quản lý nhiều working directory liên kết tới một repository, cho phép làm việc song song trên nhiều nhánh mà không cần clone | |
| git worktree add ../feature feature-branch | Tạo working tree bổ sung gắn với cùng repository, cho phép checkout nhánh song song mà không clone | |
| git worktree list | Liệt kê tất cả worktree đang hoạt động, đường dẫn và nhánh liên kết | |
| git worktree remove ../feature | Xóa worktree khi không cần nữa, dọn dẹp working directory an toàn | |
| git replace | Tạo tham chiếu tạm thời thay thế object hiện có, cho phép thao tác lịch sử local không phá hủy để kiểm thử | |
| git replace <old_commit> <new_commit> | Tạm thời thay commit này bằng commit khác trong repo local, hữu ích cho kiểm thử hoặc vá lỗi mà không viết lại lịch sử | |
| git replace --list | Hiển thị tất cả tham chiếu thay thế đang hoạt động | |
| git replace -d <replace_ref> | Xóa tham chiếu thay thế cụ thể để khôi phục hành vi | |
| git stash | Lưu tạm thời thay đổi chưa commit vào stack, cho phép chuyển đổi ngữ cảnh mà không cần commit công việc chưa hoàn thành | |
| git stash push -p | Chọn tương tác các hunk thay đổi để stash, giúp kiểm soát chi tiết cái được lưu | |
| git stash push -m "WIP selective stash" | Tạo stash với thông điệp tùy chỉnh để dễ nhận biết | |
| git stash apply stash@{2} | Áp dụng stash cụ thể từ danh sách stash mà không xóa nó | |
| git rebase | Áp dụng lại commit trên tip gốc khác, giúp giữ lịch sử dự án sạch sẽ, tuyến tính và chỉnh sửa lịch sử tương tác | |
| git rebase --interactive --autosquash | Bắt đầu phiên rebase tương tác tự động sắp xếp và squash commit được đánh dấu fixup hoặc squash | |
| git rebase -i --autosquash HEAD~10 | Tự động sắp xếp và squash commit fixup/squash, làm sạch lịch sử trước khi push | |
| git commit --fixup <commit> | Tạo commit fixup sẽ được autosquash trong rebase tương tác | |
| git commit --squash <commit> | Tạo commit squash để gộp với commit chỉ định khi rebase | |
| git bisect | Công cụ tìm kiếm nhị phân để nhanh chóng xác định commit gây ra bug bằng cách kiểm thử commit liên tiếp và thu hẹp phạm vi | |
| git bisect run | Tự động hóa quá trình bisect bằng script kiểm thử trên mỗi commit để nhanh chóng tìm commit gây bug mà không cần thủ công | |
| git bisect start; git bisect bad; git bisect good v1.0; git bisect run ./test.sh | Tự động hóa bisect bằng script, tăng tốc phát hiện bug | |
| git bisect visualize | Mở công cụ đồ họa để trực quan hóa quá trình bisect | |
| git bisect reset | Thoát chế độ bisect và quay lại HEAD ban đầu | |
| git commit | Ghi thay đổi vào repo với tùy chọn chi tiết cho amend, sign, fixup và tùy chỉnh message để duy trì lịch sử chất lượng | |
| git commit --gpg-sign | Tạo commit được ký bằng khóa GPG để đảm bảo xác minh tính xác thực và tác giả | |
| git commit -S -m "Signed commit" | Ký commit bằng khóa GPG, đảm bảo tính toàn vẹn và xác minh tác giả | |
| git config --global user.signingkey <key_id> | Cấu hình khóa GPG dùng để ký commit toàn cục | |
| git log --show-signature | Xác minh và hiển thị thông tin chữ ký GPG cho commit | |
| git reflog | Giữ log cập nhật HEAD và nhánh, thiết yếu để phục hồi commit bị mất và hiểu rõ di chuyển lịch sử local | |
| git reset --hard HEAD@{3} | Reset nhánh hiện tại về trạng thái trước đó từ reflog để khôi phục hoặc hoàn tác thay đổi | |
| git reflog expire --expire=now --all | Hết hạn ngay tất cả mục reflog, dọn lịch sử reflog (dùng cẩn thận) | 
🧰 Mẹo workflow và Tự động hóa nâng cao
| Chủ đề | Lệnh / Ví dụ | Giải thích & Mẹo chuyên nghiệp | 
|---|---|---|
| Dọn dẹp Repo triệt để | git gc --aggressive --prune=now | Thực hiện garbage collection sâu và prune object không truy cập ngay lập tức để tối ưu repo. Dùng trong thời gian bảo trì | 
| Worktree nhánh song song | git worktree add ../feature-branch feature | Giữ nhiều working tree để phát triển tính năng đồng thời, tránh chi phí clone | 
| Lịch sử sạch, tuyến tính | git rebase -i --autosquash | Trước khi push, rebase tương tác với autosquash để giữ lịch sử sạch và dễ đọc | 
| Commit an toàn | git commit -S | Ký commit bằng GPG để tăng độ tin cậy trong repo chia sẻ, bắt buộc trong nhiều môi trường doanh nghiệp | 
| Bisect tự động | git bisect run ./test-script.sh | Tự động tìm bug bằng script kiểm thử trên mỗi commit trong bisect | 
| Bộ nhớ đệm giải quyết xung đột | git config --global rerere.enabled true | Bật tái sử dụng cách giải quyết xung đột để tăng tốc giải quyết xung đột lặp lại trong rebase hoặc merge | 
| Alias và Hook dùng chung | Lưu alias Git chung và commit hook trong repo chia sẻ hoặc CI pipeline để áp chuẩn nhóm và tăng năng suất | 
Tài nguyên bổ sung
🧠 Mẹo
Đừng cố ghi nhớ tất cả. Hãy dùng --help, khám phá và luyện tập thường xuyên:
git help <command>
git status🌐 Liên kết hữu ích
📘 Tài liệu Git chính thức — hướng dẫn chi tiết cho tất cả lệnh Git:
https://git-scm.com/docs
📙 Learn Git Branching — hướng dẫn trực quan, tương tác để nắm vững khái niệm nhánh:
https://learngitbranching.js.org
📕 Sách Pro Git (miễn phí, của Scott Chacon & Ben Straub):
https://git-scm.com/book
📗 Git Cheatsheet (tài liệu tham khảo ngắn gọn chính thức):
https://education.github.com/git-cheat-sheet-education.pdf