2008-11-29 26 views
15

Tôi đã sử dụng TortoiseSVN, svn, và subclipse và tôi nghĩ rằng tôi hiểu những điều cơ bản, nhưng có một điều đã được bugging cho tôi một thời gian: Sáp nhập giới thiệu mã không mong muốn. Đây là các bước.Subversion: Làm thế nào để hợp nhất các bản sửa đổi cụ thể vào thân cây khi nhiều thay đổi liên tiếp được thực hiện trong một chi nhánh?

trunk/[email protected]. Tệp thử nghiệm được tạo bằng 'A' và trả về:

A 
[EOF] 

branches/TRY-XX-Foo/[email protected]. Nhánh ra trunk để TRY-XX-Foo:

A 
[EOF] 

branches/TRY-XX-Foo/[email protected]. Thực hiện thay đổi không mong muốn trong TRY-XX-Foo và cam kết:

A 
B (unwanted change) 
[EOF] 

branches/TRY-XX-Foo/[email protected]. Đưa ra một bản vá lỗi quan trọng trong TRY-XX-Foo và cam kết nó:

A 
B (unwanted change) 
C (important bug fix) 
[EOF] 

Bây giờ, tôi muốn hợp nhất chỉ là lỗi quan trọng khắc phục trở lại thân cây. Vì vậy, tôi chạy hợp nhất để sửa đổi 4:5. Những gì tôi kết thúc trong thư mục làm việc của tôi là một cuộc xung đột.

trunk/test.txt:

A 
<<<<<<< .working 
======= 
B (unwanted change) 
C (important bug fix) 
>>>>>>> .merge-right.r5 
[EOF] 

Against ý chí của tôi, Subversion hiện đã bao gồm "thay đổi không mong muốn" vào mã thân cây, và tôi cần phải loại bỏ chúng ra bằng tay. Có cách nào để hợp nhất các bản sửa đổi được chỉ định khi có nhiều thay đổi liên tiếp được thực hiện trong chi nhánh không?

Phần của vấn đề là B (thay đổi không mong muốn) được bao gồm trong .merge-right và tôi không thể nói sự khác biệt giữa bản sửa đổi mà nó đến từ đó. Tôi thường sử dụng TortoiseMerge và đây là cách nó trông.

text.txt.working

+2

Để thực hiện kiểm tra thực tế hơn, bạn nên thêm một số 'ngữ cảnh' giữa các dòng bạn thay đổi. Các công cụ khác biệt và hợp nhất văn bản cần một vài dòng ngữ cảnh giữa các thay đổi để thực hiện các kết hợp tự động. Khi bối cảnh không đủ lớn, bạn sẽ thấy xung đột như được hiển thị trong ví dụ cuối cùng của bạn. –

+0

@Bert: hãy đặt câu trả lời là câu trả lời, vì vậy nó có thể được bình chọn. Tôi nghĩ bạn có một điểm ở đây. –

+0

bạn có thể chỉnh sửa chiều rộng hình ảnh của mình không, nó ném ra khỏi văn bản câu hỏi. –

Trả lời

5

Vấn đề là cả hai svn

A 
<<<<<<< .working 
======= 
B (unwanted change) 
C (important bug fix) 
>>>>>>> .merge-right.r341 

và TortoiseSVN đang xử lý tình huống là hợp nhất 2 chiều. Tôi đã nghe về thuật ngữ hợp nhất 3 chiều, vì vậy tôi đã cho Beyond Compare một ảnh. Với thiết lập nhanh với TortoiseSVN, Chỉnh sửa Xung đột giờ đây sẽ hiển thị màn hình sau đây. Điều này không hoàn hảo, vì nó vẫn đòi hỏi sự can thiệp của con người, nhưng ít nhất tôi có thể biết những thay đổi nào đến từ đâu.

See screenshot.

+0

Sử dụng chế độ xem hợp nhất subclipse, bạn có thể bật chế độ xem gốc sẽ giúp bạn có được chế độ xem phối cảnh ba chiều. Kiểm tra góc trên cùng bên phải. –

+0

Vui lòng đặt thông tin này vào câu hỏi của bạn vì đây là câu trả lời. – guerda

+1

@guerda, tôi đang đăng việc sử dụng công cụ hợp nhất 3 chiều làm câu trả lời. –

35

sáp nhập chỉ sửa đổi 4,7, và 11-15 với svnmerge:

svnmerge.py merge -r4,7,11-15 

Và với svn thường xuyên:

svn merge -c4,7 -r10:15 http://.../branches/TRY-XX-Foo 
+0

