🐙 Git và GitHub CLI

Multilingual DevOps cheat sheet: Linux, Docker, Git, Kubernetes, Helm, Terraform, practical scenarios & templates.
Được xuất bản

31 tháng 8, 2025

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 functionName trong toàn bộ dự án

git grep -n "TODO"

Tìm dòng chứa TODO và hiển thị số dòng (hữu ích cho ghi chú code)

git grep -i "login"

Tìm từ login không phân biệt hoa thường

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 new-feature

git branch -d old-feature

Xóa nhánh local tên old-feature

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 main

git checkout -b new-branch

Tạo và chuyển sang nhánh mới new-branch

git switch Chuyển nhánh (thay thế đơn giản cho checkout)
git switch main

Chuyển sang nhánh main

git switch -c feature-x

Tạo và chuyển sang nhánh mới feature-x

git switch new-feature

Chuyển sang nhánh hiện có new-feature

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 new-feature vào nhánh hiện tại

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 main

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ừ A (không bao gồm) đến B (bao gồm)

📡 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 origin

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 main vào nhánh hiện tại

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 main local lên remote origin

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 origin nhưng chưa áp dụng

git fetch origin main

Fetch chỉ nhánh main từ remote

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 (origin/main), ghi đè xung đột

📦 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 v1.0 với thông điệp (lưu dưới dạng đối tượng Git đầy đủ, thích hợp cho phát hành)

git tag -d v1.0

Xóa tag local tên v1.0 (không ảnh hưởng remote)

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: v1.0) lên remote

git push origin :refs/tags/v1.0

Xóa tag remote v1.0 (lưu ý cú pháp dấu hai chấm)

🛠️ 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 main trỏ tới đâu một tuần trước

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 pull trong từng submodule để cập nhật commit mới nhất

git submodule sync --recursive

Đồng bộ URL submodule sau khi thay đổi tệp .gitmodules

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 .tar.gz nén từ HEAD

git archive --format=tar --prefix=project/ HEAD \| gzip > project.tar.gz

Tạo archive .tar.gz nén của dự án hiện tại, chứa tất cả file bên trong thư mục project/

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

gh cho 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 (mytoken.txt)

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 user vào thư mục tên repo

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 workspace/cli

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 feature trong fork monalisa vào nhánh develop

gh repo create Tạo repository GitHub mới từ CLI
gh repo create my-project

Tạo repository mới tên my-project trên GitHub (sẽ có bước nhắc tương tác)

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 upstream

💡 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-branch. Dùng cẩn thận

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