Rebase vs Merge: chọn cái nào?
Rebase vs Merge: Which to Use?
Cả merge và rebase đều tích hợp thay đổi giữa các branch, nên câu hỏi muôn thuở là: khi nào dùng cái nào? Bài này so sánh trực diện và đưa ra một quy tắc vàng để bạn không bao giờ làm hỏng lịch sử của người khác.
So sánh trực diện
| Tiêu chí | Merge | Rebase |
|---|---|---|
| Lịch sử | Giữ đúng lịch sử thật, có nhánh | Viết lại thành đường thẳng |
| Merge commit | Có (khi 3-way) | Không |
| Hash commit | Giữ nguyên | Tạo mới |
| Ưu điểm | Không sửa lịch sử, an toàn khi chia sẻ | Lịch sử sạch, dễ đọc, dễ git bisect |
| Nhược điểm | Lịch sử nhiều nhánh, rối khi nhìn lại | Sửa lịch sử → nguy hiểm nếu đã chia sẻ |
Cốt lõi: merge ghi lại sự thật (hai nhánh đã từng song song rồi hợp lại), còn rebase kể một câu chuyện gọn hơn (như thể mọi thứ làm tuần tự trên một đường thẳng).
Golden rule
Đây là quy tắc quan trọng nhất khi dùng rebase:
Đừng bao giờ rebase những commit đã được push lên nhánh công khai / đã chia sẻ với người khác.
Lý do: rebase tạo commit mới với hash mới thay cho commit cũ. Nếu đồng nghiệp đã pull các commit cũ về, lịch sử của họ và của bạn sẽ lệch nhau; lúc push họ sẽ gặp rối và có nguy cơ mất hoặc trùng lặp commit.
Vì vậy chỉ rebase trên branch riêng của bạn mà chưa ai khác dùng. Còn nhánh chung như main đã chia sẻ thì để yên.
Golden rule của rebase
Chỉ rebase commit còn nằm cục bộ, chưa chia sẻ. Đã git push lên nhánh mà người khác cũng dùng thì không rebase — hãy merge. Cố tình rebase rồi push --force lên nhánh chung là cách nhanh nhất để làm hỏng repo của cả nhóm.
Khi nào dùng cái nào?
Hướng dẫn thực dụng cho đa số nhóm:
- Dùng rebase để dọn dẹp branch feature cục bộ của bạn trước khi mở pull request — đưa nó lên trên
mainmới nhất cho lịch sử thẳng và dễ review. - Dùng merge để đưa một branch feature đã hoàn thiện vào
main. Merge commit đánh dấu rõ "tính năng X được nhập vào lúc này". - Dùng merge (không rebase) cho bất kỳ nhánh nào nhiều người cùng làm hoặc đã public.
- Phổ biến nhất là kết hợp: rebase feature lên main cho gọn → rồi merge feature vào main.
Squash khi merge
Nhiều nhóm dùng "squash and merge" trên pull request: gộp tất cả commit của branch thành một commit duy nhất khi nhập vào main. Đây là cách nữa để giữ lịch sử main sạch mà không phải rebase thủ công.
Trọng tâm thi
Câu hỏi kinh điển: "có nên rebase nhánh đã chia sẻ/public không?" → Không, vì rebase viết lại lịch sử (hash mới) gây lệch cho người khác. Rebase chỉ an toàn trên commit cục bộ, chưa push/chia sẻ.
Tóm tắt
- Merge: giữ lịch sử thật, tạo merge commit, an toàn khi đã chia sẻ — nhưng lịch sử nhiều nhánh.
- Rebase: lịch sử thẳng và sạch — nhưng tạo hash mới, viết lại lịch sử.
- Golden rule: không rebase commit đã push lên nhánh công khai / đã chia sẻ.
- Thực tế: rebase branch feature cục bộ cho gọn, rồi merge vào
main.