Trong quá trình làm việc với Git, các lập trình viên thường làm việc độc lập trên các nhánh (branch) khác nhau và để thống nhất code sau khi phát triển tính năng hoặc vá lỗi, cần tiến hành hợp nhất nhánh.
Hiện nay, khi cần tích hợp code từ nhánh này sang nhánh khác, Git hỗ trợ hai tập lệnh cho cùng một mục đích kết hợp công việc của nhiều nhà phát triển thành một mã, tuy nhiên với hai cách tiếp cận hoàn toàn khác nhau: Git Merge
và Git Rebase
.
Trong bài viết này, chúng ta sẽ tiến hành phân tích cơ chế hoạt động, so sánh ưu nhược điểm giữa Merge
và Rebase
, từ đó có được góc nhìn đúng đắn về lợi ích cũng như nhìn ra những rủi ro trong quá trình áp dụng thực tế vào những tình huống cụ thể khác nhau.

Git Merge và Git Rebase
1. Git rebase
Rebase, hiểu đơn giản như tên gọi của nó, tức là reset lại base cho branch. Giả sử bạn có 1 nhánh feature/crawl_video_links
được checkout từ nhánh master
như dưới đây:

Và sau khi feature/crawl_video_links
đã viết được một số methods để call API rồi, thì nhánh master được một bạn siêu giỏi merge một nhánh feature/library_call_api
khác vào:

Và bạn thấy là phần logic call Api của bạn này khá ngon và nuột, vậy là bạn quyết định sẽ sử dụng code của bạn này. Vậy thì phải merge vào nhánh mình thôi. Cơ mà nhánh của bạn vẫn cần phát triển thêm, giờ nếu dùng git merge từ master vào thì branch history của bạn sẽ như thế này

Nhìn history này khá rối, bạn muốn các commit của mình phải liền mạch với nhau, chứ không phải kiểu chắp vá như vậy. Đây là lúc mà rebase
phát huy tác dụng. Bạn sẽ pull từ nhánh master về, và sau đó sẽ rebase nó trên nhánh feature/crawl_video_links
.
git checkout master
git pull origin master
git checkout feature/crawl_video_links
git rebase master
git push origin feature/crawl_video_links -f

Giờ thì các commit của bạn đã được liền mạch với nhau.
Và vì thế, các commit của từng nhánh sẽ luôn liền mạch với nhau sau khi merge vào nhánh master, giúp chúng ta có thể dễ dàng theo dõi quá trình thay đổi của nhánh đó trên nhánh master hơn.
2. Git merge
Rebase là thế, vậy còn merge thì sao? Merge, tức là merge. Nghĩa là sẽ lấy những thay đổi của nhánh A và bỏ vào nhánh B.
Nghe có vẻ giống như rebase
nhỉ? Vậy thì sao không dùng rebase luôn cho rồi? Vấn đề ở chỗ, với rebase, chúng ta sẽ không biết thời điểm mà những commit đó được đẩy vào nhánh của mình tại thời điểm nào(ưu điểm giờ lại thành nhược điểm). Trong khi với merge, các thay đổi sẽ được đẩy thẳng vào sau commit cuối cùng của nhánh đó, ngoài ra nó sẽ tạo thêm 1 commit merge để đánh dấu thời điểm được merge nữa.
git checkout master
git pull origin master
git merge feature/crawl_video_links
git push origin master

Rebase và Merge. Khi nào thì sử dụng nó?
Trong khi rebase sẽ thực hiện merge code từng commit một, và khi bị conflict tại commit nào, nó sẽ dừng lại và để bạn fix conflict rồi mới tiếp tục rebase, khá là là tốn thời gian khi có 1 số lượng commits lớn. Còn với merge, nó sẽ gom hết tất cả các commits. Bạn sẽ phải tự tìm hiểu xem conflict đó là từ commit nào.
Vậy thì khi nào sử dụng rebase và merge?
Đến đây bạn đã nắm được cơ chế hoạt động của chúng, vậy câu hỏi đặt ra là khi nào sử dụng rebase
, khi nào sử dụng merge
Với
rebase
, khi ở nhánhmaster
có thêm commit mới, ta sẽ dùng rebase để thực hiện merge các commits mới này vào nhánh feature của mình.
Với
merge
, ta sẽ dùng khi muốn merge những commits từ feature vào master.
Rất đơn giản và gọn gàng
Có 1 lưu ý với rebase
. Vì làm thay đổi lại vị trí của commits trên nhánh feature, nên các commits của nó sẽ bị thay đổi commit ID. Ngoài ra, dùng git rebase sẽ luôn đi cùng git push -f, nên hãy luôn nhớ pull cả 2 nhánh master và feature về trước khi thực hiện rebase để tránh miss code.