Giải quyết mâu thuẫn

Lâu lâu một lần, bạn sẽ nhận được một xung đột khi bạn cập nhật / sáp nhập các tập tin của bạn từ kho hoặc khi bạn chuyển bản sao của bạn làm việc đến một URL khác nhau. Có hai loại xung đột:

xung đột tập tin

Sự xung đột giữa các tập tin xảy ra nếu có hai (hoặc nhiều hơn) nhà phát triển đã thay đổi một vài dòng của một tập tin.

các xung đột cây

Sự xung đột giữa các cây xảy ra khi một nhà phát triển di chuyển / đổi tên / xóa một tập tin hoặc thư mục, mà một nhà phát triển khác hoặc cũng đã di chuyển / đổi tên / xóa hoặc chỉ sửa đổi.

Các xung đột tập tin

A file conflict occurs when two or more developers have changed the same few lines of a file. As Subversion knows nothing of your project, it leaves resolving the conflicts to the developers. The conflicting area in a text file is marked like this:

<<<<<<< filename
your changes
=======
code merged from repository
>>>>>>> revision
      

Also, for every conflicted file Subversion places three additional files in your directory:

filename.ext.mine

Đây là của bạn vì nó tồn tại trong bản sao làm việc của bạn trước khi bạn cập nhật bản sao của bạn làm việc - có nghĩa là, không có đánh dấu xung đột. tập tin này có những thay đổi mới nhất của bạn trong đó và không có gì khác.

filename.ext.rOLDREV

Đây là tập tin sửa đổi CƠ BẢN trước khi bạn cập nhật bản sao của bạn làm việc. Nghĩa là, các tập tin mà bạn kiểm tra ra trước khi bạn đã thực hiện chỉnh sửa mới nhất của bạn.

filename.ext.rNEWREV

Đây là tập tin mà máy khách Subversion của bạn chỉ nhận được từ máy chủ khi bạn cập nhật bản sao làm việc của bạn. Tập tin này tương ứng với bản sửa đổi CHÍNH của kho.

Bạn có thể khởi động một công cụ hợp nhất / biên tập xung đột bên ngoài với TortoiseSVN Chỉnh Sửa Xung Đột hoặc bạn có thể sử dụng bất kỳ trình soạn thảo văn bản để giải quyết cuộc xung đột bằng tay. Bạn nên quyết định các mã nên trông như thế nào, làm những thay đổi cần thiết và các tập tin. Sử dụng một công cụ hợp nhất như TortoiseMerge hoặc một trong những công cụ phổ biến khác là lựa chọn dễ dàng hơn bởi chúng nói chung trình bày các tập tin liên quan trong một cửa sổ xem 3-bảng và bạn không phải lo lắng về những dấu hiệu xung đột. Nếu bạn sử dụng một trình soạn thảo văn bản thì bạn nên tìm kiếm các dòng bắt đầu với chuỗi <<<<<<< .

Sau đó thực hiện các lệnh TortoiseSVN Giải quyết và cam kết sửa đổi của bạn vào kho lưu trữ. Xin lưu ý rằng lệnh Giải Quyết không thực sự giải quyết cuộc xung đột. Chỉ cần loại bỏ các tập tin filename.ext.mine filename.ext.r * , sẽ cho phép bạn cam kết thay đổi của bạn.

Nếu bạn có xung đột với các tập tin nhị phân, Subversion không cố gắng để hợp nhất các tập tin. Các tập tin địa phương vẫn không thay đổi (chính xác như lần cuối bạn thay đổi nó) và bạn có các tập tin filename.ext.r * . Nếu bạn muốn loại bỏ các thay đổi của bạn và giữ các phiên bản trong kho lưu trữ, chỉ cần sử dụng lệnh Hoàn Nguyên. Nếu bạn muốn giữ phiên bản của bạn và ghi đè lên phiên bản kho lưu trữ, sử dụng lệnh Giải Quyết, sau đó cam kết phiên bản của bạn.

Bạn có thể sử dụng lệnh Giải Quyết cho nhiều tập tin nếu bạn kích chuột phải vào thư mục mẹ và chọn TortoiseSVN Giải Quyết ... Điều này sẽ mang đến một hộp thoại liệt kê tất cả các tập tin mâu thuẫn trong thư mục đó, và bạn có thể chọn những cái để đánh dấu là đã giải quyết.

Xung đột về thuộc tính

