0
0
Posts
Admin Team
Admin Teamtechmely

10 Lệnh Git Mới Bạn Nên Bắt Đầu Sử Dụng Ngay Hôm Nay

Đăng vào 4 ngày trước

• 8 phút đọc

Chủ đề:

GithubGitGitlab

Nếu bạn đã làm việc với Git đủ lâu, có thể bạn đã gặp phải những vấn đề thường gặp như các thao tác trở nên chậm chạp khi kho lưu trữ (repository) ngày càng lớn, vô tình ghi đè thay đổi khi chuyển nhánh, hoặc gặp khó khăn với các monorepos khổng lồ.

May mắn thay, giống như các công cụ khác, Git luôn phát triển và bổ sung các tính năng mới giúp chúng ta làm việc dễ dàng hơn. Mặc dù một số lệnh Git trong bài viết này không phải là những tính năng mới nhất, nhưng chúng vẫn là những "viên ngọc quý" ít người biết đến, có thể cải thiện đáng kể quy trình làm việc của bạn.

1. git switch - Cách an toàn hơn để chuyển nhánh

Trước Git 2.23, lệnh git checkout là lệnh chính để chuyển nhánh, nhưng nó thực hiện nhiều thao tác hơn thế. Bạn có thể dùng nó để khôi phục tệp, tạo nhánh mới hoặc kiểm tra các commit cụ thể. Điều này khiến lệnh git checkout rất mạnh mẽ nhưng cũng dễ gây nhầm lẫn, đặc biệt khi bạn chỉ muốn chuyển nhánh mà không làm thay đổi các file.

Vì vậy, Git 2.23 đã giới thiệu lệnh git switch như một thay thế tập trung hơn cho các thao tác với nhánh. Với git switch, bạn có thể chỉ tập trung vào việc quản lý nhánh:

bash Copy
# Chuyển sang nhánh khác
git switch feature-branch

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

Sự rõ ràng này giảm thiểu nguy cơ vô tình ghi đè các tệp hoặc thực hiện thay đổi không mong muốn. Nếu bạn từng ngần ngại sử dụng git checkout vì sợ làm sai, thì git switch giúp đơn giản hóa quá trình này.

2. git restore - Hoàn tác thay đổi một cách an toàn

Việc hoàn tác thay đổi thường yêu cầu sử dụng git checkout để khôi phục các tệp hoặc git reset để di chuyển HEAD của nhánh. Tuy nhiên, cả hai lệnh này đều có thể làm thay đổi trạng thái của nhánh nếu sử dụng sai: git reset có thể di chuyển HEAD của nhánh, trong khi git checkout có thể chuyển nhánh hoặc kiểm tra một commit khác, làm gián đoạn nhánh hiện tại.

Git 2.23 đã giới thiệu git restore để tập trung vào việc hoàn tác thay đổi của các tệp. Nó cung cấp một cách an toàn và rõ ràng hơn để khôi phục các thay đổi trong thư mục làm việc hoặc khu vực chờ (staging area), tách biệt rõ ràng các thao tác với tệp và các tác vụ quản lý nhánh:

bash Copy
# Hủy bỏ thay đổi trong thư mục làm việc
git restore main.js

# Hủy bỏ thay đổi trong khu vực chờ
git restore --staged main.js

Điều này đặc biệt hữu ích đối với người mới bắt đầu hoặc trong những tình huống quan trọng, khi sự chính xác rất quan trọng. Bạn có thể hoàn tác thay đổi mà không lo vô tình chuyển nhánh hoặc đặt lại commit.

3. git maintenance - Tự động duy trì tình trạng kho lưu trữ

Khi kho lưu trữ ngày càng lớn, hiệu suất có thể giảm xuống. Các thao tác như git fetch, git status hay git log có thể chậm lại, và dữ liệu không sử dụng có thể làm đầy kho lưu trữ. Trước Git 2.29, bạn phải tự chạy các lệnh như git gc (thu gom rác) hoặc git repack để tối ưu hóa kho lưu trữ.

Git 2.29 đã giới thiệu git maintenance, tự động hóa các công việc này cho bạn:

bash Copy
# Bật chế độ bảo trì tự động
git maintenance start

