2010-04-22 32 views
18

Như tiêu đề cho thấy, tôi tò mò là tại sao rất nhiều người mời Git như là một thay thế cao cấp cho phân nhánh/sáp nhập qua SVN. Tôi chủ yếu tò mò vì SVN sáp nhập hút và tôi muốn một giải pháp thay thế.Sự khác nhau giữa SVN và Git để hợp nhất là gì?

Git xử lý hợp nhất tốt hơn như thế nào? Làm thế nào nó hoạt động?

Ví dụ: trong SVN, nếu tôi có dòng sau:

Xin chào thế giới!

Sau đó user1 thay đổi nó để:

Hello World 1

sau đó user2 thay đổi nó để:

Hello World 12

Sau đó user2 cam kết, sau đó user1 cam kết, SVN sẽ cung cấp cho bạn một cuộc xung đột. Git có thể giải quyết một cái gì đó đơn giản như thế này?

+23

git không thể đọc được tâm trí của bạn nữa so với svn có thể. – Ether

Trả lời

26

Điều đó được gọi là hợp nhất với xung đột và không VCS nào sẽ giải quyết điều đó cho bạn.
Bạn sẽ phải tự giải quyết việc hợp nhất.

Như đã đề cập trong Why merging in git is better than SVN, sự khác biệt thực tế là trong ghi lịch sử các cam kết:

đó cho phép Git để nhớ những gì đã sáp nhập, giảm đáng kể các xung đột xảy ra.

DAG

Vì vậy, khi nói đến thời gian để làm sáp nhập từ 5b giao cho (a) chi nhánh, chúng ta có thể sử dụng thông tin trong DAG để biết rằng 3b và 2b đã được thực hiện


vì vậy, nó là merge worflow rằng Git sẽ xử lý nhiều duyên dáng hơn SVN:
Xem Merge Git vs. SVN cho ví dụ cụ thể.

+0

@VonC: Nhưng ảnh của bạn có hình ảnh đẹp và liên kết để trả lời về khả năng kết hợp của SVN mà tôi không thể cung cấp bất kỳ chi tiết cụ thể nào cho. +1! – Cascabel

+0

@ Jefromi: vâng, tôi thích hình ảnh đẹp;) Tôi chỉ thêm một tham chiếu đến một câu hỏi SO khác minh họa những khó khăn (cho SVN) để quản lý "các mẫu kết hợp phức tạp hơn" mà bạn ám chỉ trong câu trả lời của bạn. – VonC

+0

Bạn làm cách nào để tạo hình ảnh đó? –

13

Xung đột cụ thể mà bạn đề cập là luôn là không thể giải quyết. Đơn giản là không có cách nào cho một công cụ hợp nhất để biết phiên bản nào sẽ được giữ lại.

Git có lẽ tốt hơn SVN khi giao dịch với các xung đột có thể giải quyết được. Chiến lược hợp nhất chính của nó là đệ quy, tìm thấy tổ tiên chung của hai cam kết thay đổi cùng một tệp và thực hiện hợp nhất ba chiều. Nó cũng có một số khả năng tích hợp để ghi lại và sử dụng lại độ phân giải xung đột (git-rerere) và một loạt các loại khác merge strategies cho các trường hợp đặc biệt.

Lợi thế của Git khi hợp nhất là nó là một phần của lịch sử. Cam kết hợp nhất là cam kết với hai cha mẹ. Mô hình lịch sử của Git (một đồ thị theo chu kỳ trực tiếp) hy vọng có cam kết như thế này.Điều này có nghĩa rằng việc sáp nhập thêm trong tương lai sẽ hoạt động chính xác như thế nào. Luôn luôn. (Có, đôi khi có xung đột, nhưng chúng là xung đột thực sự, không phải là không có khả năng xử lý hợp nhất.)

Mặt khác, SVN chỉ cố gắng theo dõi vị trí hợp nhất xảy ra, nhưng mô hình của nó vẫn vốn tuyến tính . Lịch sử vẫn chỉ có một chuỗi các cam kết, với thông tin theo dõi hợp nhất cung cấp trợ giúp thêm. Từ những gì tôi đã nghe, SVN không thể luôn xử lý các mẫu hợp nhất phức tạp hơn. (Một ví dụ là kết hợp phản chiếu - hợp nhất A thành B rồi B ​​thành A.)

+0

Tôi là người đầu tiên! Trong 50 giây! ... Nhưng hãy đối mặt với nó, câu trả lời của bạn là chi tiết hơn và chính xác hơn;) +1 – VonC

Các vấn đề liên quan