Chạy từ dòng lệnh vẫn tạo ra kết quả tương tự như TortoiseSVN, gây xung đột và kéo các thay đổi không mong muốn. –

+0

Xin lỗi, tôi đoán tôi không hiểu kịch bản của bạn. Các bản sửa đổi lựa chọn anh đào để hợp nhất các tác phẩm giống như tôi trình bày (và rõ ràng, như bạn đã thử), tôi không chắc vấn đề là gì. – orip

+0

Câu trả lời của Orips phải phù hợp và cung cấp cho bạn kết quả mong muốn. Có lẽ bạn đã không để lại bản sửa đổi 5 trong tuyên bố dòng lệnh của bạn. Sau đó, rõ ràng bạn sẽ kéo sự thay đổi vào hợp nhất. – boutta

0

Nếu bạn không muốn không mong muốn thay đổi, không hợp nhất sửa đổi 4: 5, nhưng chỉ sửa đổi 5. Điều đó có nghĩa là bạn hợp nhất thay đổi đã cam kết trong bản sửa đổi 5.

+0

4: 5 có nghĩa là lấy sự khác biệt giữa 4 và 5 và áp dụng nó vào thư mục làm việc. Tôi đã thử tùy chọn dòng lệnh -c5, nhưng kết quả là như nhau. –

1

Một điều khác bạn có thể làm là tự hoàn tác cam kết xấu trên nhánh, sau đó sẽ cho phép bạn hợp nhất nhánh trở lại vào thân cây như bình thường.

TortoiseSVN

Sử dụng TortoiseSVN bạn mở lên xem log vào một tập tin, chọn phiên bản vi phạm, và chọn "Revert thay đổi từ phiên bản này" từ menu chuột phải. Cam kết những thay đổi mà nó tạo ra trên bản sao làm việc của bạn và sau đó bạn có thể hợp nhất nhánh trở lại một cách dễ dàng.

Command Line

Để làm điều này với khách hàng dòng lệnh bạn thực hiện một hợp ngược lại, (Điều này được lấy từ Control Source Pragmatic sử dụng cuốn sách Subversion), nơi bạn trộn các thay đổi giữa các phiên bản vi phạm và các phiên bản trước đó vào bản sao làm việc của tệp. Sau đó, như trên, bạn sẽ cam kết các thay đổi và sau đó có thể phân nhánh bình thường. Trong ví dụ của bạn, bạn sẽ làm điều gì đó như:

svn merge -r 4:3 test.txt 
+0

Hoàn tác không phải là một tùy chọn vì những thay đổi không mong muốn trong các nhánh/TRY-XX -Foo/đại diện cho các tính năng nửa nướng, chưa sẵn sàng để có được sáp nhập vào thân cây. –

2

Tôi tin rằng bạn đã bao gồm các phiên bản bạn muốn một cách chính xác, nhưng các thuật toán hợp nhất là thất bại trong việc tìm nơi để chèn sự thay đổi mong muốn và nên bao gồm các dòng ở trên nó cũng . Dưới đây là các bước tương tự nhưng với một bộ khác nhau của sự thay đổi, và tôi tin rằng nó hoạt động như bạn mong đợi ban đầu:

 
$ svnadmin create repo 
$ svn mkdir -m '' file://`pwd`/repo/trunk 

Committed revision 1. 
$ svn mkdir -m '' file://`pwd`/repo/branches 

Committed revision 2. 
$ svn co file://`pwd`/repo/trunk co.trunk 
Checked out revision 2. 
$ cat > co.trunk/test.txt << EOF 
> A 
> B 
> C 
> EOF 
$ svn add co.trunk/test.txt 
A   co.trunk/test.txt 
$ svn commit -m '' co.trunk 
Adding   co.trunk/test.txt 
Transmitting file data . 
Committed revision 3. 
$ svn copy -m '' file://`pwd`/repo/trunk file://`pwd`/repo/branches/testbr 

Committed revision 4. 
$ svn co file://`pwd`/repo/branches/testbr co.testbr 
A co.testbr/test.txt 
Checked out revision 4. 
$ cat > co.testbr/test.txt << EOF 
> A 
> A1 unwanted 
> B 
> C 
> EOF 
$ svn commit -m '' co.testbr 
Sending  co.testbr/test.txt 
Transmitting file data . 
Committed revision 5. 
$ cat > co.testbr/test.txt << EOF 
> A 
> A1 unwanted 
> B 
> B1 wanted 
> C 
> EOF 
$ svn commit -m '' co.testbr 
Sending  co.testbr/test.txt 
Transmitting file data . 
Committed revision 6. 
$ svn merge -r 5:6 file://`pwd`/repo/branches/testbr co.trunk 
--- Merging r6 into 'co.trunk': 
U co.trunk/test.txt 
$ cat co.trunk/test.txt 
A 
B 
B1 wanted 
C 
1

