5 Kỹ thuật Git nâng cao mà các lập trình viên nên biết 2025
Git là một trong những công cụ mạnh mẽ nhất trong bộ công cụ của các lập trình viên, nhưng nhiều người chỉ khai thác được bề nổi các khả năng của nó chứ chưa đi sâu được vào bản chất. Mặc dù các lệnh cơ bản như git add
, git commit
, và git push
là thiết yếu, nhưng việc thành thạo các kỹ thuật Git nâng cao có thể cải thiện đáng kể quy trình làm việc của bạn, giúp bạn quản lý các dự án phức tạp và giúp bạn tránh khỏi những rắc rối tiềm ẩn khi mọi thứ diễn ra không như mong đợi.
Trong bài viết này, chúng ta sẽ khám phá năm kỹ thuật Git nâng cao mà mọi lập trình viên đều nên biết. Hãy cùng tìm hiểu nhé!
1. Interactive Rebase: Viết lại lịch sử commit như một chuyên gia
Interactive Rebase là gì?
Interactive rebase (git rebase -i
) là một tính năng mạnh mẽ cho phép bạn viết lại lịch sử commit của mình. Tính năng này đặc biệt hữu ích để dọn dẹp các commit lộn xộn trước khi đẩy chúng lên kho lưu trữ được chia sẻ hoặc chuẩn bị mã của bạn cho yêu cầu pull.
Tại sao nên sử dụng Interactive Rebase?
- Lịch sử commit sạch: Rebase tương tác giúp bạn nén nhiều cam kết nhỏ thành một commit có ý nghĩa duy nhất, giúp lịch sử của bạn dễ đọc hơn.
- Chỉnh sửa tin nhắn commit: Bạn có thể chỉnh sửa tin nhắn commit để làm cho chúng mô tả rõ ràng hơn hoặc sửa lỗi đánh máy.
- Sắp xếp lại các commit: Nếu bạn vô tình commit các thay đổi không theo thứ tự, tính năng sắp xếp lại tương tác cho phép bạn sắp xếp lại chúng.
- Xóa các commit không cần thiết: Bạn có thể xóa các commit không còn cần thiết.
Cách sử dụng Interactive Rebase
Để bắt đầu một rebase tương tác, hãy sử dụng lệnh sau:
git rebase -i HEAD~n
Trong đó: n là số lượng commit bạn muốn rebase tương tác. Ví dụ, nếu bạn muốn rebase ba commit cuối cùng:
git rebase -i HEAD~3
Thao tác này sẽ mở một trình soạn thảo có nội dung tương tự như sau:
pick abc123 Commit message 1
pick def456 Commit message 2
pick ghi789 Commit message 3
Bây giờ bạn có thể thực hiện nhiều hành động khác nhau bằng cách thay thế từ pick
bằng một trong các lệnh sau:
- squash (hoặc s): Kết hợp commit này với commit trước đó.
- chỉnh sửa (hoặc e): Tạm dừng quá trình rebase để sửa đổi cam kết này.
- reword (hoặc r): Thay đổi thông điệp cam kết.
- drop (hoặc d): Xóa hoàn toàn cam kết.
- fixup (hoặc f): Tương tự như squash, nhưng loại bỏ thông báo xác nhận.
Sau khi lưu và đóng trình chỉnh sửa, Git sẽ áp dụng các thay đổi của bạn. Nếu bạn chọn chỉnh sửa hoặc xóa commit, Git sẽ tạm dừng quá trình rebase, cho phép bạn thực hiện các sửa đổi tiếp theo.
Ví dụ: Nén các cam kết
Giả sử bạn có ba cam kết mà bạn muốn kết hợp thành một:
abc123 Add feature X
def456 Fix bug in feature X
ghi789 Refactor feature X
Chạy lệnh rebase tương tác:
git rebase -i HEAD~3
Trong trình soạn thảo, hãy thay đổi dòng thứ hai và thứ ba thành squash
:
pick abc123 Add feature X
squash def456 Fix bug in feature X
squash ghi789 Refactor feature X
Lưu và đóng trình chỉnh sửa. Sau đó, Git sẽ nhắc bạn tạo một thông báo commit mới cho commit kết hợp. Sau khi chỉnh sửa thông báo, lịch sử của bạn sẽ chứa một commit duy nhất với tất cả các thay đổi.
Những lưu ý khi sử dụng Interactive Rebase
- Tránh Rebase các nhánh chia sẻ: Không bao giờ rebase các commit đã được đẩy lên một nhánh chia sẻ. Điều này có thể gây ra xung đột cho các lập trình viên khác đã dựa trên các commit đó để làm việc.
- Sử dụng thận trọng: Việc viết lại lịch sử có thể nguy hiểm nếu không được thực hiện cẩn thận. Luôn đảm bảo bạn hiểu rõ những hàm ý trước khi tiến hành.
2. Git Bisect: Tìm lỗi nhanh hơn
Git Bisect là gì?
git bisect
là một công cụ tìm kiếm nhị phân giúp bạn nhanh chóng xác định commit đã gây ra lỗi. Thay vì kiểm tra thủ công từng commit, công cụ này tự động hóa quy trình bằng cách thu hẹp phạm vi commit gây ra lỗi.
Tại sao nên sử dụng Git Bisect?
- Gỡ lỗi hiệu quả: Thay vì kiểm tra mọi lần xác nhận,
git bisect
giúp giảm một nửa số lần kiểm tra bạn cần thực hiện mỗi lần. - Xác định chính xác các cam kết có vấn đề: Khi đã xác định được cam kết có vấn đề, bạn có thể tập trung nỗ lực gỡ lỗi vào thay đổi cụ thể đó.
- Kiểm thử tự động: Bạn có thể tích hợp các bài kiểm tra tự động
git bisect
để đẩy nhanh quá trình hơn nữa.
Cách sử dụng Git Bisect
B1 - Bắt đầu quá trình:
git bisect start
B2 - Đánh dấu commit hiện tại là "xấu" (tức là commit này chứa lỗi):
git bisect bad
B3 - Đánh dấu một commit tốt đã biết (tức là một commit không tồn tại lỗi):
git bisect good <commit-hash>
Thay thế <commit-hash>
bằng hàm băm của commit tốt đã biết.
B4 - Git sẽ tự động kiểm tra một commit ở giữa commit tốt và commit xấu. Kiểm tra mã tại commit này để xác định xem lỗi có tồn tại không.
B5 - Nếu lỗi tồn tại, hãy đánh dấu commit là không hợp lệ:
git bisect bad
Nếu lỗi không tồn tại, hãy đánh dấu commit là tốt:
git bisect good
Lặp lại bước 4 và 5 cho đến khi Git xác định được chính xác commit gây ra lỗi.
Khi bạn đã tìm thấy commit có vấn đề, hãy đặt lại quy trình:
git bisect reset
Tự động hóa Git Bisect với Scripts
Nếu bạn có các bài kiểm tra tự động, bạn có thể sử dụng git bisect
để tăng tốc quá trình. Ví dụ, nếu bạn có một tập lệnh kiểm tra có tên là test.sh
, bạn có thể chạy:
git bisect run ./test.sh
Git sẽ tự động chạy tập lệnh khi có lệnh xác nhận và đánh dấu lệnh đó là tốt hay xấu dựa trên mã thoát của tập lệnh.
3. Git Stash: Lưu tạm thời các thay đổi mà không cần commit
Git Stash là gì?
git stashlà lệnh cho phép bạn tạm thời lưu các thay đổi mà bạn chưa sẵn sàng cam kết. Điều này đặc biệt hữu ích khi bạn cần chuyển nhánh hoặc kéo các bản cập nhật từ kho lưu trữ từ xa nhưng không muốn mất công việc chưa cam kết của mình.
Tại sao nên sử dụng Git Stash?
- Chuyển nhánh an toàn: Bạn có thể lưu trữ những thay đổi và chuyển nhánh mà không cần phải thực hiện công việc chưa hoàn thành.
- Tránh xung đột: Stashing ngăn ngừa xung đột khi kéo các bản cập nhật từ kho lưu trữ từ xa.
- Giữ thư mục làm việc của bạn sạch sẽ: Tính năng stashing cho phép bạn giữ thư mục làm việc của mình sạch sẽ trong khi bạn làm các tác vụ khác.
Cách sử dụng Git Stash
Để lưu trữ những thay đổi hiện tại của bạn:
git stash
Thao tác này sẽ lưu các thay đổi của bạn và đưa thư mục làm việc trở lại lần xác nhận cuối cùng.
Để áp dụng bản lưu trữ mới nhất:
git stash apply
Để áp dụng và xóa bản lưu trữ gần đây nhất:
git stash pop
Để liệt kê tất cả các kho lưu trữ:
git stash list
Để áp dụng một kho dự trữ cụ thể:
git stash apply stash@{n}
Thay thế n bằng chỉ mục của stash mà bạn muốn áp dụng.
Lệnh stash nâng cao
Lưu trũ cùng với một thông điệp: Bạn có thể thêm một thông điệp vào nơi cất giữ của mình để nhận dạng tốt hơn:
git stash save "Work in progress on feature X"
Stash Untracked Files: Theo mặc định, git stash
chỉ stash các tệp được theo dõi. Để bao gồm các tệp không được theo dõi, hãy sử dụng:
git stash -u
Stash Tất cả các thay đổi, bao gồm các tệp bị bỏ qua: Để stash mọi thứ, bao gồm các tệp bị bỏ qua, hãy sử dụng:
git stash -a
Ví dụ: Sử dụng Git Stash để chuyển nhánh
Giả sử bạn đang làm việc trên một nhánh tính năng và cần chuyển sang main để xem xét yêu cầu pull, nhưng bạn chưa sẵn sàng commit các thay đổi của mình. Bạn có thể lưu trữ các thay đổi của mình và chuyển nhánh:
git stash
git checkout main
Sau khi xem xét yêu cầu pull, bạn có thể quay lại nhánh tính năng của mình và áp dụng các thay đổi đã lưu trữ:
git checkout feature-branch
git stash pop
4. Git Worktrees: Làm việc trên nhiều nhánh cùng lúc
Git Worktree là gì?
git worktreecho phép bạn có nhiều thư mục làm việc được đính kèm vào cùng một kho lưu trữ. Điều này đặc biệt hữu ích khi bạn cần làm việc trên nhiều nhánh cùng lúc mà không cần chuyển đổi qua lại.
Tại sao nên sử dụng Git Worktree?
- Tránh việc chuyển đổi nhánh liên tục: Với
git worktree
, bạn có thể có các thư mục riêng biệt cho các nhánh khác nhau, loại bỏ nhu cầu phải liên tục chuyển đổi nhánh. - Cô lập công việc: Mỗi cây công việc đều được cô lập, do đó bạn có thể làm việc trên các tính năng hoặc sửa lỗi khác nhau mà không ảnh hưởng đến nhau.
- Kiểm tra những thay đổi song song: Bạn có thể kiểm tra những thay đổi trong một nhánh trong khi vẫn tiếp tục làm việc trên nhánh khác.
Cách sử dụng Git Worktree
Tạo một worktree mới:
git worktree add ../new-directory branch-name
Thao tác này sẽ tạo một thư mục mới có tên là new-directory
và kiểm tra branch-name
trong đó.
Liệt kê tất cả các worktree:
git worktree list
Xóa worktree:
git worktree remove ../new-directory
Ví dụ: Sử dụng Git Worktree để làm việc trên nhiều tính năng
Giả sử bạn đang làm việc trên một nhánh tính năng có tên là feature-x
và cần xem xét yêu cầu pull trên feature-y
. Thay vì chuyển đổi các nhánh, bạn có thể tạo một cây làm việc mới cho feature-y
:
git worktree add ../feature-y feature-y
Bây giờ bạn có thể làm việc trong thư mục gốc feature-x
và xem lại trong thư mục mới feature-y
.
5. Git Hooks: Tự động hóa các tác vụ lặp lại
Git Hooks là gì?
Git hooks là các tập lệnh chạy tự động tại một số điểm nhất định trong quy trình làm việc của Git, chẳng hạn như trước hoặc sau khi commit, push hoặc merge. Chúng cho phép bạn tự động hóa các tác vụ lặp lại, thực thi các tiêu chuẩn mã hóa và ngăn ngừa lỗi.
Tại sao nên sử dụng Git Hooks?
- Áp dụng Tiêu chuẩn mã hóa: Bạn có thể sử dụng các hook trước khi cam kết để chạy trình kiểm tra lỗi hoặc trình định dạng trước khi cam kết mã.
- Ngăn chặn các commit không hợp lệ: Các hook trước khi đẩy có thể ngăn bạn đẩy mã không đáp ứng các tiêu chí nhất định (ví dụ: không vượt qua được các bài kiểm tra).
- Tự động triển khai: Các hook sau khi nhận có thể tự động hóa các quy trình triển khai khi mã được đẩy lên kho lưu trữ từ xa.
Git Hooks phổ biến
pre-commit
: Chạy trước khi commit được tạo. Hữu ích khi chạy linter hoặc kiểm tra.pre-push
: Chạy trước khi lệnh push được thực hiện. Hữu ích để ngăn chặn lệnh push không thành công.post-receive
: Chạy trên kho lưu trữ từ xa sau khi nhận được lệnh đẩy. Hữu ích để kích hoạt triển khai.
Cách sử dụng Git Hooks
Git hook nằm trong thư mục .git/hooks
kho lưu trữ của bạn. Để tạo hook, chỉ cần thêm một tập lệnh có tên thích hợp (ví dụ: pre-commit) vào thư mục này.
Ví dụ: Thực thi định dạng mã bằng Pre-Commit Hook Tạo một tập tin pre-commit trong .git/hooks:
touch .git/hooks/pre-commit
chmod +x .git/hooks/pre-commit
Thêm đoạn mã sau vào tệp pre-commit:
#!/bin/sh
# Run a code formatter (e.g., Prettier) before committing
npx prettier --write .
git add .
Bây giờ, mỗi lần bạn commit, mã sẽ được định dạng tự động.
Kết luận
Việc thành thạo các kỹ thuật Git nâng cao này—rebase tương tác, Git bisect, Git stash, Git worktrees và Git hooks — có thể đưa quy trình phát triển của bạn lên một tầm cao mới. Cho dù bạn đang dọn dẹp lịch sử commit, gỡ lỗi hiệu quả hay tự động hóa các tác vụ lặp đi lặp lại, các công cụ này sẽ giúp bạn trở thành một lập trình viên năng suất và tự tin hơn.
All rights reserved
Bình luận