Trong Git, tính năng git rebase
là một công cụ mạnh mẽ giúp bạn tích hợp các thay đổi từ một nhánh sang nhánh khác. Git merge
là một công cụ khác cho việc này, nhưng git rebase
cho phép bạn thay đổi lịch sử commit một cách linh hoạt. Trong bài viết này, chúng ta sẽ tìm hiểu về cách sử dụng git rebase -i HEAD~N
để gộp và squash các commit trong Git.
Rebase là gì?
Rebase là quá trình di chuyển hoặc kết hợp một chuỗi commit vào một commit cơ sở mới. Quá trình này thường được sử dụng trong ngữ cảnh làm việc với các tính năng trên các nhánh riêng biệt. Rebase thực hiện việc này bằng cách tạo các commit mới và áp dụng chúng vào commit cơ sở đã chỉ định. Quan trọng nhất, ngay cả khi nhánh trông giống như trước, nó thực sự bao gồm các commit hoàn toàn mới.
Tại sao cần sử dụng Rebase?
Mục tiêu chính của việc sử dụng rebase là duy trì lịch sử commit dự án theo hình thẳng, giúp dễ quản lý. Khi bạn đang làm việc trên một tính năng riêng (feature branch) và muốn cập nhật các thay đổi mới nhất từ nhánh chính (main branch), bạn có hai lựa chọn: gộp trực tiếp hoặc sử dụng rebase trước rồi mới gộp. Sử dụng rebase trước khi gộp giúp giữ cho lịch sử commit trông sạch sẽ, như là bạn đã luôn làm việc trên nhánh chính. Khi bạn duyệt lịch sử commit, việc này giúp bạn nhanh chóng hiểu về lịch sử dự án.
Sử dụng git rebase -i HEAD~N
với Squash
Tính năng quan trọng trong việc sử dụng rebase là git rebase -i
, với -i
viết tắt của “interactive,” cho phép bạn tương tác với các commit trong quá trình rebase. Khi bạn chạy lệnh git rebase -i HEAD~N
, bạn có thể chỉ định N là số commit bạn muốn gộp.
pick
(p): Sử dụng commit.reword
(r): Sử dụng commit và cho phép chỉnh sửa lại mô tả.edit
(e): Sử dụng commit, nhưng dừng lại để chỉnh sửa.squash
(s): Sử dụng commit và gộp vào commit trước đó.fixup
(f): Giống như squash, nhưng bỏ qua mô tả của commit này.exec
(x): Chạy một lệnh từ dòng dưới bằng shell.drop
(d): Loại bỏ commit.
Ví dụ về squash
:
Nếu bạn có các commit sau đây:
- Commit 1: “Change headlines for about and index”
- Commit 2: “Optimize markup structure in index”
- Commit 3: “Change page structure”
Nếu bạn muốn gộp commit 2 và 3 vào commit 1, bạn chỉ cần thay đổi pick
thành squash
hoặc viết tắt là s
cho commit 2 và 3 trong giao diện tương tác rebase. Sau đó, bạn có thể chỉnh sửa lại mô tả của commit mới (thường là kết hợp mô tả của tất cả các commit được gộp). Kết quả là một commit mới có mô tả là “Add feature A” chứa tất cả thay đổi từ cả ba commit ban đầu.
Chú ý quan trọng:
- Không nên sử dụng rebase cho lịch sử commit đã được đẩy lên kho lưu trữ công cộng, vì nó có thể làm mất lịch sử.
- Interactive rebase cho phép bạn kiểm soát hoàn toàn lịch sử dự án, giúp bạn chỉnh sửa và làm sạch lịch sử commit trước khi đưa chúng vào nhánh chính.
- Sử dụng
git rebase -i HEAD~N
cho phép bạn thay đổi nhiều commit cùng lúc, tạo ra một lịch sử commit sáng sủa và dễ quản lý hơn.
Kết luận:
Tính năng git rebase -i HEAD~N
là một công cụ mạnh mẽ trong Git cho phép bạn tương tác với và chỉnh sửa lịch sử commit dự án. Sử dụng squash
với rebase cho phép bạn gộp và làm sạch lịch sử commit, giúp bạn tạo ra một lịch sử commit đồng nhất và có ý nghĩa cho dự án của bạn.