12/08/2018, 16:26

[Git] - Merging vs. Rebasing

Những người mới bắt đầu sử dụng git thường tránh xa git rebase. Nhưng thực tế nó sẽ giúp cho 1 dự án phát triển một cách đơn giản hơn nếu sử dụng cẩn thận. Trong bài viết này, chúng ta sẽ so sánh git rebase với câu lệnh tương tự git merge Đầu tiên, cần phải hiểu rõ rằng git rebase cũng giải ...

Những người mới bắt đầu sử dụng git thường tránh xa git rebase. Nhưng thực tế nó sẽ giúp cho 1 dự án phát triển một cách đơn giản hơn nếu sử dụng cẩn thận. Trong bài viết này, chúng ta sẽ so sánh git rebase với câu lệnh tương tự git merge

Đầu tiên, cần phải hiểu rõ rằng git rebase cũng giải quyết những vấn đề tương tự với git merge. Cả 2 câu lệnh đều được tạo ra để tích hợp những thay đổi từ 1 nhánh vào 1 nhánh khác. Nhưng chúng làm theo cách khác nhau Khi bạn đang làm code 1 chức năng bục mặt ở một branch Feature. Một ngày đẹp trời, 1 thằng trong team bạn update branch master với vài commit mới, vậy để tích hợp những commit đó cũng như tránh việc conflict sau này, bạn phải làm gì. Có 2 lựa chọn cho bạn: merging hoặc rebasing

Merge

Lựa chọn đơn giản nhất là merge branch master vào branch Feature bằng cách :

git checkout Feature
git merge master

Câu lệnh trên sẽ tạo ra một merge commit mới trên branch Feature bao gồm lịch sử của cả 2 branch (Hình minh họa) Ưu điêm: Merging không làm thay đổi hệ thống. Những nhánh đang tồn tại sẽ không bị ảnh hưởng gì cả. Nhược điểm: Branch Feature sẽ có thêm 1 commit merge mỗi lần bạn cần tích hợp những thay đổi từ các nhánh khác vào nó. Nếu branch master liên tục bị thay đổi thì lịch sử commit của branch Feature sẽ rất khó nhìn. Nó sẽ gây rất nhiều khó khăn trong việc xem lại lịch sử commit của dự án

Rebase

Cũng là một cách gộp những thay đổi từ các nhánh với nhau bằng commands:

git checkout Feature
git rebase master

Câu lệnh trên sẽ bê toàn bộ branch feature lên đầu của branch master. Nhưng thay vì dùng một commit merge, nó sẽ viết lại lịch sử của project bằng cách tạo các commit hoàn toàn mới cho mỗi commit ở nhánh ban đầu Lợi ích chính của việc rebasing này là lịch sử project sẽ gọn gàng & sạch sẽ hơn. Đầu tiên, nó sẽ loại bỏ những commit merge không cần thiết mà được sinh ra bởi git merge. Sau đó, như bạn đã thấy trên biểu đồ phía trên, rebasing sẽ tạo ra một đường thẳng commit trong lịch sử commit

Interactive Rebasing

Interactive rebasing cho bạn cơ hội để thay đổi những commit khi mà chúng được chuyển đến nhánh mới. Điều này thậm chí còn mạnh hơn cả một automated rebase vì nó cho phép điều khiển hoàn toàn lịch sử commit của nhánh đó. Điển hình là việc sử dụng để xóa 1 commit trước khi merge nó vào master Để bắt đầu một Interactive rebasing, ta truyển option i vào trong câu lệnh rebase

git checkout feature
git rebase -i master

Một danh sách các commit sẽ được hiển thị ra, những commit mà sẽ được move sang master

pick 33d5b7a Message for commit #1
pick 9480b3d Message for commit #2
pick 5c67e61 Message for commit #3

Danh sách này hiển thị chính xác nhánh của bạn sau khi được rebase. Nếu bạn muốn xóa 1 commit nào đó, VD: nếu như commit thứ 2 chỉ fix 1 lỗi nhỏ trong commit đầu tiên, bạn sẽ cần gộp chúng lại với nhau, hay nói cách khác là xóa cái commit thứ 2 đi

pick 33d5b7a Message for commit #1
fixup 9480b3d Message for commit #2
pick 5c67e61 Message for commit #3

Khi bạn lưu và đóng file, Git sẽ thực hiện việc rebase dựa vào những gì bạn đã chỉ định, lịch sử commit trong project của bạn sẽ giống như sau

Đó là toàn bộ những điều bạn cần biết khi bắt đầu rebasing những nhánh của bạn. Nếu bạn muốn một lịch sử commit gọn gàng, chỉ có 1 hàng trên cây commit thôi, thì bạn git rebase sẽ phù hợp với bạn

0