Domain 3 · 8 phút đọc

Rebase cơ bản: viết lại lịch sử tuyến tính

Git Rebase Basics: Linear History

Bên cạnh merge, Git còn một cách khác để tích hợp thay đổi giữa các branch: rebase. Rebase cho lịch sử gọn và thẳng hơn, nhưng cần hiểu đúng để dùng an toàn.

git rebase làm gì?

git rebase đặt lại điểm gốc (base) của branch hiện tại lên một commit khác. Hình dung: Git "nhấc" toàn bộ các commit riêng của branch bạn ra, rồi phát lại (replay) chúng lần lượt lên đầu branch đích.

Vì các commit được tạo lại nên chúng có mã hash mới. Kết quả là lịch sử trông như thể bạn vừa bắt đầu làm tính năng từ commit mới nhất của main, cho ra một đường thẳng không có merge commit.

Rebase feature lên main

Tình huống điển hình: bạn làm trên feature, trong lúc đó main đã có commit mới của người khác. Bạn muốn đưa branch của mình lên trên những commit mới nhất đó cho gọn:

# Đứng ở branch feature
git switch feature

# Phát lại các commit của feature lên đầu main
git rebase main

Sau lệnh này, các commit của feature nằm nối tiếp ngay sau commit cuối của main, thành một đường thẳng. Nếu trong quá trình replay có chỗ đụng nhau, Git báo conflict; bạn sửa, git add, rồi git rebase --continue (hoặc git rebase --abort để hủy).

# Khi rebase gặp conflict
git add <file-da-sua>
git rebase --continue

# Hoặc bỏ cuộc, quay về trạng thái trước rebase
git rebase --abort

Rebase khác merge ở đâu?

Cùng mục đích là tích hợp thay đổi, nhưng kết quả lịch sử khác hẳn:

  • Merge giữ nguyên lịch sử có thật, tạo một merge commit ghi lại điểm hai nhánh hợp lại → lịch sử có nhánh.
  • Rebase viết lại các commit lên gốc mới → lịch sử thẳng, sạch, không có merge commit, nhưng các commit có hash mới (lịch sử đã bị thay đổi).

Pull với rebase

git pull --rebase lấy commit mới từ remote rồi rebase công việc cục bộ của bạn lên trên, thay vì tạo merge commit. Nhiều nhóm bật mặc định này để lịch sử nhánh chính luôn thẳng.

Rebase viết lại lịch sử

Vì rebase tạo commit mới (hash mới) thay cho commit cũ, đừng rebase những commit đã push/chia sẻ với người khác — sẽ làm lệch lịch sử của họ. Bài tiếp theo nói rõ "golden rule" này.

Trọng tâm thi

Đề mô tả nhu cầu "lịch sử thẳng, không merge commit" hoặc "đưa branch feature lên trên các commit mới của main" → đáp án là rebase (git rebase main). Nhớ: rebase tạo hash mới cho các commit được phát lại.

Tóm tắt

  • git rebase main (khi đứng ở feature) phát lại các commit của feature lên đầu main.
  • Kết quả: lịch sử thẳng, không có merge commit, nhưng commit có hash mới.
  • Gặp conflict khi rebase: sửa → git addgit rebase --continue; muốn hủy: git rebase --abort.
  • Rebase tiện cho lịch sử sạch, nhưng vì viết lại lịch sử nên không dùng cho commit đã chia sẻ.