+6

Git Merge và Git Rebase: nên dùng sao cho hợp lí?

Merge code từ các branch là một trong những công việc thường thấy hằng ngày của developer khi làm việc với Version Source Control nói chung và Git nói riêng. Đối với Git, chúng ta có 2 lựa chọn phổ biến để merge code là Merge và Rebase, khi mới tiếp xúc với Git chắc hẳn nhiều bạn sẽ cảm thấy bối rối không biết nên dùng lệnh nào cho phù hợp (như mình 😋) thì đây là bài viết giải ngố giành cho bạn với kinh nghiệm đã đi làm 3 năm của mình, đặc biệt dành cho bạn nào mới vừa đi làm. Bài viết này sẽ chỉ ra cách dùng Git Merge và Git Rebase sao cho hợp lí nhất.

1. Đặt ví dụ

Mình đang có branch main và đang làm chức năng login bằng Google trên branch feature/login-with-google, dưới đây là commit history tree: image.png

Như bạn có thể thấy, branch feature của mình được tạo từ Initial commit của branch main và đang có một commit. Branch main hiện tại sau khi có branch feature thì đã có thêm một commit mới.

Giả sử feature của mình đã code xong, bây giờ mình muốn merge vào branch main, mình cần giải quyết 2 vấn đề:

  1. merge code của branch main vào trong branch feature (vì hiện tại main đã có code mới)
  2. merge code của feature ngược lại vào main.

Đây cũng là 2 bước tương tác với Git thường thấy khi bạn code trên các branch feature.

2. Git Rebase

Thoạt đầu đọc lí thuyết có vẻ khó hiểu, nhưng thực chất Git Rebase chủ yếu có tác dụng làm "đẹp" commit history và giúp cho feature của mình trông có vẻ "clean" hơn, đây cũng là mục đích của đại đa số người dùng Rebase, theo Atlassian

Để dễ hình dung, đầu tiên hãy thử dùng Git Merge để merge code mới nhất của branch main vào feature, ta sẽ có commit history tree như sau: image.png

Ta thấy một commit merge được tạo ra (gọi là merge commit), và cái "cây" nhìn có vẻ hơi rối mắt rồi đó. Bây giờ thử rollback lại và dùng Git Rebase: image.png

Giờ thì cái "cây" nhìn trông tinh gọn hơn so với git merge rồi đúng không? Hơn hết nữa là không tạo ra merge commit, git rebase gộp commit mới của main vào trong branch feature như thể nó đã có trước khi ta tạo branch feature.

Tóm lại, Git Rebase chỉ phù hợp để dùng cho các feature branch khi cần cập nhật các thay đổi mới nhất của main/base branch, chúng ta vẫn có thể dùng Git Merge để làm điều này nhưng sẽ tạo thêm commit mới (merge commit) và commit history tree nhìn rối hơn một chút.

Bởi vì quá trình merge code quá "mượt", nên mình không khuyến khích dùng Git Rebase cho các branch chính, vì mình không thể kiểm tra/track được code nào đã được merge vào và merge ra sao (merge commit sẽ giúp chúng ta track tốt hơn trong trường hợp này).

Git Rebase giải quyết vấn đề số 1 trong phần 1. Đặt ví dụ.

3. Git Merge

Git Merge có thể quen thuộc với chúng ta nhiều hơn, mỗi khi cần merge code vào main/base branch, ắt hẳn bạn sẽ cần tạo PR (Pull Request) hoặc MR (Merge Request), các request này đều dùng phương thức của Git Merge để merge code. Trong phần 2. Git Rebase mình đã thử dùng Git Merge để cho các bạn thấy sự khác biệt, Git Merge nhìn chung sẽ tạo ra các merge commit và làm cho commit history tree nhìn rối mắt hơn, nhưng nó cũng chính là thứ giúp chúng ta kiểm tra/track những phần code nào đã được merge, merge từ đâu và merge như thế nào.

Git Merge phù hợp cho hầu hết các trường hợp cần merge code, bạn có thể không cần phải dùng Git Rebase để làm đẹp brach feature bởi vì các PR/MR đều có lựa chọn Squash Merge.

Merge commit giúp chúng ta kiểm tra/track tốt hơn quá trình merge code. Dễ debug đếu chẳng may merge code sai.

Git Merge có thể giải quyết cả 2 vấn đề trong phần 1. Đặt ví dụ.

4. Kết

Mặc dù Git Rebase có lí thuyết đọc khá rắc rối và dễ gây khó hiểu cho người mới dùng, song bạn chỉ cần nắm được chức năng đơn giản của Git Rebase như đề cập trong bài và tránh dùng chúng vào các branch chính, thay vào đó Git Merge dễ hiểu dễ dùng và cũng là phương án chọn tốt nhất trong đa số các trường hợp. Hẹn gặp lại các bạn trong những bài sau.


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í