Domain 5 · 9 phút đọc

Interactive rebase: dọn lịch sử trước khi merge

Interactive Rebase: Cleaning History Before Merge

Trong lúc làm việc bạn thường commit liên tục với những message kiểu wip, fix typo, oops. Trước khi gộp nhánh vào main, rebase tương tác interactive rebase cho phép bạn viết lại chuỗi commit đó thành một lịch sử sạch sẽ, mạch lạc.

Mở interactive rebase

Lệnh git rebase -i mở một trình soạn thảo liệt kê các commit bạn chọn để chỉnh sửa. Bạn thường rebase các commit tính từ một điểm gốc:

# Chỉnh 4 commit gần nhất
git rebase -i HEAD~4

# Hoặc rebase mọi commit kể từ khi tách khỏi main
git rebase -i main

Git hiển thị danh sách commit theo thứ tự cũ trên, mới dưới, mỗi dòng bắt đầu bằng một lệnh (mặc định là pick).

Các lệnh trong todo list

Bạn đổi từ pick sang lệnh khác cho từng commit:

LệnhViết tắtTác dụng
pickpGiữ commit nguyên trạng
rewordrGiữ commit nhưng sửa message
squashsGộp vào commit phía trên, giữ và gộp message
fixupfGộp vào commit phía trên, bỏ message của nó
dropdXóa commit khỏi lịch sử
đổi thứ tự dòngSắp xếp lại thứ tự commit

Squash và fixup: gộp commit

Đây là hai lệnh dùng nhiều nhất. Cả hai gộp một commit vào commit ngay phía trên nó:

  • Squash mở editor để bạn gộp message của các commit lại với nhau.
  • Fixup vứt bỏ message của commit bị gộp, chỉ giữ message của commit gốc — tiện cho những fix nhỏ kiểu sửa typo.
pick   a1b2c3d Add login form
fixup  e4f5g6h fix typo
squash i7j8k9l add validation

Kết quả: ba commit trên gộp thành một commit duy nhất.

Reword, drop và đổi thứ tự

  • Reword: viết lại message cho rõ ràng mà không đổi nội dung code.
  • Drop: bỏ hẳn một commit thử nghiệm không cần nữa (hoặc xóa dòng đó đi).
  • Reorder: chỉ cần đổi vị trí các dòng trong todo list, Git sẽ áp commit theo thứ tự mới.

Mẹo với fixup tự động

Khi sửa lỗi cho một commit cũ, hãy git commit --fixup=<hash>. Sau đó chạy git rebase -i --autosquash để Git tự xếp commit fixup vào đúng chỗ.

Đừng rebase nhánh đã chia sẻ

Interactive rebase viết lại lịch sử (tạo commit hash mới). Chỉ rebase những commit chưa push hoặc nhánh chỉ mình bạn dùng. Rebase nhánh người khác đã pull sẽ gây xung đột lịch sử nghiêm trọng.

Trọng tâm thi

Phân biệt rõ: squash gộp commit và giữ message để biên tập; fixup gộp commit nhưng bỏ message; reword chỉ đổi message; drop xóa commit. Tất cả đều viết lại lịch sử nên không dùng trên nhánh đã chia sẻ.

Tóm tắt

  • git rebase -i HEAD~N mở todo list để viết lại N commit gần nhất.
  • pick giữ nguyên, reword sửa message, squash gộp và giữ message, fixup gộp và bỏ message, drop xóa.
  • Đổi thứ tự dòng để reorder commit; --autosquash tự xếp commit --fixup.
  • Mục tiêu: biến chuỗi commit wip/oops thành lịch sử gọn, dễ review trước khi merge.
  • Chỉ rebase commit chưa chia sẻ — vì nó tạo hash mới và viết lại lịch sử.