Merge vs Rebase trong Git
NỘI DUNG BÀI VIẾT
Trong bài viết này, chúng ta sẽ so sánh giữa lệnh git rebase với git merge, những trường hợp ta có thể áp dụng rebase trong quá trình làm việc với git
Ý tưởng chính
Điều đầu tiên cần hiểu về git rebase
là nó giải quyết cùng một vấn đề như git merge
. Cả 2 lệnh này được dùng để đưa các thay đổi từ một branch sang 1 branch khác, chỉ khác nhau ở cách làm.
Hãy hình dung chuyện sẽ xảy ra khi chúng ta bắt đầu làm việc trên một tính năng mới, trên feature branch, sau đó team khác commit code mới lên master branch.
Cái commit mới trong master liên quan đến feature chúng ta đang làm. Để lấy commit mới này từ master và đưa về feature branch đang làm, chúng ta có 2 lựa chọn: merge hoặc rebase
Merge
git checkout feature git merge master // hoặc viết bằng một dòng luôn git merge master feature
Kết quả là nó sẽ tạo ra một merge commit mới trên feature branch, Chúng ta có một cấu trúc như sau
Nói một cách khác, feature branch sẽ có thêm một state cần commit. Nếu master bị thay đổi thường xuyên, liên tục, cái history của feature branch có thể sẽ rất lộn xộn, mặc dù có thể xử lý bằng git log
, tuy nhiên các bạn developer khác sẽ rất khó mà hiểu được history của project
Rebase
Một lựa chọn khác với merge, là dùng rebase
git checkout feature git rebase master
Nó sẽ đưa toàn bộ feature branch lên trên cùng của master.
Lợi ích của dùng rebase
là chúng ta có history của project sạch sẽ hơn. Sẽ không có những merge commit dư thừa như trong lệnh merge
.
Nguyên tắc vàng của Rebase
Một khi đã hiểu được cách làm của rebase, điều quan trọng nhất đã học được là đừng bao giờ xài nó.
Ví dụ, đoán xem chuyện gì xảy ra nếu chúng ta rebase master vào feature branch
Lệnh
rebase
sẽ đưa toàn bộ commit của master xuống feature. Vấn đề là cái này chỉ nằm trên local repository của chúng ta. Tất cả những dev khác sẽ tiếp tục làm việc trên master gốc. Git lúc này sẽ hiểu history master của chúng ta không phụ thuộc vào những người khác.Cách duy nhất để sync lại 2 master branch là merge chúng lại. Bạn đã thấy sự rắc rối chưa? Khi cả 2 branch master sẽ có cùng các commit changes. Nói cách khác, đố ai biết được chúng ta chọn được cái này trong 2 cái để merge.
Trước khi chạy lệnh
git rebase
, luôn hỏi chính mình “Có đứa nào đang làm việc trên branch này?” Nếu câu trả lời là có, rút tay khỏi bàn phím và nghĩ đến giải pháp an toàn hơn nhưgit revert
Quy trình làm việc
Chúng ta cùng bàn quan những lợi ích của rebase
trong quá trình phát triển feature
Bước đầu tiên để làm việc với git rebase
là phải đảm bảo mỗi feature có một branch tương ứng. Như vậy chúng ta có một cấu trúc an toàn để có thể rebase
Khi gọi git rebase
chúng ta có 2 lựa chọn: thằng cha của feature branch (có thể là developmennt hoặc master tùy thuộc vào cái flow đang dùng) hoặc một thời điểm commit trước đó của feature. Lựa chọn thứ 2 là ta dùng Rebase kèm với options, ví dụ rebase lại trước đó 3 commit
git checkout feature git rebase -i HEAD~3
Bằng cách chỉ định HEAD~3
, chúng ta không tạo thêm state mới của branch, chúng ta chỉ viết lại cho 3 commit trước đó.
Nếu muốn viết lại toạn bộ cái feature sử dụng cách này, dùng lệnh git merge-base
để tìm đến gốc của feature branch
git merge-base feature master
Các bạn có thể tham khảo các bài viết hay về Laravel tại đây.
Hãy tham gia nhóm Học lập trình để thảo luận thêm về các vấn đề cùng quan tâm.
Tham khảo: topdev
Leave a Reply