2014-05-20 16 views
9

Trong người đàn ông git-merge doc, git merge -s recursive -X ours:git merge -s đệ quy -X của chúng ta vs git merge -s của chúng ta?

này không nên nhầm lẫn với chúng ta hợp nhất chiến lược, mà không thậm chí không nhìn vào những gì các cây khác có chứa chút nào. Nó loại bỏ mọi thứ cây khác đã làm, tuyên bố lịch sử của chúng tôi chứa tất cả những gì mà xảy ra trong đó.

Tôi đã thử nghiệm hai điều này nhưng không thể tìm thấy sự khác biệt.

Có ví dụ nào để cho biết sự khác biệt giữa hai loại này là gì?

phiên bản git của tôi là git version 1.8.3.4

Trả lời

18

Khi trang người đàn ông nói, -s ours bỏ qua nội dung của toàn bộ chi nhánh khác. Điều này phải đủ rõ ràng: không có vấn đề gì trong các chi nhánh khác, cây gắn liền với cam kết hợp nhất là giống với cây trong cam kết HEAD trước khi hợp nhất.

Điều gì -X ours không tinh tế hơn: nó sử dụng phiên bản "của chúng tôi" của thay đổi chỉ khi có xung đột.

Đây là một ví dụ tương đối đơn giản.

Giả sử bạn đang ở trên chi nhánh br1 và bạn yêu cầu nhập vào chi nhánh br2.Chúng tôi sẽ làm cho các thực sự đơn giản, với cam kết B (nguồn gốc cơ sở hợp nhất cho cả chi nhánh) có một cam kết duy nhất K trên nhánh br1, và một cam kết duy nhất L trên nhánh br2:

... - B - K <-- HEAD=br1 
     \ 
      L <-- br2 

Hơn nữa, sự khác biệt từ B-K bao gồm chỉ có một mục:

  • thay đổi (đã có sẵn) nộp f1: thay thế đầu tiên dòng dog với cat
  • 012.

Trong khi đó, sự khác biệt B-L gồm:

  • tập tin thay đổi f1: thay thế dòng đầu tiên dog với poodle
  • tập tin thay đổi f2: thay thế dòng cuối cùng elephant với rhinoceros

Khi bạn hợp nhất các chiến dịch này không có chiến lược hoặc tùy chọn, sẽ có b e xung đột trong tệp f1 (các thay đổi khác nhau cho cùng một dòng), nhưng không phải trong f2 (cam kết hợp nhất sẽ thay đổi trong cam kết L để tệp f2 sẽ thay đổi).

Nếu bạn sử dụng:

git merge -s ours br2 

lệnh hợp nhất sẽ sử dụng phiên bản "của chúng ta" của tập tin f1 (dog trở thành cat), và cũng phiên bản của chúng ta về tập tin f2 (elephant là không thay đổi).

Nếu bạn sử dụng:

git merge -s recursive -X ours 

lệnh hợp nhất sẽ tìm thấy một mâu thuẫn trong hồ sơ f1 và sẽ giải quyết nó trong lợi của chúng tôi phiên bản này cũng giống như trước đây, nhưng không có mâu thuẫn trong hồ sơ f2 , do đó git sẽ sử dụng phiên bản f2 (elephant của chúng tôi sẽ trở thành rhinoceros).

(ví dụ đơn giản này không hiển thị những gì sẽ xảy ra nếu có hai sự thay đổi khác nhau trong các lĩnh vực khác nhau trong f1 hoặc f2. Nếu f1 là đủ dài và có một sự thay đổi trong phạm L tiếp tục xuống hơn "dòng đầu tiên của tập tin" , hợp nhất có thể nhận thay đổi đó vì nó sẽ không xung đột với sự thay đổi dog -to- cat.)

8

Tôi không biết về bất kỳ ví dụ cụ thể, nhưng sự khác biệt là thế này:

git merge -s recursive -X ours 

này thực hiện việc "bình thường" merge (chiến lược recursive là mặc định một) và khi có xung đột được tìm thấy, nó cố gắng giải quyết các xung đột đó bằng cách tự động sử dụng các đoạn mã từ nhánh được hợp nhất vào ("của chúng tôi"), thay vì để lại dấu xung đột.

git merge -s ours 

Như các tài liệu bạn trích dẫn nói, này có phiên bản của chúng ta về mã, trong đó là toàn bộ, và làm cho nó là kết quả của việc hợp nhất - chi nhánh khác thậm chí không được xem xét, không có xung đột được phát hiện, vv Nó chỉ đơn giản là nói "thực hiện một cam kết mới trông giống như nó kết hợp các chi nhánh khác trong, nhưng để lại nội dung kết quả chính xác như cách nó trông ngay bây giờ trong nhánh hiện tại".

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