Merge và rebase đều được sử dụng để tích hợp các thay đổi từ một branch sang branch khác; tuy nhiên, chúng đạt được mục đích này theo những cách khác nhau.
Hãy xét tình huống: một thành viên trong team tạo một topic branch mới từ main. Khi các thành viên khác push thay đổi lên main, topic branch đó sẽ trở nên lỗi thời vì checkout từ phiên bản code cũ. Cả merge và rebase đều có thể được sử dụng để giữ cho topic branch luôn cập nhật.
Để tích hợp nội dung của branch main vào topic branch:
git switch topic
git merge main
Kết quả là một commit gộp được đặt ở đầu topic branch, commit này bao gồm các thay đổi mới từ main kể từ khi topic branch được tạo ra.
Để tích hợp nội dung của topic branch vào branch main:
git switch topic
git rebase main
| Tiêu chí | Merge | Rebase |
|---|---|---|
| Thay đổi lịch sử | Không thay đổi lịch sử, giữ nguyên các commit gốc | Viết lại lịch sử, tạo các commit mới |
| Lịch sử dự án | Có thể làm lộn xộn với nhiều nhánh và commit gộp | Sạch sẽ, tuyến tính, dễ theo dõi |
| An toàn cho branch chia sẻ | An toàn, không lo ghi đè công việc | Không an toàn, không nên dùng cho branch chia sẻ |
| Giữ ngữ cảnh | Giữ lại ngữ cảnh về cách giải quyết xung đột | Mất ngữ cảnh vì thay thế commit cũ |
| Giải quyết xung đột | Giải quyết tất cả xung đột cùng một lúc | Giải quyết từng xung đột một cách tăng dần |
| Commit tạo ra | Tạo commit gộp mới | Không tạo commit gộp, chỉ di chuyển commit |
| Phù hợp với | Branch được chia sẻ, branch sống lâu | Branch cá nhân, muốn lịch sử sạch sẽ |
Thay vì chọn một trong hai, bạn có thể kết hợp cả merge và rebase trong quy trình làm việc của mình để tận dụng ưu điểm của cả hai. Dưới đây là một quy trình được đề xuất:
Khi bạn sẵn sàng bắt đầu làm việc trên một tính năng mới, sửa lỗi, v.v., hãy tạo một topic branch mới:
git checkout -b <topic-branch>
Nếu branch được tạo ở bước 1 tách ra từ một source-branch được chia sẻ, các cộng tác viên khác sẽ thêm commit vào source branch đó. Định kỳ sử dụng rebase để giữ branch của bạn luôn cập nhật với các thay đổi mới:
git rebase <source-branch>
Khi việc phát triển trên branch của bạn hoàn tất, hãy sử dụng merge để tích hợp các thay đổi trở lại vào source branch. Vì rebase đã được sử dụng để giữ topic branch của bạn cập nhật, một gộp nhanh sẽ có thể thực hiện được:
git switch <source-branch>
git merge <topic-branch>
Lợi ích của quy trình này:
Cả merge và rebase đều là những công cụ mạnh mẽ để tích hợp thay đổi giữa các branch, mỗi cái có ưu và nhược điểm riêng:
Quy trình tốt nhất là kết hợp cả hai: sử dụng rebase để giữ topic branch của bạn cập nhật trong quá trình phát triển, sau đó sử dụng merge để tích hợp các thay đổi trở lại vào source branch. Cách tiếp cận này cho phép bạn tận dụng ưu điểm của cả hai phương pháp.
Hy vọng bạn đã hiểu rõ sự khác biệt và cách sử dụng merge và rebase một cách hiệu quả. Hãy thử sức với bài quiz cho chương này nhé!