[Git] - Merging vs. Rebasing
Bài đăng này đã không được cập nhật trong 3 năm
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
Tổng quát khái niệm
Đầ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
Summary
Đó 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
All rights reserved