Sự khác biệt giữa git merge
và là git rebase
gì?
Sự khác biệt giữa git merge
và là git rebase
gì?
Câu trả lời:
Giả sử ban đầu có 3 cam kết, A
, B
, C
:
Sau đó, nhà phát triển Dan đã tạo cam kết D
và nhà phát triển Ed đã tạo cam kết E
:
Rõ ràng, cuộc xung đột này nên được giải quyết bằng cách nào đó. Đối với điều này, có 2 cách:
MERGE :
Cả hai cam kết D
và E
vẫn ở đây, nhưng chúng tôi tạo ra cam kết hợp nhất M
kế thừa các thay đổi từ cả hai D
và E
. Tuy nhiên, điều này tạo ra hình dạng kim cương , điều mà nhiều người thấy rất khó hiểu.
rebase :
Chúng tôi tạo cam kết R
, nội dung tệp thực tế giống hệt với cam kết hợp nhất M
ở trên. Nhưng, chúng tôi thoát khỏi cam kết E
, giống như nó chưa từng tồn tại (biểu thị bằng dấu chấm - dòng biến mất). Do sự xóa sổ này, E
nên là cục bộ cho nhà phát triển Ed và không bao giờ được đẩy sang bất kỳ kho lưu trữ nào khác. Ưu điểm của rebase là tránh được hình dạng kim cương và lịch sử vẫn ổn định - hầu hết các nhà phát triển đều thích điều đó!
git merge
không xen kẽ các cam kết (nhưng nó có thể xuất hiện như vậy bằng cách nhìn vào git log
). Thay vào đó, git merge
giữ cho cả lịch sử phát triển của Dan và Ed được giữ nguyên, vì nó được nhìn thấy từ mỗi quan điểm tại một thời điểm. git rebase
làm cho nó trông giống như Dan làm việc trước, và Ed đi theo anh ta. Trong cả hai trường hợp (hợp nhất và rebase), cây tệp kết quả thực tế là hoàn toàn giống nhau.
Tôi thực sự thích đoạn trích này từ 10 điều tôi ghét về git (nó đưa ra một lời giải thích ngắn cho rebase trong ví dụ thứ hai của nó):
3. Tài liệu xảo quyệt
Các trang người đàn ông là một toàn năng “f *** you” 1 . Họ mô tả các lệnh từ quan điểm của một nhà khoa học máy tính, không phải người dùng. Trường hợp tại điểm:
git-push – Update remote refs along with associated objects
Đây là một mô tả cho con người:
git-push – Upload changes from your local repository into a remote repository
Cập nhật, một ví dụ khác: (cảm ơn cgd)
git-rebase – Forward-port local commits to the updated upstream head
Dịch:
git-rebase – Sequentially regenerate a series of commits so they can be applied directly to the head node
Và sau đó chúng ta có
git-merge - Join two or more development histories together
đó là một mô tả tốt.
1. không kiểm duyệt trong bản gốc
Cá nhân tôi không thấy kỹ thuật lập biểu đồ tiêu chuẩn rất hữu ích - các mũi tên dường như luôn chỉ sai đường cho tôi. (Họ thường chỉ về phía "cha mẹ" của mỗi lần cam kết, kết cục là ngược thời gian, điều này thật kỳ lạ).
Để giải thích nó bằng lời:
Vì những lý do tôi không hiểu, các công cụ GUI cho Git chưa bao giờ nỗ lực để trình bày lịch sử hợp nhất rõ ràng hơn, trừu tượng hóa các hợp nhất riêng lẻ. Vì vậy, nếu bạn muốn có một "lịch sử sạch", bạn cần sử dụng rebase.
Tôi dường như nhớ lại việc đã đọc các bài đăng trên blog từ các lập trình viên, những người chỉ sử dụng rebase và những người khác không bao giờ sử dụng rebase.
Tôi sẽ cố gắng giải thích điều này với một ví dụ chỉ bằng lời nói. Giả sử những người khác trong dự án của bạn đang làm việc trên giao diện người dùng và bạn đang viết tài liệu. Nếu không có rebase, lịch sử của bạn có thể trông giống như:
Write tutorial
Merge remote-tracking branch 'origin/master' into fixdocs
Bigger buttons
Drop down list
Extend README
Merge remote-tracking branch 'origin/master' into fixdocs
Make window larger
Fix a mistake in howto.md
Đó là, hợp nhất và cam kết UI ở giữa các cam kết tài liệu của bạn.
Nếu bạn đã khởi động lại mã của mình thành chủ thay vì hợp nhất nó, nó sẽ trông như thế này:
Write tutorial
Extend README
Fix a mistake in howto.md
Bigger buttons
Drop down list
Make window larger
Tất cả các cam kết của bạn đều ở trên cùng (mới nhất), tiếp theo là phần còn lại của master
chi nhánh.
( Tuyên bố miễn trừ trách nhiệm: Tôi là tác giả của bài đăng "10 điều tôi ghét về Git" được đề cập trong một câu trả lời khác )
Mặc dù câu trả lời được chấp nhận và được đánh giá cao nhất là tuyệt vời, nhưng tôi cũng thấy hữu ích khi cố gắng giải thích sự khác biệt chỉ bằng lời nói:
hợp nhất
nổi loạn
tóm tắt: Khi có thể, rebase hầu như luôn luôn tốt hơn. Làm cho việc tích hợp lại vào chi nhánh chính dễ dàng hơn.
Bởi vì? Work công việc tính năng của bạn có thể được trình bày dưới dạng một 'tệp vá' lớn (còn gọi là diff) đối với nhánh chính, không phải 'giải thích' nhiều phụ huynh: Ít nhất hai, đến từ một hợp nhất, nhưng có thể nhiều hơn nữa, nếu có là một số hợp nhất. Không giống như sáp nhập, nhiều cuộc nổi loạn không thêm vào. (một điểm cộng lớn khác)
Git rebase gần hơn với sự hợp nhất. Sự khác biệt trong rebase là:
Vì vậy, điều đó có nghĩa là tất cả các cam kết cục bộ của bạn được chuyển đến cuối cùng, sau khi tất cả các cam kết từ xa. Nếu bạn có một xung đột hợp nhất, bạn cũng phải giải quyết nó.
Tôi tìm thấy một bài viết thực sự thú vị về git rebase vs merge , đã nghĩ đến việc chia sẻ nó ở đây