Git rebase hay merge: chọn cách nào cho lịch sử sạch và an toàn?

  • author-image

    Nguyễn Đình Cường

  • blog-tag
  • blog-comment 0 comment
  • created-date 09 Nov, 2026
blog-thumbnail

Merge và rebase đều dùng để tích hợp thay đổi từ nhánh này sang nhánh khác, nhưng cách làm và hệ quả lên lịch sử Git khác nhau. Nhiều người mới nghe đồn rebase "nguy hiểm" nên né tránh, số khác dùng bừa gây rắc rối cho cả nhóm. Bài này giúp bạn hiểu từng cách và chọn đúng.

Merge hoạt động thế nào?

Merge kết hợp hai nhánh bằng cách tạo một merge commit có hai commit cha. Lịch sử của cả hai nhánh được giữ nguyên, bạn thấy rõ chỗ nhánh tách ra và nhập lại.

git switch feature/logingit merge main
  • Ưu điểm: không viết lại lịch sử, an toàn, giữ nguyên bối cảnh thật của quá trình làm việc.
  • Nhược điểm: lịch sử có nhiều merge commit, đồ thị phân nhánh chằng chịt, khó đọc nếu nhóm gộp main vào nhánh liên tục.

Rebase hoạt động thế nào?

Rebase lấy các commit của nhánh bạn và "phát lại" chúng lên trên đầu một điểm khác (thường là đầu nhánh main mới nhất). Kết quả là lịch sử thẳng một đường, như thể bạn bắt đầu làm việc từ commit mới nhất của main.

git switch feature/logingit fetch origingit rebase origin/main
  • Ưu điểm: lịch sử tuyến tính, sạch, dễ đọc, dễ dùng git log và git bisect.
  • Nhược điểm: viết lại commit (hash mới), có thể phải giải quyết xung đột nhiều lần (mỗi commit một lần), và nguy hiểm nếu rebase nhánh đã chia sẻ.

Quy tắc vàng của rebase

Đừng rebase các commit đã được đẩy lên nhánh dùng chung mà người khác đang dựa vào.

Vì rebase tạo commit mới thay cho commit cũ, nếu đồng đội đã có commit cũ, lịch sử của họ và của bạn sẽ phân kỳ, dẫn đến hỗn loạn khi push (phải force push) và pull. Rebase an toàn khi nhánh chỉ có mình bạn dùng, hoặc chưa push.

So sánh nhanh

Tiêu chíMergeRebase
Lịch sửCó nhánh, có merge commitThẳng một đường
Viết lại lịch sửKhôngCó
Xung độtGiải quyết một lầnCó thể nhiều lần
An toàn cho nhánh chungCóKhông
Đọc lịch sửHơi rối nếu nhiều nhánhDễ

Khi nào dùng cái nào?

  1. Cập nhật nhánh tính năng cá nhân với main mới nhất: rebase thường được ưa chuộng (nếu nhánh chưa chia sẻ), hoặc merge nếu bạn muốn đơn giản.
  2. Đưa nhánh tính năng vào main (qua pull request): tùy chính sách nhóm: merge commit (giữ nguyên nhánh), squash merge (gom thành một commit), hoặc rebase and merge (đặt từng commit thẳng lên main).
  3. Nhánh dùng chung nhiều người (main, develop): dùng merge, không rebase.
  4. Dọn commit trước khi mở pull request: dùng rebase interactive.

Rebase interactive: dọn dẹp commit

Chạy git rebase -i HEAD~4 để chỉnh sửa 4 commit gần nhất. Một bảng hiện ra:

pick a1b2c3d Thêm form đăng nhậppick d4e5f6a Sửa lỗi chính tảpick 1a2b3c4 Thêm kiểm tra mật khẩupick 9f8e7d6 Sửa lại test

Bạn đổi từ khóa ở đầu dòng:

  • pick: giữ nguyên commit.
  • reword: giữ commit nhưng sửa message.
  • squash: gộp vào commit trước và gộp message.
  • fixup: gộp vào commit trước và bỏ message của nó.
  • drop: xóa commit.

Ví dụ, đổi hai dòng "sửa" thành fixup để gộp vào commit tương ứng, lịch sử còn hai commit sạch trước khi gửi review. Chỉ làm điều này với commit chưa chia sẻ cho người khác dựa vào.

Khi rebase gặp xung đột

  1. Git dừng lại ở commit gây xung đột. Dùng git status xem file nào.
  2. Sửa file, bỏ các dấu xung đột, rồi git add.
  3. Chạy git rebase --continue để tiếp tục.
  4. Muốn hủy và quay về như cũ: git rebase --abort.

Nếu lỡ rebase sai, git reflog giúp tìm lại trạng thái trước đó để khôi phục.

Đẩy nhánh sau khi rebase

Vì lịch sử đã đổi, push thường sẽ bị từ chối. Bạn cần force push, nhưng nên dùng cách an toàn hơn:

git push --force-with-lease

Lệnh này chỉ ghi đè nếu nhánh từ xa chưa có commit mới nào ngoài những gì bạn biết, tránh vô tình xóa công việc của người khác. Chỉ dùng cho nhánh của riêng bạn.

Kết luận

Merge an toàn và giữ nguyên lịch sử thật, rebase cho lịch sử sạch nhưng cần cẩn thận với nhánh chung. Hãy thống nhất quy ước trong nhóm: cách tích hợp vào main, có squash hay không, khi nào được rebase. Một quy ước rõ ràng quan trọng hơn việc chọn bên nào.

Muốn thực hành Git qua các tình huống làm việc nhóm thực tế, bạn có thể tìm hiểu thêm các khóa học trên codebem.com.

author_photo
Nguyễn Đình Cường

0 comment