Sự xung đột giữa các thuộc tính xảy ra khi hai hay nhiều nhà phát triển đã thay đổi cùng một thuộc tính. Như với nội dung tập tin, giải quyết cuộc xung đột chỉ có thể được thực hiện bởi các nhà phát triển.

Nếu một trong những thay đổi phải ghi đè lên nhau thì chọn tùy chọn để Giải quyết bằng cách sử dụng tính chất địa phương hoặc Giải quyết bằng cách sử dụng tính chất từ xa . Nếu thay đổi phải được sáp nhập sau đó chọn Tự chỉnh sửa tính chất , sắp xếp những gì giá trị tính chất nên là và đánh dấu như đã giải quyết.

Mâu Thuẫn Cây

Sự xung đột giữa các cây xảy ra khi một nhà phát triển di chuyển / đổi tên / xóa một tập tin hoặc thư mục, mà một nhà phát triển khác hoặc cũng đã di chuyển / đổi tên / xóa hoặc chỉ cần sửa đổi. Có rất nhiều tình huống khác nhau có thể dẫn đến một cuộc xung đột cây, và tất cả chúng yêu cầu các bước khác nhau để giải quyết cuộc xung đột.

Khi một tập tin bị xóa tại địa phương trong Subversion, tập tin đó cũng bị xóa từ hệ thống tập tin địa phương, do đó, ngay cả nếu nó là một phần của một cuộc xung đột cây nó không thể hiển thị một lớp phủ mâu thuẫn và bạn không thể nhấp chuột phải vào nó để giải quyết cuộc xung đột. Sử dụng hộp thoại Kiểm tra xem có sửa đổi thay vì truy cập vào tùy chọn Chỉnh sửa xung đột .

TortoiseSVN có thể giúp tìm đúng nơi để sáp nhập các thay đổi, nhưng các việc cần thiết có thể cần thêm để sắp xếp những cuộc xung đột. Hãy nhớ rằng sau khi cập nhật một bản làm việc CƠ SỞ thì sẽ luôn luôn có các sửa đổi ở từng hạng mục như trong kho tại thời điểm cập nhật. Nếu bạn trở lại một sự thay đổi sau khi cập nhật thì nó đi trở lại tình trạng kho, không giống như nó trước đó khi bạn bắt đầu tạo ra những thay đổi của địa phương của bạn.

Xóa tại địa phương, biên tập sắp tới khi cập nhật

  1. Nhà phát triển A thay đổi Foo.c và cam kết nó vào kho lưu trữ.

  2. Nhà phát triển B đã đồng thời di chuyển Foo.c thành Bar.c trong bản sao làm việc của mình, hoặc chỉ đơn giản là xóa Foo.c hoặc thư mục cha mẹ của nó.

Bản cập nhật bản sao kết quả của nhà phát triển B dẫn đến một cuộc xung đột cây:

  • Foo.c đã được xóa từ bản sao làm việc, nhưng được đánh dấu bằng một cuộc xung đột cây.

  • Nếu kết quả cuộc xung đột từ việc đổi tên một chứ không phải là một việc xóa thì Bar.c được đánh dấu là thêm vào, nhưng không chứa các sửa đổi của nhà phát triển A.

Nhà phát triển B đã chọn giữ các thay đổi của Nhà phát triển A. Trong trường hợp đổi tên của một tập tin, ông có thể sáp nhập các thay đổi Foo.c vào các tập tin đổi tên Bar.c . Đối với việc xóa bỏ tập tin hoặc thư mục đơn giản, ông có thể chọn giữ cho các mục với thay đổi của nhà phát triển A và loại bỏ việc xóa. Hoặc, bằng cách đánh dấu cuộc xung đột được giải quyết mà không làm bất cứ điều gì, ông ta loại bỏ thay đổi của nhà phát triển A một cách hiệu quả.

The conflict edit dialog offers to merge changes if it can find the original file of the renamed Bar.c. If there are multiple files that are possible move sources, then a button for each of these files is shown which allow you to chose the correct file.

Biên tập tại địa phương, việc xóa sắp tới trên cập nhật

  1. Nhà phát triển A di chuyển Foo.c thành Bar.c và cam kết nó vào kho lưu trữ.

  2. Nhà phát triển B thay đổi Foo.c trong bản sao làm việc của mình.

