Chào các bạn đã đến với chủ đề tiếp theo của mình. Ở chủ đề này, mình sẽ tiếp tục giới thiệu đến các bạn sự khác biệt của git merge và git rebase. Về cơ bản, thì cả 2 câu lệnh này đều có chung 1 nhiệm vụ, đó là hợp nhất các branch lại với nhau. Nhưng có 1 sự khác biệt đó là lịch sử của các commit sau khi hợp nhất từ nhánh này sang nhánh khác. Nào, chúng ta hãy bắt đầu đi vào nội dung chính nhé.
1. Git merge
Lệnh git merge
sử dụng để gộp nhánh, gộp nhánh này vào nhánh khác. Giả sử mình có 2 nhánh master (nhánh chính) và beta như sau:
- Ban đầu nhánh master có lịch sử commit là C1, C2, C3.
- Lúc này, bạn dev_1 tạo ra nhánh beta để implement feature mới. Và nhánh này lần lượt có commit B1 và B2.
- Trong lúc nhánh beta đang làm việc, thì trên nhánh master, bạn dev_2 cũng đang làm 1 task khác và có 2 commit D1 & D2
Sau khi 2 bạn dev_1 và dev_2 hoàn thành task xong. 2 bạn sẽ hộp nhất 2 phần code lại với nhau. Vì bạn dev_1 đang làm trên nhánh con beta, nên bạn ấy sẽ merge code của bạn ấy vào nhánh master. Lúc này, bạn dev_1 sẽ checkout vào nhánh master và thực hiện câu lệnh:
git merge beta
Sau khi gộp code xong, thì sơ đồ lịch sử commit của lệnh git merge như hình sau:
Để có thể xem rõ hơn, ở đây, mình sử dụng thêm tool Sourcetree để hiển thị lịch sử commit hình bên dưới. Nhánh màu xanh là main (master), nhánh màu đỏ là nhánh beta
Hoặc bạn vào nhánh main trên GitHub, bạn cũng có thể xem lịch sử commit như hình bên dưới:
2. Git rebase
Lệnh git rebase
cũng gộp các commit từ nhánh này vào nhánh khác, bằng cách xây dựng lại các commit base kế thừa từ nhánh khác và viết lại lịch sử commit sau các commit cơ sở mới.
Ví dụ, để gộp nhánh beta vào master, đứng ở master thực hiện lệnh
Như trên hình trên, trước thời điểm rebase, nhánh master có các commit cơ sở giống với nhánh beta đó là: C1, C2, C2
Lệnh git rebase
sẽ đưa toàn bộ nhánh beta làm base của master, do vậy các commit tiếp theo sau commit cơ sở ban đầu của master sẽ được nối tiếp vào, trong đó có thay đổi lại lịch sử commit, cũng sử lý xung đột giữa commit B2 và D1 để viết lại commit D1 thành D1′
Tương tự, nếu gộp master vào beta thì sơ đồ có thể là:
3. Lời kết
Đọc đến đây thì các bạn có thể hiểu được sử khác biệt giữa git merge và git rebase rồi phải không? Hy vọng các bạn có thể hiểu rõ cách sử dụng để khi dùng git, mình có thể sử dụng nó mượt mà hơn.
Bái bai các bạn. Hẹn gặp lại cái các bạn ở những chủ đề tiếp theo.
Nguồn:
https://xuanthulab.net/lenh-git-merge-va-rebase-gop-va-viet-lai-lich-su-commit.html