Rebase là một cách khác để tích hợp các thay đổi giữa các branch. Nếu bạn đã quen với lệnh merge, thì rebase thường được dùng để đạt được những mục đích tương tự, nhưng theo một cách tiếp cận khác.
Khi bạn muốn kết hợp các thay đổi giữa hai branch, rebase sẽ giúp “chuyển” các commit từ branch hiện tại sang một vị trí mới trên branch khác, như thể các commit đó vừa mới được tạo ra từ branch đích.
Bạn có thể hình dung rebase giống như việc “xếp lại” lịch sử commit: thay vì để các commit nằm ở vị trí cũ, Git sẽ lấy từng commit và đặt chúng lên đỉnh của branch mà bạn chọn. Toàn bộ nội dung thay đổi của commit vẫn giữ nguyên, chỉ có vị trí và liên kết lịch sử của commit là được cập nhật lại.

Giả sử như bạn tạo nhánh mới từ main tại thời điểm commit có hàm f(x), trong khi bạn đang thực hiện tính năng của mình thì main thêm một commit mới để sửa lỗi hàm f(x), và bạn muốn sử dụng phiên bản mới của hàm f(x) đó. Lúc này bạn có thể rebase nhánh của mình lên commit mới nhất của main để đạt mục đích.
Ngoài việc viết lại toàn bộ branch, rebase còn có khả năng thao tác trên từng commit riêng lẻ theo nhiều cách đa dạng như:
Chia nhỏ commit (splitting).
Xóa commit.
Sửa đổi commit (amending).
Sắp xếp lại thứ tự commit (reordering).
Sửa nội dung message (rewording).
Gộp nhiều commit thành một (squashing).
Các tính năng mạnh mẽ này được truy cập thông qua một menu gọi là interactive rebase mà chúng ta sẽ thảo luận ở học phần tiếp theo.
Theo thiết kế, các Git commit là bất biến (immutable): nghĩa là chúng không thể bị thay đổi dưới bất kỳ hình thức nào sau khi đã được tạo ra. Để rebase có thể sửa đổi lịch sử, nó không thể sửa trực tiếp commit hiện có, nên thay vào đó nó sẽ thay thế chúng.
Đằng sau hậu trường (behind-the-scenes), Git bắt đầu rebase bằng cách:
Đưa các commit cần rebase sang một khu vực chứa tạm.
Tạo bản sao của từng commit một.
Ghi lại chúng vào cây lịch sử với các con trỏ cha mới.

Mặc dù các bản sao này chứa cùng nội dung thay đổi như commit gốc, nhưng chúng lại có SHA-1 checksums hoàn toàn khác - nghĩa là đối với Git, chúng là những commit mới toanh. Bạn cần chú ý đến đặc điểm này khi repository đã được chia sẻ với các thành viên khác để cùng xây dựng dự án.
Quy tắc vàng: Tránh rebase các remote branch đang tồn tại ở cả local và remote repository. Nếu các commit đã được đẩy lên server mà lại bị bạn rebase, trong khi người khác đang làm việc trên đó, thì các xung đột merge cực kỳ phức tạp sẽ xảy ra.
Về bản chất, rebase tạo ra các commit mới thay cho commit cũ để di chuyển các thay đổi lên đầu một nhánh khác, làm cho lịch sử dự án trở nên gọn gàng và dễ hiểu hơn. Tuy nhiên, cần đặc biệt lưu ý không rebase các nhánh đã được chia sẻ chung để tránh gây ra xung đột phức tạp. Những thao tác nâng cao với rebase sẽ được trình bày chi tiết ở phần sau.
Tiếp theo: Thực hiện Rebase