15 Lệnh Git Quan Trọng Mà Mọi Kỹ Sư Phần Mềm Cần Nắm Vững (Và Lý Do Chúng Thay Đổi Cách Bạn Làm Việc)

Từ Nỗi Sợ Hãi Ban Đầu Đến Sự Tự Tin Vững Chắc Với Git

Trong hành trình trở thành một kỹ sư phần mềm chuyên nghiệp, có lẽ rất nhiều người từng có một mối quan hệ “cơm không lành canh không ngọt” với Git. Tôi cũng từng là một trong số đó. Thuở ban đầu, Git đối với tôi chỉ là một công cụ phức tạp mà tôi phải “sống sót” qua từng ngày. Mỗi khi gõ một dòng lệnh, tôi đều nơm nớp lo sợ, hy vọng không có gì đổ vỡ. Và khi có sự cố, phản xạ đầu tiên của tôi là nhanh chóng mở Google, sao chép các giải pháp từ Stack Overflow mà không thực sự hiểu chúng hoạt động như thế nào. Nỗi ám ảnh lớn nhất là xung đột hợp nhất (merge conflicts), chúng khiến tôi cảm thấy bất lực và mất tự tin.

Thế nhưng, sau một thời gian dài sử dụng Git hàng ngày mà không thực sự thoải mái, tôi nhận ra một sự thật quan trọng: hầu hết các nhà phát triển không sử dụng *toàn bộ* chức năng của Git. Họ chỉ sử dụng một **tập hợp nhỏ các lệnh… một cách sâu sắc và thành thạo**. Khi tôi ngừng coi Git như một thứ ma thuật khó hiểu, nó biến thành một công cụ đáng tin cậy, một người bạn đồng hành không thể thiếu trong quá trình phát triển phần mềm.

Git Không Hề Khó Khăn – Nó Chỉ Đơn Giản Là Chưa Quen Thuộc

Lúc đầu, Git có thể gây ra cảm giác e ngại bởi vì nó “ghi nhớ mọi thứ”: mọi lỗi lầm, mọi thử nghiệm, mọi lần bạn hứa “sẽ dọn dẹp sau”. Điều này nghe có vẻ đáng sợ, nhưng thực tế, Git không hề phán xét bạn. Ngược lại, nó đang bảo vệ công việc của bạn, ngay cả khi bạn chưa nhận ra điều đó. Git lưu giữ lịch sử phát triển, cho phép bạn quay ngược thời gian, kiểm tra các phiên bản trước và phục hồi một cách an toàn.

Khi chấp nhận sự thật này, việc học Git không còn là một áp lực mà trở thành một cảm giác kiểm soát mạnh mẽ. Bạn không còn phải lo lắng về việc mất đi các thay đổi hay phá hỏng dự án; Git sẽ là “lưới an toàn” của bạn.

15 Lệnh Git Thiết Yếu Mà Mọi Kỹ Sư Phần Mềm Đều Sử Dụng Hàng Ngày

Bạn không cần phải biết 50 lệnh Git phức tạp. Thay vào đó, bạn chỉ cần nắm vững **15 lệnh quan trọng nhất**, sử dụng chúng một cách bình tĩnh và có chủ đích. Đây chính là những lệnh xuất hiện thường xuyên trong các dự án thực tế, trong các nhóm phát triển và trong công việc hàng ngày của một kỹ sư phần mềm.

1. git status – Kiểm tra Trạng thái Hiện tại của Kho Lưu Trữ

Lệnh `git status` hiển thị những tệp nào đã được sửa đổi (modified), đã được thêm vào khu vực chờ (staged), chưa được theo dõi (untracked), hoặc đã sẵn sàng để commit trong kho lưu trữ của bạn. Đây là lệnh đầu tiên và cơ bản nhất mà bạn nên sử dụng.

**Tại sao nó quan trọng?** Nó cung cấp một cái nhìn tổng quan về môi trường làm việc hiện tại, giúp bạn biết chính xác những gì đang diễn ra trước khi thực hiện bất kỳ hành động nào khác.

**Lỗi thường gặp:** Chạy các lệnh Git khác mà không kiểm tra `git status` trước, dẫn đến việc commit hoặc xóa nhầm tệp.

git status

2. git init – Khởi tạo một Kho Lưu Trữ Git Mới

`git init` tạo một kho lưu trữ Git mới bằng cách thêm tính năng kiểm soát phiên bản vào một thư mục dự án. Nó sẽ tạo một thư mục `.git` ẩn, chứa tất cả các đối tượng và tham chiếu mà Git cần để quản lý dự án.

**Tại sao nó quan trọng?** Đây là bước đầu tiên để biến một thư mục dự án thông thường thành một kho lưu trữ được Git theo dõi, cho phép bạn bắt đầu kiểm soát phiên bản công việc của mình.

