+35

Git - Hiểu hơn về merge và rebase

Xin chào mọi người, đây là bài viết đầu tiên của em, có gì sai sót hi vọng mọi người chém nhẹ kẻo nát thớt 🤕

Tuần này em có 1 cuộc tranh cãi nảy lửa với member trong dự án về việc sử dụng git merge và git rebase. Khi mà đối phương tẩy chay git rebase và xem git merge là một vũ khí tối thượng thì em lại thích dùng rebase hơn(tất nhiên là không tẩy chay git merge). Quá cay cú, em đã lên mạng tìm hiểu về git rebasegit merge để có thể giải thích cho người kia hiểu rằng, mọi thứ sinh ra đều có mục đích. Như con muỗi sinh ra để người ta sáng chế ra thuốc diệt muỗi vậy 😷.

Lan man vậy thôi, giờ mình sẽ đi sâu vào chủ đề chính. Git rebasegit merge là gì? Nó hoạt động ra sao? Khi nào thì nên sử dụnggit rebase? Khi nào thì nên dùng git merge?

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: image.png

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 gã đam mê thư viện merge một nhánh feature/library_call_api khác vào: image.png

Và bạn thấy là phần logic call Api của gã này khá ngon và nuột, vậy là những gì bạn làm nãy giờ thành công cốc 😡. Mà thôi kệ, của người ta ngon hơn thì mình lấy xài chứ tội gì. 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 image.png

Nhìn không được đẹp mắt cho lắm, 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ư cái áo rách 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

image.png

Giờ thì các commit của bạn đã được liền mạch với nhau. Chả ai biết rằng bạn đã cảm thấy thèm thuồng cái thư viện của gã kia mà merge nó vào nhánh của mình để xài, bạn có thể mỉm cười và nói là: "Cái đấy dễ mà, chẳng qua có sẵn rồi nên anh cũng chả cần viết lại làm gì". Hê hê 🤡

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. Nhờ thế, chúng ta sẽ không thể che giấu hành vi phạm tội của mình nữa rồi 🙉

git checkout master
git pull origin master
git merge feature/crawl_video_links
git push origin master

image.png

Rebase và Merge. Khi nào thì sử dụng nó?

Về cơ chế đẩy commit sang nhánh khác, cũng có sử khác nhau. 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ớimerge, nó sẽ gom hết commits từ thời ông cố nội đến đời con cháu lại và đổ lên đầu bạn. Bạn sẽ phải tự tìm hiểu xem conflict đó là từ commit nào trong đau khổ.

Vậy thì khi nào sử dụng rebase và merge?

Sau khi mọi người đã hiểu về cơ chế hoạt động của nó, chắc hẳn cũng không cần nói thêm về việc sử dụng nó như nào nữa. Cơ mà thôi cũng nói cho luôn.

Với rebase, khi ở nhánh master 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, và trong trường hợp đó thì bạn sẽ phải dành 1 tuần để suy nghĩ về định hướng sắp tới 🤡. Luôn nhớ, luôn nhớ, luôn nhớ

Bonus với Git rebase

Giả sử ta có 1 bài toán như thế này, chúng ta checkout feature từ nhánh master. Cơ mà sau đó, sếp lại bảo: "Chết mày rồi con ơi, nhánh chính là nhánh develop". Mà nhánh master lại có những commit mà develop chưa có 🙉. Ây da, giờ đã commited lên gần chục files với vài trăm dòng chỉnh sửa. Nếu checkout nhánh mới với develop rồi compare cũng mất nửa ngày. Mé sếp 🤬.

image.png

Rebase sẽ hỗ trợ vấn đề này với options --onto. Cú pháp như sau:

git rebase --onto newBase oldBase feature

Trong trường hợp này, nó sẽ là git rebase --onto develop master feature. Nó sẽ đưa các commit của feature về với HEAD của develop, và các commits có trên master sẽ bay màu 👻

image.png

Tổng kết

Qua đây là chút hiểu biết về git rebasegit merge. Hi vọng sau khi đã hiểu hơn về bọn nó thì mọi người sẽ nâng niu bọn nó hơn chứ đừng tẩy chay cái nào mà tội nghiệp. Mọi người có gì muốn góp ý thì cứ comment giúp em nhé. Em sẽ rất vui được lắng nghe những ý kiến đóng góp từ mọi người. Em xin cảm ơn. Alligator(Arigatou) 🐊


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí