Rebase hay Merge Khi muốn có thay đổi từ nhánh Master
I. Giới Thiệu
Khi phát triển phần mềm việc chia nhánh để phát triển độc lập, song song luôn xảy ra. Có nhánh xong trước, có nhánh sẽ hoàn thành sau. Làm sau để các nhánh chưa hoàn thành có thể có những tính năng từ nhánh chính (nhánh master) là vấn đề của bài viết này.
Kịch bản cụ thể như sau. Có 2 tính năng phát triển độc lập với nhau, theo lẽ đương nhiên, lập trình viên sẽ tạo ra 2 nhánh riêng biệt từ nhánh master
. Hai nhánh này sẽ có tên lần lượt là
- feature-1
- feature-2
Nhánh feature-1
hoàn thành sớm và nhanh chóng merge vào master. Lúc này nhánh master
đang có mã nguồn mới nhất từ nhánh feature-1
. Vấn đề bây giờ đó là ở nhánh feature-2
, nhánh feature-2
hiện tại chưa phát triển xong, tuy nhiên nhánh feature-2
muốn có các tính năng mới nhất mà hiện tại đang có ở nhánh master
.
Sẽ có 2 cách làm trong kịch bản này:
- Merge từ nhánh
master
qua nhánhfeature-2
- Rebase nhánh
feature-2
đến nhánhmaster
Rebase dịch sang tiếng việt có nghĩa là chuyển nền, còn có thể hiểu cách khác là chuyển commit
nguồn của một nhánh sang một commit
khác.
Lưu ý là nhánh master đang nói ở đây cụ thể là điểm commit mới nhất, cuối cùng trên nhánh master
.
Một lần nữa, vấn đề hiện tại đó là làm sao để nhánh feature-2
có các tính năng mới nhất từ nhánh master
và rồi lập trình viên có thể phát triển tiếp trên nhánh feature-2
.
II. Giải pháp
1. Merge từ nhánh master
qua nhánh feature-2
2. Rebase nhánh feature-2
qua nhánh master
Có thể nhận ra điểm khác biệt ngay lập tức đó là nhánh feature-2
được phát triển dựa vào commit màu xanh dương thay vì là màu xanh lá.
III. Ưu & Nhược Điểm.
1. Merge từ nhánh master
qua nhánh feature-2
Ưu điểm: Nhìn rõ các commit lịch sử của nhánh feature-2
, từng commit lúc này hoàn toàn ko có dính dáng gì đến commit
mới nhất thuộc nhánh master
2. Khi áp dụng giải pháp này, giả sử muốn quay lại các commit cũ thuộc nhánh feature-2
, hoàn toàn là điểu dễ dàng, mã nguồn hoàn toàn không dính dáng gì đến nhánh feature-1
hết.
Nhược điểm: Git log nhìn sẽ rất xấu.
2. Rebase nhánh feature-2
sang commit mới nhất thuộc nhánh master
Ưu điểm: Git log nhìn sẽ cực kì, cực kì đẹp.
Nhược điểm: Các commit cũ của nhánh feature-2
lúc nhánh này dựa trên commit cũ thuộc nhánh master sẽ bị biến mất trên git log. Thay vào đó, các commit thuộc nhánh feature-2
sẽ hoàn toàn dựa trên commit mới nhất thuộc nhánh master
. Giả sử như muốn quay lại các commit cũ, mã nguồn không dính dáng gì đến mã nguồn của feature-1
, để làm được việc này khó khăn hơn rất nhiều so với phương pháp merge
.