Explore all courses in this category.
Explore all courses in this category.
Nguyễn Đình Cường
0 comment
09 Nov, 2026
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 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 mainRebase 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/maingit log và git bisect.Đừ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.
| Tiêu chí | Merge | Rebase |
|---|---|---|
| Lịch sử | Có nhánh, có merge commit | Thẳng một đường |
| Viết lại lịch sử | Không | Có |
| Xung đột | Giải quyết một lần | Có thể nhiều lần |
| An toàn cho nhánh chung | Có | Không |
| Đọc lịch sử | Hơi rối nếu nhiều nhánh | Dễ |
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 testBạ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.
git status xem file nào.git add.git rebase --continue để tiếp tụ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.
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-leaseLệ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.
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.
Nguyễn Đình Cường
0 comment