# Chạy các công việc dọn dẹp ngay lập tức
git maintenance run

Các hoạt động đang diễn ra phía sau:

  • Thu gom rác (Garbage Collection): Loại bỏ các đối tượng không thể truy cập, chẳng hạn như commit bị loại bỏ khi thực hiện rebase hoặc xóa nhánh.
  • Tái đóng gói (Repacking): Gom các gói bị phân mảnh lại để tăng hiệu quả lưu trữ.
  • Cập nhật đồ thị commit: Tối ưu hóa quá trình duyệt lịch sử commit, giúp tăng tốc các lệnh như git loggit blame.

Sử dụng git maintenance giúp bạn duy trì kho lưu trữ luôn khỏe mạnh mà không cần can thiệp thủ công.

4. git sparse-checkout - Xử lý hiệu quả kho lưu trữ lớn

Monorepos rất tốt để quản lý nhiều dự án, nhưng việc sao chép toàn bộ kho lưu trữ khi bạn chỉ cần một thư mục cụ thể có thể rất không hiệu quả. Git 2.25 đã giới thiệu git sparse-checkout để giải quyết vấn đề này.

bash Copy
# Bật chế độ sparse-checkout
git sparse-checkout init

# Chỉ lấy về các thư mục cụ thể
# Bạn có thể chỉ định nhiều thư mục, phân cách bằng dấu cách
git sparse-checkout set services/ docs/

Với git sparse-checkout, bạn chỉ lấy những thư mục hoặc tệp cần thiết vào thư mục làm việc của mình, phần còn lại sẽ không bị ảnh hưởng. Điều này rất hữu ích cho các nhóm lớn làm việc trên các phần khác nhau của một monorepo, tiết kiệm thời gian và dung lượng ổ đĩa.

5. git log --remerge-diff - Hiểu rõ hơn về các lần hợp nhất

Các commit hợp nhất (merge commits) thường chỉ ra các nhánh được hợp nhất, nhưng chúng không luôn giải thích rõ ràng những thay đổi cụ thể được đưa vào, đặc biệt khi có các xung đột được giải quyết trong quá trình hợp nhất.

Bắt đầu từ Git 2.35, bạn có thể sử dụng:

bash Copy
git log --remerge-diff

Tùy chọn này sẽ tái tạo lại commit hợp nhất bằng cách phát lại chiến lược hợp nhất đã ghi lại và hiển thị các thay đổi cụ thể mà nó mang lại. Điều này hữu ích khi bạn cần gỡ rối các xung đột hợp nhất hoặc xem xét lịch sử hợp nhất phức tạp.

6. git blame --ignore-rev - Bỏ qua các commit gây nhiễu

Khi nhóm của bạn thực hiện thay đổi định dạng hàng loạt, git blame có thể mất đi giá trị, vì mỗi dòng sẽ chỉ ra commit thay đổi định dạng thay vì tác giả gốc.

Giới thiệu trong Git 2.23, tùy chọn --ignore-rev cho phép bạn loại trừ các commit như vậy:

bash Copy
git blame --ignore-rev commit-hash

Để giữ lại sự loại trừ này, bạn có thể thiết lập một tệp ignore-revs:

bash Copy
# Thêm commit hash vào tệp ignore-revs
echo commit-hash >> .git-blame-ignore-revs

# Đặt Git sử dụng tệp này
git config blame.ignoreRevsFile .git-blame-ignore-revs

Điều này giúp bạn tập trung vào tác giả thực sự và rất hữu ích trong các kho mã có các cập nhật về kiểu mã (style) thường xuyên.

7. git range-diff - So sánh và theo dõi thay đổi giữa các phạm vi commit

Việc chỉnh sửa lịch sử, dù thông qua rebase, cherry-pick hay chỉnh sửa tương tác, có thể khá phức tạp. Sau khi rebase, bạn có thể tự hỏi sự khác biệt giữa các commit đã được thay đổi và những commit gốc là gì. git range-diff giúp bạn so sánh hai phạm vi commit, hiển thị sự phát triển của một phạm vi commit thành một phạm vi khác và làm nổi bật các thay đổi trong từng commit:

bash Copy
git range-diff

Lệnh này giúp bạn hiểu rõ quá trình phát triển của một tính năng hay bản sửa lỗi qua các nhánh khác nhau.