**Lỗi thường gặp:** Chạy `git init` bên trong một kho lưu trữ đã được khởi tạo, tạo ra một thư mục `.git` lồng nhau và làm cho Git trở nên bối rối.

git init

3. git clone – Sao Chép một Kho Lưu Trữ Từ Xa về Cục bộ

`git clone` tải xuống một kho lưu trữ từ xa (ví dụ: từ GitHub, GitLab, Bitbucket) và tạo một bản sao cục bộ đầy đủ, bao gồm toàn bộ lịch sử commit của nó.

**Tại sao nó quan trọng?** Lệnh này cho phép bạn bắt đầu làm việc trên một dự án hiện có bằng cách lấy tất cả mã nguồn và lịch sử của nó về máy tính của mình.

**Lỗi thường gặp:** Clone một kho lưu trữ và ngay lập tức đẩy các thay đổi mà không hiểu cấu trúc nhánh của dự án, dẫn đến các vấn đề về đồng bộ.

git clone <URL_kho_luu_tru>

4. git add – Chuẩn bị Thay đổi cho Commit Tiếp theo

`git add` di chuyển các thay đổi của tệp vào khu vực chờ (staging area) để chúng có thể được bao gồm trong commit tiếp theo.

**Tại sao nó quan trọng?** Khu vực chờ cho phép bạn kiểm soát chính xác những phần nào của thay đổi sẽ được lưu vào một commit. Điều này giúp tạo ra các commit nhỏ, có ý nghĩa, dễ quản lý và dễ khôi phục hơn.

**Các biến thể quan trọng:**
* **`git add .`**: Thêm tất cả các thay đổi trong thư mục hiện tại và các thư mục con. ⚠️ Cẩn thận nếu bạn đang ở trong một thư mục con, các tệp ở thư mục cha sẽ không được bao gồm.
* **`git add *`**: Chỉ thêm các tệp không ẩn trong thư mục hiện tại. ⚠️ Bỏ qua các tệp như `.env`, `.gitignore`.
* **`git add :`**: Thêm tất cả các thay đổi từ thư mục gốc của kho lưu trữ, bao gồm cả các tệp ẩn. ✅ Tùy chọn an toàn nhất khi bạn muốn *tất cả mọi thứ*, bất kể vị trí.
* **`git add `**: Chỉ thêm một tệp cụ thể.

**Lỗi thường gặp:** Sử dụng `git add .` một cách mù quáng và vô tình đưa các tệp bạn không muốn commit vào khu vực chờ.

git add <tên_tệp>
git add .

5. git commit – Lưu lại một Ảnh chụp các Thay đổi của Bạn

`git commit` ghi lại các thay đổi đã được thêm vào khu vực chờ như một ảnh chụp (snapshot) trong lịch sử của dự án, kèm theo một thông điệp mô tả.

**Tại sao nó quan trọng?** Commit là đơn vị cơ bản của lịch sử dự án trong Git. Các commit tốt, có mô tả rõ ràng sẽ giúp bạn và đồng đội dễ dàng theo dõi sự phát triển, gỡ lỗi và hiểu được mục đích của từng thay đổi.

**Lỗi thường gặp:** Viết các thông điệp commit mơ hồ như “update” hoặc “fix stuff”, điều này làm cho việc gỡ lỗi trong tương lai trở nên đau đớn.

git commit -m "Thông điệp mô tả về commit này"

6. git log – Xem Lịch sử Commit

`git log` hiển thị danh sách các commit trước đó, bao gồm thông tin về thay đổi, tác giả và thời gian.

**Tại sao nó quan trọng?** `git log` là công cụ chính để xem lại lịch sử dự án. Nó giúp bạn hiểu ai đã thay đổi gì, khi nào và tại sao, rất hữu ích cho việc tìm nguồn gốc lỗi hoặc xem lại tiến độ.

**Lỗi thường gặp:** Bỏ qua lịch sử commit và cố gắng đoán khi nào một lỗi được đưa vào, lãng phí thời gian quý báu.

git log
git log --oneline --graph --decorate

7. git diff – Xem những Gì Đã Thay đổi

`git diff` hiển thị sự khác biệt từng dòng giữa các phiên bản tệp, các commit hoặc các nhánh.

**Tại sao nó quan trọng?** Trước khi commit, `git diff` cho phép bạn xem lại chính xác những gì bạn đã thay đổi. Điều này giúp bạn phát hiện lỗi, đảm bảo chỉ những thay đổi mong muốn được commit và tạo ra các commit chất lượng cao hơn.

**Lỗi thường gặp:** Bỏ qua `git diff` và commit mã mà không xem xét thực sự những gì đã thay đổi.

