Git rebase và merge
Cập nhật lần cuối
Cả git merge và git rebase đều gộp phần việc từ nhánh này sang nhánh khác. git merge nối hai lịch sử lại bằng một merge commit, giữ đúng những gì đã xảy ra. git rebase phát lại từng commit của bạn lên trên nhánh kia, cho ra lịch sử gọn gàng, thẳng hàng, nhưng đồng thời viết lại các commit đó.
Quy tắc vàng: đừng bao giờ rebase những commit người khác đã pull về. Bạn có thể thử cả hai trong terminal playground: một shell thật ngay trên trình duyệt.
So sánh song song
| Đặc điểm | git merge | git rebase |
|---|---|---|
| Hình dạng lịch sử | Rẽ nhánh, có merge commit | Thẳng hàng |
| Viết lại commit | Không | Có |
| An toàn trên nhánh dùng chung | Có | Không |
| Giữ nguyên lịch sử | Có | Không |
| Dễ lần ra thời điểm gộp nhánh | Có | Khó hơn |
Cú pháp
| Lệnh | Tác dụng |
|---|---|
git merge feature | Merge feature vào nhánh hiện tại |
git merge --no-ff feature | Luôn tạo một merge commit |
git rebase main | Phát lại các commit của nhánh hiện tại lên main |
git rebase -i HEAD~3 | Chỉnh sửa tương tác 3 commit gần nhất |
git rebase --abort | Hủy một lần rebase đang dở |
Câu hỏi thường gặp về git rebase và merge
git rebase và git merge khác nhau thế nào?
git merge gộp hai nhánh bằng cách tạo một merge commit mới nối hai lịch sử, giữ lại chính xác những gì đã xảy ra. git rebase thì di chuyển các commit của bạn để phát lại chúng lên trên một nhánh khác, cho ra lịch sử thẳng hàng nhưng viết lại các commit đó với hash mới. Merge giữ nguyên lịch sử; rebase viết lại lịch sử cho gọn.Khi nào nên dùng merge, khi nào nên dùng rebase?
main mới nhất cho lịch sử gọn gàng. Nhiều nhóm rebase ở máy mình, rồi merge vào main.Quy tắc vàng của rebase là gì?
Đừng bao giờ rebase những commit mà người khác đã dựa vào để làm việc, thường là mọi thứ bạn đã push lên nhánh dùng chung. Vì rebase viết lại commit, làm vậy buộc mọi người phải xử lý một lịch sử đã tách nhánh. Cứ thoải mái rebase các commit cục bộ chưa push; với những gì đã công khai, hãy dùng merge (hoặc revert).
Rebase hay merge ít gây xung đột hơn?
Không cách nào tránh được xung đột, chúng chỉ khiến xung đột xuất hiện theo cách khác nhau. Merge giải quyết mọi xung đột một lần, trong merge commit. Rebase có thể bắt bạn giải quyết xung đột theo từng commit khi mỗi commit được phát lại. Tổng khối lượng công việc gần như nhau; rebase chỉ chia nhỏ nó ra.
Có thể luyện tập lệnh này online không?
git merge và git rebase trong một shell thật ngay trên trình duyệt, không cần cài đặt gì. Khóa học Git tương tác miễn phí của Coddy cũng hướng dẫn từng bước cách merge và rebase.