Git là một hệ thống kiểm soát phiên bản phân tán - một công cụ để theo dõi các thay đổi được thực hiện đối với một tập hợp các tệp hoặc điều phối công việc theo thời gian. Nó thường được sử dụng bởi các lập trình viên để phối hợp các thay đổi với mã nguồn phần mềm và phần tốt nhất; nó có thể được sử dụng để theo dõi bất kỳ loại nội dung nào. Nó được thiết kế đặc biệt để xử lý tất cả mọi thứ từ các dự án khối lượng nhỏ đến lớn với tốc độ và hiệu quả tối đa. Đó là ý nghĩa cực kỳ linh hoạt, các cá nhân có thể chia sẻ công việc trực tiếp giữa các kho lưu trữ cá nhân của họ và các nhóm có thể điều phối luồng công việc của họ thông qua một kho lưu trữ trung tâm. Nó chỉ đơn giản cho phép hai nhà phát triển ngồi ở hai vị trí khác nhau thực hiện và ghi lại các thay đổi một cách độc lập, tất cả đều không có kho lưu trữ trung tâm.
Sáp nhập là một cách phổ biến trong Git được sử dụng để tích hợp các thay đổi từ nhánh này sang nhánh khác. Hợp nhất Git là một lệnh cam kết thay đổi đến một vị trí khác. Nó cho phép các nhà phát triển lấy các dòng mã độc lập của họ được tạo bởi nhánh Git và tích hợp chúng vào một nhánh duy nhất. Điều này chỉ thay đổi nhánh mục tiêu trong khi lịch sử của nhánh nguồn vẫn còn. Git rebase là một lệnh khác được sử dụng về cơ bản cho cùng một mục đích ngoại trừ nó thực hiện nó hoàn toàn khác. Cả hai đều làm điều tương tự - kết hợp các cam kết từ chi nhánh này sang chi nhánh khác - nhưng sự khác biệt nằm ở cách họ thực hiện. Chúng tôi nhấn mạnh một số điểm phân biệt quan trọng so sánh hai.
Hợp nhất Git là một lệnh thống nhất hai hoặc nhiều nhánh lịch sử cam kết. Hợp nhất thường kết hợp chỉ hai nhánh, mặc dù Git hỗ trợ hợp nhất ba, bốn hoặc nhiều nhánh cùng một lúc. Hợp nhất Git được sử dụng bởi Git pull để kết hợp các thay đổi từ nhánh này sang nhánh khác hoặc từ kho lưu trữ khác hoàn toàn. Việc hợp nhất phải diễn ra trong một kho lưu trữ duy nhất có nghĩa là tất cả các nhánh cần sáp nhập, nên có mặt trong cùng một kho lưu trữ. Hợp nhất các tình huống thường là kết quả của hai hoặc nhiều người dùng, cố gắng cập nhật mã chung. Thông thường nhất, người dùng hợp nhất một nhánh thành một nhánh khác trong kho lưu trữ cục bộ của họ trong môi trường cục bộ. Hợp nhất Git tích hợp cụ thể nội dung của nhánh nguồn với nhánh đích. Nhánh đích được thay đổi, trong khi nhánh nguồn vẫn còn.
Git rebase là một cách khác để hợp nhất được sử dụng để tích hợp một nhánh khác với nhánh mà bạn hiện đang làm việc, ngoại trừ nó giữ một lịch sử cam kết tuyến tính. Mục đích của Git rebase là để di chuyển một nhánh từ vị trí này sang vị trí khác. Vì các cam kết là bất biến, chúng không thể được di chuyển, do đó, điều này đòi hỏi phải thực hiện các cam kết mới với cùng các thay đổi và siêu dữ liệu. Một cuộc nổi loạn về cơ bản thay đổi quan niệm về thời điểm và nơi một chuỗi các cam kết được phát triển, dẫn đến một số khía cạnh của lịch sử phát triển bị mất. Điều này có nghĩa là cam kết ban đầu mà sự phát triển ban đầu dựa trên sẽ được thay đổi. Nó kết hợp hiệu quả tất cả các cam kết mới trong nhánh chính bằng cách viết lại lịch sử. Kết quả là, nó tạo ra các xác nhận mới cho mỗi cam kết trong nhánh ban đầu.
- Mặc dù, cả hợp nhất và rebase là những cách phổ biến nhất để tích hợp các thay đổi trong Git và chúng phục vụ cùng một mục đích - để kết hợp nhiều nhánh thành một - sự khác biệt nằm ở cách chúng đạt được nó. Hợp nhất Git tích hợp nội dung của nhánh nguồn với nhánh đích, trong khi vẫn giữ nguyên tổ tiên của từng lịch sử cam kết, trong khi Git rebase kết hợp tất cả các cam kết mới trong nhánh chính bằng cách viết lại lịch sử bằng cách tạo các cam kết mới cho mỗi cam kết trong nhánh nguồn.
- Với hợp nhất Git, trước tiên bạn chuyển sang nhánh được hợp nhất và sau đó sử dụng lệnh hợp nhất để chọn một nhánh để hợp nhất. Cho rằng một nhánh trỏ đến một cam kết và một cam kết là mức độ chi tiết mà bạn liên kết thay đổi, việc hợp nhất lệnh hợp nhất ở cấp chi nhánh hoặc cam kết. Rebase, mặt khác, có một chút khác biệt. Trước tiên, bạn chọn một nhánh để rebase và sau đó sử dụng lệnh rebase để chọn nơi đặt nó.
- Hợp nhất tạo ra một cam kết mới thể hiện sự hợp nhất giữa hai nhánh. Nó tích hợp các thay đổi từ các dòng phát triển song song khác nhau (các nhánh) với nhau bằng cách tạo ra một cam kết hợp nhất. Mục đích là để nối hai hoặc nhiều nhánh với nhau, bao gồm tất cả các thay đổi kể từ thời điểm phân kỳ vào nhánh hiện tại. Chuyển tiếp nhanh là hành vi hợp nhất mặc định trong Git. Mặt khác, Rebasing thay đổi các cam kết riêng lẻ bằng cách viết lại lịch sử dự án bằng cách tạo các cam kết mới cho mỗi cam kết trong nhánh ban đầu, từ đó dẫn đến lịch sử tuyến tính không có các nhánh khác nhau.
- Hợp nhất Git không thay đổi lịch sử, trong khi bảo tồn bối cảnh của nhánh có nghĩa là các nhánh hiện tại không bị thay đổi theo bất kỳ cách nào. Nó tạo ra một cam kết mới (trừ khi nó là một sự hợp nhất chuyển tiếp nhanh), nhưng các cam kết vẫn có thể truy cập được từ chi nhánh. Mặt khác, Git rebase sắp xếp hợp lý một lịch sử phức tạp. Các cam kết được viết lại, các phiên bản cũ bị lãng quên và DAG của các phiên bản được thay đổi. Cam kết không còn có thể truy cập với rebase có nghĩa là bạn không còn có thể rebase các nhánh được xuất bản.
Tóm lại, cả hợp nhất và rebase là hai cách tích hợp các thay đổi trong Git, nhưng chúng khác nhau về cách chúng thực hiện. Hợp nhất là một hoạt động một bước với một nơi để giải quyết xung đột và các cam kết có thể truy cập từ chi nhánh vẫn có thể truy cập được. Mặt khác, Rebase áp dụng lại từng cam kết bằng cách viết lại lịch sử bằng cách tạo các xác nhận mới cho mỗi cam kết trong nhánh nguồn. Vì vậy, những gì đã từng có thể truy cập là không thể tiếp cận được. Một cuộc nổi loạn về cơ bản thay đổi quan niệm về thời điểm và nơi một chuỗi các cam kết được phát triển.