git diff
git diff --staged
git diff <commit_cũ> <commit_mới>

8. git branch – Quản lý Phát triển Song song

`git branch` cho phép bạn tạo, liệt kê, đổi tên hoặc xóa các nhánh để thực hiện các dòng phát triển riêng biệt.

**Tại sao nó quan trọng?** Nhánh là tính năng cốt lõi của Git, cho phép các nhà phát triển làm việc độc lập trên các tính năng hoặc sửa lỗi mà không ảnh hưởng đến mã nguồn chính. Nó là nền tảng của quy trình làm việc cộng tác hiệu quả.

**Lỗi thường gặp:** Thực hiện tất cả công việc trên nhánh `main` (hoặc `master`) thay vì tạo các nhánh tính năng, gây khó khăn cho việc quản lý và hợp nhất mã.

git branch
git branch <tên_nhánh_mới>
git branch -d <tên_nhánh>

9. git checkout / git switch – Di chuyển giữa các Nhánh một cách An toàn

Các lệnh này cho phép bạn di chuyển giữa các nhánh khác nhau. Chỉ `git checkout` mới có thể được sử dụng để khôi phục tệp từ một nhánh hoặc commit khác.

**Tại sao nó quan trọng?** Chúng cho phép bạn chuyển đổi ngữ cảnh làm việc một cách nhanh chóng, làm việc trên nhiều tính năng hoặc sửa lỗi mà không cần phải nhân bản toàn bộ kho lưu trữ.

**Các biến thể quan trọng:**
* **`git checkout `**: Cũ nhưng vẫn được sử dụng rộng rãi.
* **`git switch `**: Mới hơn, rõ ràng hơn và an toàn hơn khi chuyển đổi nhánh.
* **`git checkout -b `**: Tạo và chuyển sang một nhánh mới.
* **`git switch -c `**: Tương tự như trên, dùng với `git switch`.

**Lỗi thường gặp:** Chuyển nhánh khi có những thay đổi chưa được commit và vô tình làm mất công việc.

git switch <tên_nhánh>
git checkout <tên_nhánh>

10. git merge – Kết hợp các Thay đổi từ các Nhánh Khác nhau

`git merge` tích hợp các thay đổi từ một nhánh này vào một nhánh khác, kết hợp lịch sử của chúng.

**Tại sao nó quan trọng?** Merge là cách bạn đưa công việc đã hoàn thành trên một nhánh tính năng trở lại nhánh chính của dự án. Đây là một phần thiết yếu của quy trình làm việc phát triển hợp tác.

**Lỗi thường gặp:** Hợp nhất mà không kéo các thay đổi mới nhất từ nhánh đích trước, dẫn đến các xung đột không cần thiết.

git merge <tên_nhánh_nguồn>

11. git pull – Cập nhật Kho Lưu Trữ Cục bộ của Bạn

`git pull` tìm nạp (fetch) các thay đổi từ một kho lưu trữ từ xa và tích hợp chúng vào nhánh hiện tại của bạn (bằng merge hoặc rebase, tùy thuộc vào cấu hình).

**Tại sao nó quan trọng?** Lệnh này đảm bảo rằng kho lưu trữ cục bộ của bạn luôn được đồng bộ với phiên bản mới nhất trên kho lưu trữ từ xa, giúp bạn luôn làm việc với mã nguồn cập nhật nhất của đồng đội.

**Lỗi thường gặp:** Pull vào một thư mục làm việc đang “bẩn” (có các thay đổi chưa được commit) thay vì commit hoặc stash trước.

git pull origin <tên_nhánh>

12. git push – Chia sẻ các Commit của Bạn với Người khác

`git push` tải lên các commit cục bộ của bạn lên một kho lưu trữ từ xa để những người khác có thể truy cập chúng.

**Tại sao nó quan trọng?** `git push` là cách bạn chia sẻ công việc của mình với nhóm, đóng góp các thay đổi vào kho lưu trữ trung tâm để mọi người có thể xem xét, hợp nhất và xây dựng dựa trên đó.

**Lỗi thường gặp:** Quên pull trước khi push, gây ra các push bị từ chối và sự nhầm lẫn.

git push origin <tên_nhánh>

13. git stash – Tạm thời Lưu trữ Công việc Chưa Hoàn thành

`git stash` lưu trữ các thay đổi chưa được commit của bạn một cách tạm thời, cho phép bạn quay trở lại một thư mục làm việc sạch sẽ.

**Tại sao nó quan trọng?** Khi bạn cần nhanh chóng chuyển sang một nhánh khác để sửa lỗi nóng hoặc kiểm tra một tính năng, `git stash` giúp bạn “cất” công việc hiện tại mà không cần commit, sau đó có thể khôi phục lại dễ dàng.