Hoặc trong trường hợp của một di chuyển thư mục ...

  1. Nhà phát triển A di chuyển thư mục mẹ FooFolder sang BarFolder và cam kết nó vào kho lưu trữ.

  2. Nhà phát triển B thay đổi Foo.c trong bản sao làm việc của mình.

Cập nhật các bản sao kết quả làm việc của nhà phát triển B dẫn đến một cuộc xung đột cây. Đối với một xung đột tập tin đơn giản:

  • Bar.c được thêm vào bản sao làm việc như một tập tin bình thường.

  • Foo.c được đánh dấu là thêm vào (với lịch sử) và có một cuộc xung đột cây.

Đối với một cuộc xung đột thư mục:

  • BarFolder được thêm vào bản sao làm việc như một thư mục bình thường.

  • FooFolder được đánh dấu là thêm vào (với lịch sử) và có một cuộc xung đột cây.

    Foo.c được đánh dấu là đã sửa đổi.

Nhà phát triển B bây giờ phải quyết định xem có nên đi với việc tổ chức lại nhà phát triển A và hợp nhất các thay đổi của bà vào tập tin tương ứng trong cơ cấu mới, hoặc chỉ đơn giản là trở lại các thay đổi của A và giữ các tập tin địa phương.

To merge her local changes with the reshuffle, Developer B must first find out to what filename the conflicted file Foo.c was renamed/moved in the repository. This can be done by using the log dialog. Then use the button which shows the correct source file to resolve the conflict.

If Developer B decides that A's changes were wrong then she must choose the Mark as resolved button in the conflict editor dialog. This marks the conflicted file/folder as resolved, but Developer A's changes need to be removed by hand. Again the log dialog helps to track down what was moved.

Việc xóa địa phương, việc xóa sắp đến khi cập nhật

  1. Nhà phát triển A di chuyển Foo.c thành Bar.c và cam kết nó vào kho lưu trữ.

  2. Nhà phát triển B di chuyển Foo.c sang Bix.c .

Bản cập nhật bản sao kết quả của nhà phát triển B dẫn đến một cuộc xung đột cây:

  • Bix.c được đánh dấu là thêm vào với lịch sử.

  • Bar.c được thêm vào bản sao làm việc với trạng thái "bình thường".

  • Foo.c được đánh dấu là bị xóa và có một cuộc xung đột cây.

Để giải quyết cuộc xung đột này, nhà phát triển B phải tìm ra tên tập tin gì mà tập tin mâu thuẫn Foo.c đã được đổi tên / di chuyển trong kho. Điều này có thể được thực hiện bằng cách sử dụng hộp thoại tường trình.

Sau đó, nhà phát triển B phải quyết định tên tập tin mới của Foo.c để giữ - tập tin được thực hiện bởi nhà phát triển A hoặc đổi tên được thực hiện bởi ông ta.

Sau khi nhà phát triển B giải quyết bằng tay cuộc xung đột, cuộc xung đột cây đã được đánh dấu là giải quyết với các nút trong hộp thoại biên tập xung đột.

Không có tại địa phương, chỉnh sửa sắp đến lúc hợp nhất

  1. Nhà phát triển A làm việc trên thân cây thay đổi Foo.c và cam kết nó vào kho lưu trữ

  2. Nhà phát triển B làm việc trên một chi nhánh di chuyển Foo.c sang Bar.c và cam kết nó vào kho lưu trữ

Một sự hợp nhất của những thay đổi trên thân cây của nhà phát triển A đến bản sao làm việc chi nhánh của nhà phát triển B dẫn đến một cuộc xung đột cây:

  • Bar.c đã có trong bản sao làm việc với trạng thái "bình thường".

  • Foo.c được đánh dấu là bị mất với một cuộc xung đột cây.

Để giải quyết cuộc xung đột này, nhà phát triển B phải đánh dấu các tập tin như đã được giải quyết trong hộp thoại biên tập xung đột, mà sẽ loại bỏ nó từ danh sách xung đột. Sau đó, cô đã quyết định liệu có sao chép các tập tin bị thiếu Foo.c từ kho lưu trữ các bản sao làm việc, cho dù kết hợp phát triển thay đổi của nhà phát triển A Foo.c vào tập tin được đổi tên Bar.c hoặc bỏ qua các thay đổi bằng cách đánh dấu cuộc xung đột được giải quyết và không làm gì khác.