Như đã chỉ ra bởi những người dùng khác (Tôi sẽ không mất tín dụng cho chú ý đến nó vì tôi didn' t), nó có thể là bản chất tầm thường của sự hợp nhất này (tức là thiếu bối cảnh xung quanh sự thay đổi) gây nhầm lẫn cho các công cụ.

Tôi thực hiện rất nhiều việc hợp nhất và, như bạn đã khám phá, công cụ hợp nhất do Tortoise cung cấp thật khủng khiếp. Một công cụ hợp nhất ba chiều là tuyệt đối phải nếu bạn làm điều này rất thường xuyên. Ngoài So sánh là yêu thích cá nhân của tôi, nhưng có những thứ khác miễn phí (Meld, KDiff3) và những thứ không phải là (Araxis).

Bạn sẽ nhận thấy rằng Beyond Compare đã làm điều đúng trong phần kết thúc, ngay cả khi nó giúp bạn tự xác minh tính chính xác của nó!

+0

Thiếu bối cảnh chắc chắn là chìa khóa, do đó "nhiều thay đổi liên tiếp". –

2

Vâng để làm rõ một điều về hợp nhất là nó thực sự có 2 bước.

  1. Merge
  2. Commit

Vì vậy, đó có nghĩa là sau khi sáp nhập của bạn được thực hiện, bạn có thể làm một diff thủ công chống lại người đứng đầu và các chi nhánh khác để đảm bảo rằng việc hợp nhất là đúng. Và nếu có điều gì đó sai với nó, như trong trường hợp của bạn, bạn có thể sửa chữa nó theo cách thủ công trước khi cam kết.

/Johan

2

Trong TortoiseSVN, bạn chỉ phải chỉ định các sửa đổi bạn muốn hợp nhất. Không giống như ứng dụng dòng lệnh mà bạn phải chỉ định ví dụ: -r4: 5 để hợp nhất các thay đổi giữa r4 và r5, bạn chỉ phải chỉ định '5' làm số sửa đổi để hợp nhất trong hộp thoại hợp nhất TortoiseSVN. Nếu bạn không chắc chắn, hãy luôn sử dụng hộp thoại tường trình từ hộp thoại hợp nhất và chọn các sửa đổi bạn muốn hợp nhất trong hộp thoại tường trình đó (sau đó nhấp OK và các bản chỉnh sửa đã chọn sẽ tự động được đặt trong hộp thoại hợp nhất).

Để giải quyết xung đột trong TortoiseMerge: Theo ảnh chụp màn hình trong câu hỏi của bạn, TortoiseMerge hiển thị cho bạn hai dòng mâu thuẫn (những dòng được hiển thị là '????' ở chế độ xem dưới cùng). Điều bạn muốn là bao gồm thay đổi 'C' chứ không phải 'B'?

  • nhấp chuột trái vào '???' đầu tiên để chọn nó, sau đó nhấp chuột phải, chọn 'sử dụng khối từ "của tôi"' từ trình đơn ngữ cảnh
  • nhấp chuột trái vào '???' thứ hai để chọn nó, sau đó nhấp chuột phải, chọn 'sử dụng khối từ "của họ"' từ trình đơn ngữ cảnh
  • Nhấp vào nút lưu (hoặc Tệp-> Lưu)
  • Tùy chọn nhấp vào nút "Đánh dấu là đã giải quyết"
+0

Trước hết, cảm ơn bạn vì công cụ tuyệt vời. Tôi đã theo kịp với bản cập nhật TortoiseSVN, vì vậy tôi biết rằng bạn cần chỉ định 5, thay vì 4-5. –

+0

Trong ví dụ đơn giản này, thật dễ để nói phần "không mong muốn", nhưng Subversion không nên mang bất kỳ thay đổi nào từ r4. Trong thực tế, thật khó để nói phần nào đến từ bản sửa đổi không mong muốn mà tôi không chỉ định. Tôi thường xuyên hợp nhất các thay đổi chi nhánh được viết bởi những người khác. –

+0

Vâng, Subversion đã không thực sự hợp nhất r4. Vấn đề bạn đang thấy ở đây là Subversion gặp phải xung đột và để cho biết xung đột đó không chỉ đánh dấu các đường xung đột mà còn có 1 dòng xung quanh các đường xung đột (tức là các dòng ngữ cảnh). Nếu bạn có một dòng D, dòng đó cũng sẽ là – Stefan