2010-01-22 30 views
10

Tôi đang cố gắng hiểu chi tiết về các lệnh hợp nhất lật đổ. Tôi nghĩ sự hiểu biết về sự khác biệt giữa thay đổi cũng là xung đột và thay đổi không phải là xung đột sẽ giúp ích.Ví dụ về thay đổi KHÔNG PHẢI là xung đột

Đây là phần tiếp theo của số thread này.

Trả lời

22

Thay đổi là xung đột là khi 2 người đã thực hiện thay đổi cho cùng một tệp theo cách mà hai thay đổi không thể được giải quyết tự động.

1) Cho phép bắt đầu bằng ví dụ về quá trình hợp nhất không xung đột.

tập tin gốc

line1 
line2 
line3 

Blogger A thay đổi nó như thế này:

line1CHANGED 
line2 
line3 

Person B thay đổi nó như thế này:

line1 
line2CHANGED 
line3 

Khi những đều kiểm tra trong và sáp nhập , không có xung đột vì nó có thể dễ dàng giải quyết để tạo ra tệp cuối cùng này:

line1CHANGED 
line2CHANGED 
line3 

Subversion sẽ xử lý việc này tự động dưới dạng hợp nhất.

2) Bây giờ là ví dụ về các thay đổi xung đột.

gốc tập tin

line1 
line2 
line3 

Blogger A thay đổi nó như thế này:

line1CHANGED_BY_A 
line2 
line3 

Person B thay đổi nó như thế này:

line1CHANGED_BY_B 
line2 
line3 

này không thể được sáp nhập tự động, vì vậy nó là một cuộc xung đột. Bạn sẽ cần giải quyết, bằng cách chấp nhận thay đổi của người A hoặc người B thay đổi. Trong trường hợp này subversion sẽ cảnh báo bạn về các xung đột và yêu cầu quyết định từ bạn về cách giải quyết chúng.

3) Cuối cùng, bạn có thể có cả hai thay đổi xung đột và không xung đột trong cùng một sửa đổi.

tập tin gốc

line1 
line2 
line3 

Blogger A thay đổi nó như thế này:

line1CHANGED_BY_A 
line2ALSO_CHANGED_BY_A 
line3 

Person B thay đổi nó như thế này:

line1CHANGED_BY_B 
line2 
line3ALSO_CHANGED_BY_B 

Bây giờ, với ví dụ này, cả hai người đã thay đổi tệp và có thay đổi xung đột trên dòng 1 phải được giải quyết, nhưng dòng s 2 & 3 là những thay đổi không mâu thuẫn và có thể được giải quyết tự động.

Bạn có thể chọn giải quyết vấn đề này theo nhiều cách.

Thứ nhất, bạn hoàn toàn có thể chấp nhận tệp của A hoặc B và loại bỏ tệp còn lại. Điều này sẽ dẫn đến những thay đổi không xung đột với những người khác bị mất. Này, bạn chọn hoàn toàn giải quyết bằng A, tập cuối cùng của bạn sẽ là:

line1CHANGED_BY_A 
line2ALSO_CHANGED_BY_A 
line3 

(Chính xác tập tin A, và tất cả những thay đổi này bằng B sẽ bị loại bỏ)

Thứ hai, bạn có thể giải quyết chỉ thay đổi mâu thuẫn, và vẫn giữ lại tất cả các thay đổi không xung đột.Đây là bạn sẽ chọn thay đổi của A hoặc B cho dòng đầu tiên, và vẫn nhận được cả hai thay đổi của dòng khác, từ cả hai người. Vì vậy, nói ví dụ bạn chọn để giải quyết mâu thuẫn bằng A, tập cuối cùng của bạn sẽ là:

line1CHANGED_BY_A 
line2ALSO_CHANGED_BY_A 
line3ALSO_CHANGED_BY_B 

Alternative bạn có thể sử dụng các công cụ như KDiff có hỗ trợ xem xét của mỗi xung đột riêng (vì tất nhiên bạn có thể có những thay đổi mutliple, cả xung đột lẫn không xung đột, trong cùng một tệp), điều này sẽ cho phép bạn chọn các phương pháp phân giải khác nhau cho mỗi tệp.

Nếu bạn gặp khó khăn khi tìm hiểu cách hợp nhất với các công cụ dòng lệnh, tôi khuyên bạn nên xem KDiff (hoặc một số công cụ phối hợp/khác GUI) khi chúng hiển thị các tệp cùng với nhau (cùng với bản gốc) và cho phép bạn trực quan những gì mỗi hành động giải quyết sẽ làm.

+0

Cảm ơn bạn đã trả lời chi tiết! Tôi đã có thể tái tạo các ví dụ của bạn trong một dự án svn và cuối cùng tôi đã hiểu được sự khác biệt giữa các lệnh mâu thuẫn và các lệnh đầy đủ của tôi! =) –

6

Xem xét một hàm như thế này (gọi nó là phiên bản 1)

void foo(){ 
    int bar; 
} 

Bây giờ chúng ta hãy giả sử hai người thay đổi chức năng này, cả hai bắt đầu từ phiên bản 1.

Alice:

void foo(){ 
    char bar; 
} 

Bob:

double foo(){ 
    double bar; 
    bar = 0; 
    return bar; 
} 

Vì lợi ích của ví dụ này, giả sử Alice cam kết thay đổi của cô ấy.

Bây giờ Bob chuyển sang cam kết thay đổi và svn sẽ thông báo cho Bob rằng anh đã lỗi thời và cần cập nhật và hợp nhất các thay đổi. Vì vậy, Bob chạy bản cập nhật và quá trình hợp nhất diễn ra.

Về cơ bản, đó là (hơi) dễ dàng nhận thấy rằng những gì xảy ra là một phân tích rằng quyết định những gì Bob thay đổi từ phiên bản 1 và những gì Alice đã thay đổi từ phiên bản 1. Một hợp nhất đơn giản sẽ tạo ra một cái gì đó giống như

double foo(){ 
    [conflict] bar; 
    bar = 0; 
    return bar; 
} 

Note cả Alice và Bob đã thay đổi loại bar từ int, ngoại trừ Alice đã làm cho nó char và Bob đã làm cho nó double. Việc sáp nhập không thể quyết định cái nào là đúng (nó không thực hiện phân tích mã), vì vậy con người Bob cần giúp giải quyết xung đột. Tất cả các thay đổi khác là không phải xung đột.

Nếu Bob không thay đổi loại bar, các tệp sẽ được hợp nhất mà không xung đột.

+0

Ví dụ hay. +1 –

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