8. git worktree - Làm việc với nhiều nhánh cùng lúc

Việc chuyển nhánh trong một thư mục làm việc đơn lẻ có thể làm gián đoạn quy trình làm việc của bạn, đặc biệt khi bạn cần làm việc trên nhiều nhánh cùng lúc. Với git worktree, bạn có thể tạo thêm các thư mục làm việc liên kết với cùng một kho lưu trữ.

bash Copy
# Thêm một worktree cho nhánh cụ thể
git worktree add ../feature-branch feature-branch

```bash
# Xóa worktree khi hoàn tất
git worktree remove ../feature-branch

Lệnh git worktree cho phép bạn làm việc với các nhánh khác nhau mà không cần phải chuyển nhánh hoặc dùng đến stash. Bạn cũng có thể tạo ra các worktree tạm thời với HEAD tách rời để thử nghiệm, hoặc cô lập quá trình build và deploy vào các thư mục làm việc riêng biệt.

9. git rebase --update-refs - Giữ các tham chiếu luôn đồng bộ

Rebase thay đổi lịch sử commit bằng cách thay thế các commit cũ bằng các commit mới, nhưng điều này thường khiến các con trỏ nhánh hoặc thẻ (tags) tham chiếu đến các commit cũ. Git 2.38 đã giới thiệu tùy chọn --update-refs để tự động xử lý vấn đề này.

bash Copy
git rebase --update-refs

Với lệnh này, Git sẽ đảm bảo rằng các nhánh và thẻ liên quan đến các commit đã được thay thế sẽ được cập nhật để phản ánh lịch sử mới. Điều này loại bỏ việc phải cập nhật thủ công các tham chiếu và đảm bảo tính nhất quán trong kho lưu trữ của bạn.

Để có nhiều quyền kiểm soát hơn, bạn có thể cấu hình Git để luôn cập nhật các tham chiếu nhất định bằng cách cài đặt:

bash Copy
git config rebase.updateRefs true

Tính năng này rất hữu ích trong các quy trình làm việc hợp tác hoặc khi bạn quản lý nhiều tham chiếu gắn liền với cùng một lịch sử.

10. git commit --fixupgit rebase --autosquash - Sửa chữa commit

Mặc dù không phải là tính năng mới (được giới thiệu trong Git 1.7.4 vào năm 2011), nhưng git commit --fixup thường bị bỏ qua mặc dù đây là một công cụ rất hữu ích để duy trì lịch sử commit sạch sẽ. Khi làm việc trên một tính năng, có thể bạn nhận ra rằng mình cần sửa hoặc cải thiện một commit trước đó. Việc chỉnh sửa thủ công lịch sử commit để bao gồm các thay đổi này có thể dẫn đến sai sót. Git cung cấp các lệnh git commit --fixupgit rebase --autosquash để tự động hóa quá trình này.

bash Copy
# Tạo một commit fixup nhắm đến commit cụ thể
git commit --fixup=<commit-hash>

# Sau đó, trong quá trình rebase tương tác, tự động gộp các commit fixup
git rebase -i --autosquash <base-branch>

Tùy chọn --fixup sẽ tạo một commit được đánh dấu để tự động được gộp vào commit mục tiêu trong quá trình rebase tương tác với --autosquash. Điều này giúp bạn làm sạch lịch sử commit trước khi hợp nhất các thay đổi, và đảm bảo rằng các thay đổi liên quan được nhóm lại với nhau mà không cần thao tác thủ công.


Kết Luận

Các lệnh Git mà chúng ta đã thảo luận trong bài viết này sẽ giúp bạn giải quyết những vấn đề thực tế mà bạn có thể gặp phải trong công việc hàng ngày khi sử dụng Git. Cho dù bạn đang quản lý một monorepo, xử lý lịch sử commit lớn hay cố gắng giữ kho lưu trữ của mình sạch sẽ, những giải pháp thực tiễn này sẽ mang lại sự khác biệt đáng kể. Hãy bắt đầu với một hoặc hai lệnh phù hợp với quy trình làm việc hiện tại của bạn, và bạn sẽ ngạc nhiên về sự cải thiện trong hiệu suất công việc.

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào