Dòng chảy Git - Merge và Rebase khác nhau như thế nào?

Khác biệt cơ bản nhất là "dòng chảy". Merge có nghĩa là nhánh (sông) con nhập vào nhánh mẹ, còn rebase là dòng chảy từ sông mẹ đổ ra các nhánh con. Rất dễ hiểu phải không?

Một cách hiểu khác: Merge là đồng bộ từ dưới lên, còn rebase là đồng bộ từ trên xuống.

Thuật ngữ của team TIGO khi phân biệt 2 khái niệm này:

  • Merge: Hợp long (từ thượng nguồn về hạ nguồn)
  • Rebase: Tái tạo gốc
     

Chú ý: Merge khác với Push. Merge là hoạt động nội bộ (local operation), còn push chạm tới nhánh thượng nguồn bằng cách đẩy các commits từ local repository lên remote repository. Như vậy Push nếu được hiểu là "hợp long" sẽ chính xác hơn so với hiểu merge là "hợp long".

Hãy cùng xem định nghĩa tiếng Anh:

Rebases are how changes should pass from the top of hierarchy downwards and merges are how they flow back upwards.

Rebase là khái niệm rộng, có thể dùng để tạo một Pull Request mới, thí dụ: git pull --rebase {branch-name}

git-rebase – Forward-port local commits to the updated upstream head

Vậy sự khác biệt là:

  • merge không chạm vào nhánh thượng nguồn (upstream).
  • rebase cho phép bạn tiếp tục trên cùng một nhánh thượng  nguồn với:
    • một căn cứ mới
    • một lịch sử sạch hơn


Hình: Nếu nhánh chính không có sự thay đổi nào trong suốt quãng thời gian bạn thực hiện công việc ở nhánh con (downstream) thì merge và rebase là tương đương nhau, tức là đồng bộ theo chiều lên hay chiều xuống đều không gây ra xung đột nào cả.

Ưu và Nhược điểm:

  • Ưu điểm của rebase là tạo ra "lịch sử đẹp hơn, theo một đường tuyến tính", nó giống như khi tạo ra một tảng băng trôi mà người khác chỉ nhìn thấy mỏm (tip) mà thôi, đó chính là tập các thay đổi sạch sẽ (clean set of changes) của bạn.
  • Nhược điểm của rebase là tính chất phức tạp, làm mất vết lịch sử và nếu sử dụng không đúng sẽ rất nguy hiểm

Tác giả: Phạm Đình Trường

Tags