🐙 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