Lưu ý rằng nếu bạn sao chép các tập tin bị mất từ ​​kho và sau đó đánh dấu như giải quyết, sao chép của bạn sẽ được gỡ bỏ một lần nữa. Bạn phải giải quyết cuộc xung đột trước tiên.

Biên tập tại địa phương, việc xóa đến lúc hợp nhất

  1. Nhà phát triển A làm việc trên thân cây di chuyển Foo.c sang Bar.c và cam kết nó vào kho lưu trữ.

  2. Nhà phát triển B làm việc trên một chi nhánh thay đổi Foo.c và cam kết nó vào kho lưu trữ.

  1. Nhà phát triển A làm việc trên thân cây di chuyển thư mục mẹ FooFolder sang BarFolder và cam kết nó vào kho lưu trữ.

  2. Nhà phát triển B làm việc trên một chi nhánh thay đổi Foo.c trên bản sao làm việc của mình.

Một sự hợp nhất của những thay đổi trên thân cây của nhà phát triển A đến bản sao làm việc chi nhánh của nhà phát triển B dẫn đến một cuộc xung đột cây:

  • Bar.c được đánh dấu là đã được thêm vào.

  • Foo.c được đánh dấu là đã sửa đổi với một cuộc xung đột cây.

Nhà phát triển B bây giờ phải quyết định xem có nên đi với việc tổ chức lại nhà phát triển A và hợp nhất các thay đổi của bà vào tập tin tương ứng trong cơ cấu mới, hoặc chỉ đơn giản là trở lại các thay đổi của A và giữ các tập tin địa phương.

To merge her local changes with the reshuffle, Developer B must first find out to what filename the conflicted file Foo.c was renamed/moved in the repository. This can be done by using the log dialog for the merge source. The conflict editor only shows the log for the working copy as it does not know which path was used in the merge, so you will have to find that yourself. The changes must then be merged by hand as there is currently no way to automate or even simplify this process. Once the changes have been ported across, the conflicted path is redundant and can be deleted.

If Developer B decides that A's changes were wrong then she must choose the Mark as resolved button in the conflict editor dialog. This marks the conflicted file/folder as resolved, but Developer A's changes need to be removed by hand. Again the log dialog for the merge source helps to track down what was moved.

Việc xóa địa phương, xóa đến khi hợp nhất

  1. Nhà phát triển A làm việc trên thân cây di chuyển Foo.c sang Bar.c và cam kết nó vào kho lưu trữ.

  2. Nhà phát triển B làm việc trên một chi nhánh di chuyển Foo.c sang Bix.c và cam kết nó vào kho lưu trữ.

Một sự hợp nhất của những thay đổi trên thân cây của nhà phát triển A đến bản sao làm việc chi nhánh của nhà phát triển B dẫn đến một cuộc xung đột cây:

  • Bix.c được đánh dấu với trạng thái bình thường (chưa sửa đổi).

  • Bar.c được đánh dấu là đã được thêm vào với lịch sử.

  • Foo.c được đánh dấu là mất tích và có một cuộc xung đột cây.

To resolve this conflict, Developer B has to find out to what filename the conflicted file Foo.c was renamed/moved in the repository. This can be done by using the log dialog for the merge source.

Sau đó, nhà phát triển B phải quyết định tên tập tin mới của Foo.c để giữ - tập tin được thực hiện bởi nhà phát triển A hoặc đổi tên được thực hiện bởi ông ta.

Sau khi nhà phát triển B giải quyết bằng tay cuộc xung đột, cuộc xung đột cây đã được đánh dấu là giải quyết với các nút trong hộp thoại biên tập xung đột.

Các xung đột cây khác

Có những trường hợp khác được dán nhãn là các cuộc xung đột cây chỉ đơn giản là vì cuộc xung đột liên quan đến một thư mục chứ không phải là một tập tin. Ví dụ nếu bạn thêm một thư mục có cùng tên cho cả hai thân và chi nhánh và sau đó cố gắng hợp nhất, bạn sẽ có được một cuộc xung đột cây. Nếu bạn muốn giữ lại các thư mục từ mục tiêu hợp nhất, chỉ cần đánh dấu cuộc xung đột là đã được giải quyết. Nếu bạn muốn sử dụng một trong các nguồn hợp nhất sau đó bạn cần phải dùng SVN xóa một trong những mục tiêu trước tiên và chạy hợp nhất một lần nữa. Nếu bạn cần bất cứ điều gì phức tạp hơn sau đó bạn phải giải quyết bằng tay.