- vừa được xem lúc

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

0 0 29

Người đăng: Nguyễn Xuân Tài

Theo Viblo Asia

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:

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:

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

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

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

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 🤬.

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 👻

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) 🐊

Bình luận

Bài viết tương tự

- vừa được xem lúc

Những lệnh Git cơ bản cần nhớ

1. Cơ bản vê Git.

0 0 39

- vừa được xem lúc

5 Chiêu thức luyện công cùng Git

Khởi động. Để chuẩn bị tốt cho các chiêu thức sắp được trình bày, chúng ta cùng khởi động, ôn luyện một chút nhé.

0 0 47

- vừa được xem lúc

Một số trường hợp khi sử dụng git

Giới thiệu. Ở bài viết trước, mình đã giới thiệu các lệnh cơ bản thường dùng trong git.

0 0 31

- vừa được xem lúc

Git và những điều cơ bản bạn cần biết?

Những điều cơ bản về Git. Làm thế nào để xoá một branch ở phía local, làm thế nào để xoá một branch remote.

0 0 33

- vừa được xem lúc

[GIT] Làm việc với Git như một Senior

Khai niệm. . Git được hiểu đơn giản là một Version quản lý source-code. Hiện tại git được sử dụng rộng rãi trong quy trình phát triển phần mềm.

0 0 33

- vừa được xem lúc

Một số lưu ý, kinh nghiệm khi sử dụng Git

Chỉ là một chút kinh nghiệm cá nhân tự note để xem lại nên đa phần mình viết để gợi nhớ lại cho bản thân, để có thể đọc lại khi cần . .

0 0 34