Git toàn tập

- Giới thiệu
- Chức năng chính của Git
- Git có bao nhiêu lệnh và làm sao để tự tra cứu?
- Các câu lệnh thường gặp
- Nhóm 1: Khởi tạo và thiết lập cấu hình
- Nhóm 2: Làm việc với các thay đổi (Lệnh dùng hàng ngày)
- Nhóm 3: Đồng bộ với Remote Server (GitHub/GitLab)
- Nhóm 4: Phân nhánh, Di chuyển và Phục hồi (Branching, Switching & Restoring)
- Nhóm 5: Các lệnh nâng cao chuyên xử lý tình huống
- Xóa nhánh (Local & Remote)
- git rebase <tên_nhánh>
- git cherry-pick
- git stash (Tạm cất code đang dang dở)
- git log (Xem lịch sử commit)
- git diff (So sánh sự thay đổi)
- git reflog
- git reset
- git revert
- git bisect (Tìm kiếm nhị phân tìm bug)
- git mv (Đổi tên / Di chuyển file)
- git rm (Xóa file khỏi Git)
- git gui & git citool
- Áp dụng vào quy trình làm việc
- Lời kết
Khi bắt đầu học lập trình hoặc tham gia vào các dự án thực tế, bạn sẽ nghe nhắc rất nhiều đến khái niệm kiểm soát phiên bản. Vậy cụ thể hệ thống này hoạt động ra sao? Hãy cùng bắt đầu với những khái niệm cơ bản nhất.
Giới thiệu
- Git là gì? Git là Hệ thống quản lý phiên bản phân tán (Distributed Version Control System – DVCS) phổ biến nhất hiện nay. Nó giúp bạn ghi lại lịch sử thay đổi của các file trong dự án để bạn có thể khôi phục lại bất kỳ phiên bản nào khi cần.
- Phân biệt Git và GitHub/GitLab/Bitbucket: Git là công cụ chạy trên máy cục bộ (local), còn GitHub/GitLab/Bitbucket là dịch vụ lưu trữ mã nguồn trên đám mây (remote) sử dụng Git để cả team cùng upload code lên làm chung.
- Các phần mềm giao diện (Git GUI Tools): Nếu sợ màn hình dòng lệnh (Terminal) đen xì, bạn có thể cài thêm các phần mềm giao diện như GitHub Desktop, Sourcetree, hoặc TortoiseGit. Đây chỉ là “lớp áo” đồ họa giúp bạn bấm chuột thao tác Git (commit, push, pull) cho nhanh và trực quan chứ không thay thế Git. Bạn có thể tham khảo thêm các phần mềm khác tại https://git-scm.com/tools/guis.
- Các công cụ tương tự Git: Ngoài Git ra, thế giới công nghệ còn có các hệ thống khác như Mercurial (giống Git nhưng ít phổ biến hơn), SVN (hệ thống tập trung thường dùng ở ngân hàng vì phân quyền chặt) hay Perforce (ông trùm trong ngành làm game chuyên trị file đồ họa siêu nặng).
Chức năng chính của Git
- Quản lý lịch sử: Theo dõi ai đã sửa gì, sửa khi nào và lý do sửa.
- Làm việc nhóm hiệu quả: Cho phép nhiều người cùng code trên một dự án mà không sợ đè dữ liệu của nhau nhờ cơ chế phân nhánh (Branching).
- Thử nghiệm an toàn: Bạn có thể tạo nhánh mới để thử nghiệm tính năng, nếu hỏng chỉ cần xóa nhánh đó đi mà không ảnh hưởng đến mã nguồn chính.
Git có bao nhiêu lệnh và làm sao để tự tra cứu?
Git là một công cụ cực kỳ đồ sộ với hơn 100 câu lệnh chính thức (bao gồm cả các lệnh cốt lõi hằng ngày và các lệnh hệ thống cấp thấp). Tuy nhiên, thực tế đi làm bạn chỉ cần nhớ và dùng quanh quẩn khoảng 15 – 20 lệnh phổ biến (đã được mình tổng hợp chi tiết ở bên dưới).
Mỗi câu lệnh của Git thường đi kèm các cờ hiệu (Flags) – đây là các ký tự viết tắt đi sau dấu gạch ngang (như -m, -d, --hard) nhằm thay đổi cách thức hoạt động của lệnh đó.
# Cách 1: Xem nhanh danh sách các lệnh phổ biến nhất git help # Xem toàn bộ các lệnh thêm flag -a hoặc --all git help -a git help --all # Cách 2: Xem nhanh các cờ (flags) đi kèm của một lệnh cụ thể (Rất khuyên dùng!) git <tên_lệnh> -h # Ví dụ: Xem nhanh lệnh commit có những cờ nào đi kèm git commit -h # Cách 3: Mở trang tài liệu hướng dẫn chi tiết (Manual Page) trên trình duyệt git help <tên_lệnh> # Hoặc sử dụng cờ --help sau tên lệnh (kết quả tương tự cách trên) git <tên_lệnh> --help # Ví dụ: Mở trang tài liệu siêu chi tiết của lệnh commit git help commit git commit --help
Để xem chi tiết hơn danh sách các câu lệnh của Git có thể tham khảo tại https://git-scm.com/docs.
Các câu lệnh thường gặp
Dưới đây mình sẽ liệt kê một số các lệnh cơ bản của Git từ lúc bắt đầu đến khi đẩy code lên server. Dựa vào chức năng của nó có thể gom nhóm thành các nhóm sau:
Nhóm 1: Khởi tạo và thiết lập cấu hình
git config
Trước khi bắt đầu, bạn cần dùng git config để cấu hình cho Git biết bạn là ai:
# Thiết lập thông tin user và email mới cho mọi dự án trên máy tính của bạn git config --global user.name "Tên của bạn" git config --global user.email "email_cua_ban@example.com" # Nần bạn cần thiết lập riêng cho một dự án đơn lẻ (như dự án công ty), dùng --local thay vì --global git config --local user.name "User Cong Ty" git config --local user.email "username@company.com"
git credential
Khi bạn đổi mật khẩu GitHub/GitLab nhưng máy tính vẫn nhớ mật khẩu cũ và báo lỗi truy cập, việc sử dụng lệnh xóa credential sẽ ép Git phải hiển thị lại hộp thoại đăng nhập mới để bạn điền lại từ đầu.
# Xóa mật khẩu/Token cũ đã lưu trên máy để Git hỏi lại cái mới # Hữu ích khi bạn đổi mật khẩu GitHub hoặc đổi sang tài khoản khác mà bị lỗi từ chối quyền git credential-manager reject # Hoặc nếu dùng lệnh cốt lõi của Git để xóa bộ nhớ đệm credentials git credential erase
git init
Khởi tạo một Git repository mới trong thư mục hiện tại.
# Khởi tạo Git repo mới trong thư mục my-project. git init .
git clone <url>
Sao chép một repository từ trên mạng (GitHub/GitLab) về máy của bạn: git clone <repo_url>
# Lấy source code từ repository your_repo về máy tính git clone https://github.com/username/your_repo.git
git remote
Khi bạn dùng git clone, Git sẽ tự động thiết lập mối liên kết ngầm và đặt tên cho server là origin (nghĩa là “nguồn gốc” – hay máy chủ chính). Bạn có thể đổi tên server bằng từ bất kỳ nào (viết liền, không dấu). Điều này sẽ có ích trong trường hợp bạn đang làm một dự án với nhiều server khác nhau cùng lúc.
# Kết nối kho code ở máy Local với một repo trống trên GitHub git remote add origin <repo_url> # Kết nối server công ty và đặt tên là "company" git remote add company https://gitlab.company.com/project.git # Kết nối server cá nhân và đặt tên là "personal" git remote add personal https://github.com/my-username/project.git # Kiểm tra xem máy mình đang kết nối đến những remote server nào git remote -v # Lấy thông tin đường dẫn remote server git remote get-url origin git remote get-url company git remote get-url personal # Thay đổi thông tin đường dẫn remote server đã tồn tại git remote set-url origin <new_repo_url> git remote set-url company https://gitlab.company.com/new-project.git git remote set-url personal https://github.com/my-username/new-project.git # Và khi đẩy code lên, bạn cũng gõ theo tên server git push origin main git push company main git push personal main
Nhóm 2: Làm việc với các thay đổi (Lệnh dùng hàng ngày)
git status
Kiểm tra trạng thái hiện tại (xem file nào đã sửa, file nào chưa được track). Đây là lệnh mà anh em dùng thường xuyên ^^.
git status # On branch main # Your branch is up to date with 'origin/main'.
git add <tên_file>
Đưa file vào vùng chờ (Staging Area) để chuẩn bị lưu. Bạn có thể dùng git add . để thêm toàn bộ các file thay đổi cùng một lúc.
git commit -m “Lời nhắn của bạn”
Lưu lại các thay đổi từ vùng chờ ở trên vào lịch sử của Git. Lời nhắn nên ngắn gọn, rõ ràng (ví dụ: “feat: add login button”). Đừng commit đại đại kiểu như “updated” hay “fixed” nhé, sẽ làm khó các đồng nghiệp đấy (vì phải ngồi mở commit xem có gì trong đó 🤒). Tốt nhất bạn cứ ghi rõ ràng (chi tiết được thì tốt) để sau xem lại lịch sử commit cũng dễ dàng hơn nhé.
# Nên git commit -m "feat: add login button" # Không nên git commit -m "updated/fixed"
Nhóm 3: Đồng bộ với Remote Server (GitHub/GitLab)
git fetch
Tải cập nhật mới nhất từ remote server về để kiểm tra thay đổi mà không tự động gộp (merge) vào code hiện tại. Lệnh này giúp bạn xem trước an toàn những gì đồng nghiệp đã làm trước khi quyết định dùng git pull.
git pull origin <tên_nhánh>
Kéo và tự động gộp (merge) mã nguồn mới nhất từ server vào nhánh hiện tại của bạn. Bạn nên chạy lệnh này trước khi bắt đầu code ngày mới để đảm bảo không bị sót (miss) code của đồng nghiệp.
# Lấy code mới nhất từ nhánh main về máy git pull origin main
git push origin <tên_nhánh>
Đẩy các commit từ máy cục bộ lên server.
# Đẩy các commit lên nhánh main git push origin main
Nhóm 4: Phân nhánh, Di chuyển và Phục hồi (Branching, Switching & Restoring)
git branch <tên_nhánh>
Tạo một nhánh mới để làm tính năng riêng biệt.
# Tạo nhánh feat-login để làm tính năng đăng nhập git branch feat-login
git checkout <tên_nhánh>
Là một lệnh cũ và “đa di năng”, có thể dùng để chuyển nhánh, tạo nhánh mới hay hủy bỏ các thay đổi của một file.
# Chuyển sang nhánh feat-forgotpw để làm tính năng quên mật khẩu git checkout feat-forgotpw # Tạo một nhánh mới và nhảy sang nhánh đó luôn git checkout -b feat-forgotpw # Hủy toàn bộ các chỉnh sửa trong file auth.tsx (khi chưa commit) về trạng thái nguyên bản git checkout -- auth.tsx
Vì sự đa năng của git checkout rất dễ gây ra những nhầm lẫn nên trong phiên bản mới từ Git 2.23 trở đi, Git đã giới thiệu 2 lệnh mới là git switch (quản lý nhánh) và git restore (quản lý file) để phục vụ các chức năng chuyên biệt của git checkout. Mặc dù bị thay thế nhưng git checkout vẫn còn được dùng do sự phổ biến và tính tương thích với các hệ thống cũ chứ không bị khai tử nhé^^.
git switch <tên_nhánh>
Lệnh này chỉ có duy nhất một nhiệm vụ là giúp bạn di chuyển qua lại giữa các nhánh hoặc tạo nhánh mới một cách an toàn.
# Chuyển sang nhánh feat-forgotpw để làm tính năng quên mật khẩu git switch feat-forgotpw # Tạo một nhánh mới và nhảy sang nhánh đó luôn git switch -c feat-forgotpw
git restore
Lệnh này dùng để hủy bỏ các thay đổi bạn đã gõ nhưng chưa commit, đưa file quay trở lại trạng thái cũ.
- Hủy bỏ thay đổi của một file ở Working Directory (chưa
git add): Nếu bạn lỡ tay sửa code linh tinh trong một file và muốn nó quay về trạng thái lúc chưa sửa:git restore <tên_file>
# Bỏ các sửa đổi trong file auth.tsx git restore auth.tsx
- Đưa file từ Staging Area quay lại Working Directory (sau khi đã lỡ
git add): Nếu bạn lỡ gõgit add .nhưng phát hiện có 1 file chưa muốn cho vào commit này:git restore --staged <tên_file>
# Bỏ file config.env ra khỏi vùng chờ commit git restore --staged config.env
git clean
Khi bạn tạo thử nghiệm hàng tá file code mới (chưa git add) rồi nhận ra chúng hoàn toàn vô dụng, lệnh này sẽ giúp xóa sạch toàn bộ các file rác đó khỏi thư mục chỉ trong 1 giây.
git merge <tên_nhánh_cần_gộp>
Hợp nhất mã nguồn từ nhánh khác vào nhánh hiện tại.
# Bạn đang ở nhánh main, muốn gộp code từ nhánh feat-login vào main git merge feat-login
Nhóm 5: Các lệnh nâng cao chuyên xử lý tình huống
Xóa nhánh (Local & Remote)
Sau khi một tính năng đã được gộp (merge) thành công vào nhánh chính, việc dọn dẹp các nhánh thừa là rất cần thiết để giữ cho repository luôn sạch sẽ.
- Xóa nhánh ở máy cục bộ (Local):
git branch -d <tên_nhánh>
⚠️ Lưu ý: Nếu nhánh đó có code mới chưa được gộp vào đâu, Git sẽ ngăn không cho xóa để bảo vệ code. Nếu bạn chắc chắn muốn xóa bỏ hoàn toàn nhánh đó (chấp nhận mất code bên trong), hãy dùng chữ -D in hoa.
# Xóa nhánh feat-login sau khi đã dùng xong git branch -d feat-login # Xóa ép buộc (force delete) git branch -D feat-login
- Xóa nhánh trên máy chủ (Remote Server – GitHub/GitLab):
git push origin --delete <tên_nhánh>
# Xóa nhánh feat-login trên remote git push origin --delete feat-login
git rebase <tên_nhánh>
git rebase có tính năng tương tự như git merge là gộp code từ nhánh khác vào nhánh hiện tại, nhưng cách thức hoạt động của nó “làm sạch lịch sử” hơn rất nhiều.
Thay vì tạo ra một commit gộp (merge commit) loằng ngoằng, rebase sẽ cắt toàn bộ các commit mới của nhánh hiện tại, đem nối tiếp vào sau commit mới nhất của nhánh đích. Lịch sử commit sẽ thành một đường thẳng tắp cực kỳ đẹp mắt, các commit của các tính năng như được push trên cùng một nhánh.
# bạn đang ở nhánh tính năng feat-login # cập nhật toàn bộ code mới nhất từ nhánh chính main vào nhánh feat-login theo dạng đường thẳng git rebase main
⚠️ Lưu ý: Lệnh rebase sẽ làm thay đổi lịch sử commit, vì vậy chỉ nên dùng rebase ở các nhánh local của cá nhân bạn. Tuyệt đối không dùng rebase trên các nhánh dùng chung như main hay develop vì sẽ gây xung đột (conflict) hàng loạt cho cả team!
git cherry-pick
Đây là lệnh cứu cánh trong những tình huống trớ trêu khi bạn chỉ muốn lấy duy nhất một commit cụ thể từ nhánh này sang nhánh khác mà không muốn gộp toàn bộ cả nhánh đó.
Hãy tưởng tượng, bạn đang làm một tính năng ở nhánh feat-myfeat và bạn đang cần một hàm abc ở branch feat-abc của đồng nghiệp. Bạn chuyển qua branch đó và tìm commit chứa phần code của hàm abc mà đồng nghiệp đã mô tả. Lấy cái mã định danh (Commit ID/Hash) của nó, rồi quay về nhánh của mình để “bốc” riêng commit đó về.
# Sang nhánh feat-abc của đồng nghiệp git switch feat-abc # Tìm Commit ID bằng lệnh git log --oneline # Ví dụ tìm được mã commit là abc1234 abc1234 Add: abc func # Quay lại nhánh hiện tại của bạn git switch feat-myfeat # Bốc code từ commit "abc1234" về nhánh của bạn git cherry-pick abc1234
Ứng dụng thực tế: Khi bạn đang sửa một lỗi (Hotfix) rất gấp trên một nhánh thử nghiệm, và bạn muốn đưa ngay đoạn code sửa lỗi đó về nhánh main đang chạy thực tế mà không muốn kéo theo các tính năng thử nghiệm chưa hoàn thành khác.
git stash (Tạm cất code đang dang dở)
Khi bạn đang code dở tính năng A (chưa thể commit vì code lỗi), nhưng sếp hoặc đồng nghiệp bất ngờ yêu cầu bạn nhảy sang nhánh khác để fix một lỗi gấp. Lệnh này sẽ gom toàn bộ những file bạn đang sửa dở dang lại, “nhét” vào một ngăn kéo tạm thời của Git để làm sạch Working Directory. Sau khi xong việc ở nhánh kia, bạn quay lại và “mở ngăn kéo” lấy code ra code tiếp.
# Tạm cất code đang làm dở (sau lệnh này code của bạn sẽ sạch như lúc chưa sửa) git stash # Xem danh sách (ngăn kéo) các lần bạn đã stash (cất code) git stash list # stash@{0}: WIP on main: abc123 Add: abc func # stash@{1}: WIP on main: def456 Add: def func # Lấy stash gần nhất (stash@{0}) để làm tiếp và xóa bản sao lưu tạm git stash pop # Lấy chính xác stash@{1} để làm tiếp và xóa bản sao lưu git stash pop stash@{1} git stash pop 1 # Lấy stash gần nhất nhưng giữ lại bản sao (khi còn muốn backup trước khi làm tiếp) git stash apply # Lấy chính xác stash@{1} nhưng giữ lại bản sao git stash apply stash@{1} git stash apply 1 # Xóa bỏ hoàn toàn một bản stash đang lưu trữ trong danh sách, ví dụ: xóa stash@{0} git stash drop stash@{0} git stash drop 0 # Xóa toàn bộ các stash và không thể khôi phục lại nên cần cẩn thận git stash clear # Stash tất cả + các file mới chưa tracked (untracked files) git stash -u git stash push -u # Stash tất cả + các ignored files và cả untracked files git stash -a git stash --all
git log (Xem lịch sử commit)
Trong làm việc nhóm, việc xem lịch sử để biết ai đã commit cái gì là việc diễn ra liên tục. Lệnh git log sinh ra để hiển thị danh sách các commit cũ của dự án kèm theo tên tác giả, ngày tháng và nội dung tin nhắn commit.
Lệnh git log mặc định hiển thị rất dài và khó nhìn. Bạn nên dùng option --oneline hoặc --graph để xem dưới dạng sơ đồ hình cây rút gọn. Gõ q để thoát khỏi màn hình log.
# Xem lịch sử rút gọn trên 1 dòng (Hiển thị Mã commit + Tin nhắn) git log --oneline # Xem lịch sử dạng sơ đồ nhánh (Cực trực quan khi làm việc nhóm) git log --oneline --graph --all
git diff (So sánh sự thay đổi)
Trước khi gõ git add . để đưa code vào vùng chờ, làm thế nào để bạn biết chính xác mình đã thêm/xóa những dòng code nào so với commit cũ? Đó là lúc cần đến git diff.
Lệnh này giúp so sánh và hiển thị chi tiết các dòng code bị thay đổi (Dòng màu xanh là dòng thêm mới, dòng màu đỏ/dấu trừ là dòng bị xóa đi).
# Xem các thay đổi ở các file chưa add git diff # So sánh sự khác biệt giữa nhánh hiện tại với nhánh main git diff main
git reflog
Nếu git log dùng để xem lịch sử của các commit chính thức, thì git reflog (Reference Log) dùng để ghi lại nhật ký của mọi hành động bạn đã làm với các nhánh trên máy cục bộ (Local). Nó ghi lại tất cả: từ lúc bạn chuyển nhánh, commit, reset, rebase, cho đến cả những lệnh cưỡng ép xóa nhánh tính năng.
Nhờ cơ chế này, ngay cả khi bạn lỡ tay chạy lệnh xóa một nhánh chưa kịp gộp, hoặc lỡ git reset --hard làm mất sạch các commit vừa viết, bạn vẫn có thể mở “hộp đen” này ra để cứu code.
# Xem nhật ký mọi hành động của bạn trên máy Local git reflog # Kết quả hiển thị sẽ có dạng như sau: # ab12cd3 HEAD@{0}: checkout: moving from feat-login to main # ef45gh6 HEAD@{1}: commit: feat: add login button <-- Commit bị mất nằm ở đây! # ij78kl9 HEAD@{2}: reset: moving to HEAD~1 # Cách cứu code: Tìm mã định danh (Commit ID) của đoạn code bị mất và bốc nó về git cherry-pick ef45gh6
⚠️ Lưu ý an toàn: git reflog chỉ ghi lại lịch sử trên máy cục bộ của bạn và Git sẽ tự động dọn dẹp các dữ liệu quá cũ (thường là sau 30-90 ngày). Vì vậy, nếu lỡ tay xóa nhầm code, hãy mở ngay lệnh này để cứu vãn càng sớm càng tốt nhé!
git reset
Nếu bạn lỡ commit sai, hoặc muốn hủy bỏ các commit gần nhất để làm lại từ một mốc thời gian cũ trong lịch sử, git reset chính là “cỗ máy thời gian” của bạn. Lệnh này đi kèm với 3 tùy chọn quan trọng quyết định số phận những dòng code bạn vừa viết:
# Xem danh sách commit git log --oneline # 1. Chế độ Mềm dẻo (--soft): Chỉ hủy commit, GIỮ NGUYÊN CODE # Code của các commit bị hủy sẽ được đẩy ngược lại vùng chờ (Staging Area). Bạn có thể sửa lại rồi commit mới. git reset --soft <Mã_Commit_Cũ> # Ví dụ 1: Hủy commit gần nhất để gom code viết lại tin nhắn commit git reset --soft HEAD~1 # Ví dụ 2: Hủy cả 2 commit gần nhất cùng một lúc git reset --soft HEAD~2 # 2. Chế độ Mặc định (--mixed): Hủy commit, GIỮ CODE ngoài Working Directory # Code của các commit bị hủy sẽ nằm ở dạng chưa add (Unstaged). Bạn cần git add lại nếu muốn commit. git reset --mixed HEAD~1 git reset HEAD~1 # Nếu không ghi gì, Git sẽ mặc định là --mixed # 3. Chế độ Đập đi xây lại (--hard): XÓA SẠCH SÀNH SANH # Hủy commit, xóa sạch toàn bộ code bạn đã viết từ commit đó đến nay. File sẽ quay về y hệt quá khứ. git reset --hard <Mã_Commit_Cũ>
⚠️ Lưu ý cực kỳ quan trọng: Hãy thật sự cẩn thận với tùy chọn --hard. Nó sẽ xóa vĩnh viễn những file và code bạn chưa commit mà không có cảnh báo. Nếu lỡ tay dùng lệnh này làm mất code, bạn phải mở ngay git reflog lên để tìm lại mã commit cũ rồi cứu lại nhé!
git revert
Nếu lỡ tay push code lỗi lên nhánh chung (main), bạn bắt buộc phải dùng git revert để tạo một commit mới đảo ngược lại commit lỗi mà không làm mất lịch sử của team.
# Xem lịch sử để lấy mã Commit ID của commit bị lỗi (ví dụ: a1b2c3d) git log --oneline # Tạo một commit mới tinh để ĐẢO NGƯỢC toàn bộ thay đổi của commit lỗi đó git revert a1b2c3d # Sau đó bạn có thể an toàn push commit đảo ngược này lên server chung git push origin main
git bisect (Tìm kiếm nhị phân tìm bug)
Lệnh này siêu bá đạo. Khi dự án bỗng dưng bị lỗi mà không biết commit nào làm lỗi, git bisect sẽ giúp bạn dò tìm ngược lại lịch sử theo cơ chế chia đôi để tìm chính xác commit “tội đồ”.
# Bước 1: Kích hoạt chế độ dò lỗi tự động git bisect start # Bước 2: Báo cho Git biết bản hiện tại đang bị lỗi (Bad) git bisect bad # Bước 3: Báo cho Git biết một mã commit cũ trong quá khứ chạy rất ngon (Good) git bisect good <Mã_Commit_Ngon> # Lúc này Git sẽ tự động nhảy về commit ở giữa để bạn test code. # Nếu test xong thấy VẪN LỖI, bạn gõ: git bisect bad # Nếu test xong thấy HẾT LỖI, bạn gõ: git bisect good # Lặp lại vài lần, Git sẽ chỉ thẳng mặt commit gây lỗi! # Bước 4: Sau khi tìm xong bug, gõ lệnh này để quay về trạng thái bình thường git bisect reset
git mv (Đổi tên / Di chuyển file)
Thay vì đổi tên file bằng tay rồi Git báo là file cũ bị xóa, file mới được tạo, lệnh này giúp Git hiểu ngay là bạn đang đổi tên file. Tuy nhiên các IDE hiện đại như VS Code hiện tại đã tự động xử lý việc này rất tốt nên lệnh này ít khi phải gõ tay. Lệnh chỉ chạy được khi file được tracking (sau khi git add).
# Đổi tên file old.tsx thành new.tsx chuẩn chỉ (Git tự động ghi nhận) git mv old.tsx new.tsx # Di chuyển file new.tsx vào trong thư mục src/ với tên là new2.tsx git mv new.tsx src/new2.tsx
git rm (Xóa file khỏi Git)
Dùng để xóa file. Đặc biệt có cờ git rm --cached <tên_file> rất hay dùng để xóa một file lỡ commit lên mạng rồi (như file cấu hình môi trường .env) mà vẫn muốn giữ lại file đó ở máy local.
# Cách 1: Xóa file VĨNH VIỄN (Xóa cả trong Git lẫn trong thư mục máy tính) git rm test.txt # Nếu file "test.txt" đang sửa dở dang mà chưa commit, # Git sẽ chặn lại không cho xóa. Bạn phải thêm cờ -f để ÉP XÓA vĩnh viễn: git rm -f test.txt # Cách 2: Chỉ xóa khỏi Git nhưng GIỮ LẠI FILE ở máy tính (Cực kỳ hay dùng!) # Áp dụng khi lỡ tay commit file chứa mật khẩu mật (.env) lên GitHub git rm --cached .env # Sau lệnh này, bạn thêm .env vào file .gitignore rồi commit là xong an toàn!
git gui & git citool
Hai công cụ này hiện tại rất ít khi được lập trình viên sử dụng vì giao diện đồ họa (GUI) của chúng trông khá lỗi thời (giống như từ những năm 2000) và trải nghiệm sử dụng không thể mượt mà bằng các công cụ hiện đại như GitHub Desktop hay Sourcetree.
# Mở giao diện đồ họa chính thức (nhưng giao diện hơi cổ điển) của Git git gui # Mở nhanh giao diện đồ họa chuyên biệt chỉ để thực hiện việc Commit code git citool
Áp dụng vào quy trình làm việc
Trong môi trường làm việc nhóm (Teamwork) thực tế tại các công ty, quy trình hằng ngày của một lập trình viên thường diễn ra nhịp nhàng theo các bước tiêu chuẩn sau:
- Bước 1 (Đầu ngày đi làm): Mở máy lên, việc đầu tiên là gõ
git switch mainrồi chạy lệnhgit pull origin mainđể kéo toàn bộ code mới nhất mà đồng nghiệp đã cập nhật từ hôm qua về máy mình. - Bước 2 (Bắt đầu làm tính năng mới): Tuyệt đối không code trực tiếp trên nhánh chính. Hãy tạo và nhảy sang một nhánh riêng biệt bằng lệnh
git switch -c feat-register(ví dụ bạn đang cần làm tính năng Đăng ký). - Bước 3 (Trong quá trình code): Bạn có thể gõ
git diffđể xem nhanh mình đã thay đổi những dòng code nào. Nếu cần đi fix bug gấp ở nhánh khác khi code chưa hoàn thiện, hãy dùnggit stashđể “bảo lưu” code tạm thời và dùnggit stash popđể lấy lại khi quay về. - Bước 4 (Khi hoàn thành công việc): Gõ
git statusđể kiểm tra lại các file, sau đó gom toàn bộ thay đổi bằng lệnhgit add .và lưu lại lịch sử bằng lệnhgit commit -m "feat: complete register form"với tin nhắn rõ ràng. - Bước 5 (Đẩy code lên server): Đẩy nhánh tính năng của bạn lên remote server bằng lệnh
git push origin feat-register. - Bước 6 (Tạo Pull Request): Truy cập vào giao diện web của GitHub/GitLab để bấm tạo PR (Pull Request), chờ Leader hoặc đồng nghiệp review code trước khi gộp chính thức vào nhánh
main.
Lời kết
Git có vẻ rất đáng sợ lúc ban đầu với hàng tá câu lệnh và các thuật ngữ trừu tượng. Tuy nhiên, thực tế khi đi làm, bạn chỉ cần hiểu bản chất và sử dụng thành thạo bộ lệnh cốt lõi bao gồm: status, add, commit, pull, push, kết hợp với bộ đôi lệnh hiện đại switch và restore là đã có thể tự tin làm tốt công việc trong mọi dự án.
Đừng cố học thuộc lòng tất cả mọi thứ ngay lập tức. Hãy mở terminal lên, tạo một repo thử nghiệm và gõ lệnh thường xuyên để biến chúng thành phản xạ tự nhiên của bạn. Chúc các bạn chinh phục Git thành công!