**Các biến thể quan trọng:**
* **`git stash`**: Lưu các thay đổi và làm sạch thư mục làm việc.
* **`git stash pop`**: Khôi phục stash gần đây nhất và xóa nó khỏi danh sách stash.
* **`git stash list`**: Hiển thị tất cả các stash đã lưu.

**Lỗi thường gặp:** Stash các thay đổi và quên mất chúng tồn tại, hoặc quên pop chúng trở lại.

git stash
git stash pop

14. git reset – Hoàn tác Thay đổi với Kiểm soát

`git reset` di chuyển con trỏ nhánh hiện tại và tùy chọn cập nhật khu vực chờ và thư mục làm việc. Nó được sử dụng để hoàn tác các commit trong lịch sử cục bộ của bạn.

**Tại sao nó quan trọng?** `git reset` cho phép bạn hoàn tác các commit sai lầm hoặc chưa hoàn chỉnh, điều chỉnh lịch sử cục bộ của bạn trước khi chia sẻ.

**Các biến thể quan trọng:**
* **`git reset –soft HEAD~1`**: Giữ các thay đổi ở trạng thái đã được thêm vào khu vực chờ.
* **`git reset –mixed HEAD~1`** (mặc định): Giữ các thay đổi ở trạng thái chưa được thêm vào khu vực chờ.
* **`git reset –hard HEAD~1`**: Xóa vĩnh viễn các thay đổi. Hết sức cẩn thận khi sử dụng lệnh này!

**Lỗi thường gặp:** Sử dụng `–hard` mà không hiểu rằng nó loại bỏ công việc vĩnh viễn.

git reset --soft HEAD~1
git reset --hard <commit_id>

15. git revert – Hoàn tác Thay đổi một cách An toàn trong Lịch sử Chia sẻ

`git revert` tạo một commit mới để đảo ngược các tác động của một commit trước đó mà không ghi lại lịch sử.

**Tại sao nó quan trọng?** `git revert` là cách an toàn để hoàn tác các thay đổi trên các nhánh đã được chia sẻ với người khác. Thay vì xóa lịch sử, nó thêm một commit mới để “hủy bỏ” tác động của commit cũ, giữ cho lịch sử dự án rõ ràng và không bị chỉnh sửa.

**Lỗi thường gặp:** Sử dụng `git reset` trên các nhánh đã chia sẻ thay vì `git revert`, làm thay đổi lịch sử cho đồng đội.

git revert <commit_id>

Xây Dựng Sự Tự Tin Với Git: Hành Trình Từng Bước

Có một điều mà ít ai nói cho bạn biết: sự tự tin với Git không đến một cách đột ngột. Nó phát triển dần dần. Sau những sai lầm. Sau những xung đột hợp nhất. Sau khi sửa được một thứ mà bạn tưởng chừng đã hỏng vĩnh viễn.

Một ngày nào đó, bạn sẽ nhận ra mình không còn hoảng sợ nữa. Bạn sẽ dừng lại. Bạn sẽ kiểm tra `git status`. Và bạn sẽ bình tĩnh tiến về phía trước. Đó chính là sự tiến bộ. Git không phải là thứ để chống lại, mà là thứ để hiểu… từng lệnh một.

Những Thói Quen Tốt Khi Làm Việc Với Git

Để thực sự làm chủ Git và biến nó thành một công cụ đắc lực, hãy từ bỏ những thói quen xấu sau:
* ❌ Không sao chép lệnh một cách mù quáng mà không hiểu ý nghĩa.
* ❌ Không còn sợ hãi việc làm hỏng mọi thứ, vì Git luôn có cách để khôi phục.
* ❌ Không vội vàng giải quyết xung đột, mà dành thời gian hiểu rõ vấn đề.
* ❌ Không coi Git như một thứ ma thuật hay bí ẩn, mà là một hệ thống logic.

Lời Khuyên Cuối Cùng Dành cho Các Nhà Phát Triển

Nếu Git vẫn còn gây bối rối cho bạn vào lúc này, đừng lo lắng – tất cả chúng ta đều từng trải qua cảm giác đó. Bạn không cần phải nắm vững mọi ngóc ngách của nó. Bạn chỉ cần làm quen với những kiến thức cơ bản và tin rằng sự rõ ràng sẽ đến cùng với việc sử dụng thường xuyên.

Các lệnh Git không phải là về sự hoàn hảo, mà là về sự tiến bộ, lịch sử và việc giúp các kỹ sư phần mềm học hỏi mà không làm mất đi công việc của họ 💻. Hãy dành thời gian. Hãy mắc lỗi. Hãy commit một cách cẩn thận.

Chúc bạn có những commit sạch sẽ, ít xung đột hơn và sự tự tin trên hành trình khám phá Git của mình, các bạn nhé 💙.

Chỉ mục