Xin chào các bạn, hôm nay chúng ta sẽ đi tìm hiểu vào một số chủ đề nâng cao của Git, một trong những hệ thống quản lý phiên bản mã nguồn phổ biến nhất hiện nay. Chúng ta sẽ tìm hiểu về interactive rebase, bisect và cách quản lý các submodules.
1. Interactive Rebase
Interactive rebase là một công cụ mạnh mẽ trong Git cho phép bạn chỉnh sửa và thay đổi lịch sử commit theo cách bạn muốn. Với interactive rebase, bạn có thể dễ dàng sắp xếp lại, chỉnh sửa, hay thậm chí bỏ qua một số commit.
Để sử dụng interactive rebase, bạn sẽ sử dụng lệnh git rebase -i.
Giả sử bạn muốn sửa ba commit cuối cùng. Bạn sẽ sử dụng lệnh git rebase -i HEAD~3. Màn hình editor sẽ hiển thị danh sách các commit cùng với một danh sách các lệnh bạn có thể sử dụng.
Các commit được liệt kê theo thứ tự ngược, nghĩa là commit mới nhất sẽ được hiển thị cuối cùng.
2. Bisect
Git bisect là một công cụ mạnh mẽ cho việc tìm ra commit nào đã gây ra lỗi. Đặc biệt hữu ích khi bạn phải làm việc với lịch sử commit dài.
Sử dụng git bisect bắt đầu bằng việc chạy lệnh git bisect start, sau đó bạn chỉ định một commit tốt và một commit xấu (thường là commit hiện tại). Git sẽ sau đó chọn một commit ở giữa để kiểm tra. Bạn kiểm tra xem commit đó có lỗi hay không, nếu có, bạn chạy git bisect bad, nếu không, bạn chạy git bisect good. Quá trình này sẽ tiếp tục cho đến khi tìm ra commit gây ra lỗi.
Giả sử bạn đang làm việc trên dự án và phát hiện ra một lỗi mới trong ứng dụng của bạn. Bạn không chắc chắn khi nào lỗi này xuất hiện, nhưng bạn biết rằng cách đây hai tuần, ứng dụng vẫn đang hoạt động tốt.
Dưới đây là cách bạn sẽ sử dụng git bisect để tìm ra commit gây ra lỗi.
Đầu tiên, bạn khởi động quá trình bisect bằng cách chạy lệnh git bisect start.
Tiếp theo, bạn đánh dấu commit hiện tại (mà bạn biết có lỗi) là "bad" bằng cách chạy lệnh git bisect bad.
Bây giờ, bạn cần đánh dấu một commit "good", mà bạn biết chắc chắn rằng ứng dụng vẫn hoạt động tốt tại thời điểm đó. Giả sử điều đó là hai tuần trước, bạn có thể sử dụng lệnh git bisect good HEAD~14 (nếu bạn commit mỗi ngày).
Git sẽ sau đó kiểm tra commit nằm giữa commit "good" và "bad". Git sẽ checkout đến commit đó và bạn sẽ cần kiểm tra xem lỗi có tồn tại trong commit đó hay không. Nếu lỗi tồn tại, bạn chạy git bisect bad. Nếu lỗi không tồn tại, bạn chạy git bisect good.
Git sẽ tiếp tục quá trình này, chọn commit ở giữa "good" và "bad" cho đến khi nó tìm ra commit chính xác nơi lỗi đã xảy ra. Khi đó, Git sẽ hiển thị cho bạn ID của commit đó.
Sau khi tìm ra commit gây ra lỗi, bạn có thể kết thúc quá trình bisect bằng cách chạy lệnh git bisect reset.
Với ví dụ trên, bạn đã thấy cách git bisect có thể giúp bạn tìm ra chính xác commit nào đã gây ra lỗi trong dự án của bạn.
3. Quản lý submodules
Submodule trong Git cho phép bạn giữ một kho lưu trữ Git như một thư mục con trong một kho lưu trữ Git khác. Điều này rất hữu ích khi bạn muốn bao gồm các thư viện hoặc các dự án khác mà bạn muốn theo dõi phiên bản.
Để thêm một submodule, bạn sử dụng lệnh git submodule add [URL] [path/to/submodule]. Để cập nhật submodule, bạn có thể chạy git submodule update --remote.
Tuy nhiên, việc quản lý submodules có thể trở nên phức tạp. Ví dụ, nếu một người khác clone kho lưu trữ của bạn, họ cũng cần chạy git submodule init và git submodule update để nhận được các submodules.
Giả sử bạn đang làm việc trên một dự án có tên là myproject và bạn muốn thêm một thư viện mã nguồn mở có tên là mylib (được lưu trữ tại https://github.com/user/mylib.git) như một submodule.
Đầu tiên, bạn chuyển đến thư mục dự án của mình:
Sau đó, bạn thêm mylib như một submodule bằng cách chạy lệnh git submodule add:
Điều này sẽ clone thư viện mylib vào thư mục mylib trong dự án của bạn và nó cũng tạo ra một tệp mới có tên là .gitmodules chứa thông tin về các submodule.
Bạn có thể kiểm tra tình trạng của submodule bằng lệnh git status:
Nó sẽ cho bạn biết về sự tồn tại của submodule mới.
Để commit thay đổi này, bạn sẽ chạy các lệnh git commit và git push như bình thường:
Trên một máy tính khác hoặc thư mục khác, khi bạn clone dự án, submodule sẽ không được clone cùng lúc. Để clone cả dự án và các submodule, bạn cần chạy:
Nếu bạn đã clone dự án nhưng quên --recurse-submodules, bạn có thể chạy các lệnh sau để khởi tạo và cập nhật submodule:
Để cập nhật submodule với các commit mới nhất từ kho lưu trữ gốc của nó, bạn chạy:
Vậy là bạn đã biết cách thêm, cập nhật và quản lý submodules trong Git. Hãy nhớ rằng làm việc với submodules có thể hơi phức tạp, nhưng nó rất hữu ích khi bạn muốn bao gồm các dự án hoặc thư viện khác vào dự án của mình.
Tôi hy vọng bạn đã hiểu rõ hơn về Interactive Rebase, Bisec và Quản lý Submodules của Git sau bài viết này. Chúc các bạn có những trải nghiệm tuyệt vời với Git!