Sáp nhập: Hg / Git so với SVN


144

Tôi thường đọc rằng Hg (và Git và ...) hợp nhất tốt hơn SVN nhưng tôi chưa bao giờ thấy các ví dụ thực tế về việc Hg / Git có thể hợp nhất một cái gì đó khi SVN thất bại (hoặc khi SVN cần can thiệp thủ công). Bạn có thể đăng một vài danh sách từng bước của các hoạt động chi nhánh / sửa đổi / cam kết /...- cho thấy SVN sẽ thất bại trong khi Hg / Git vui vẻ tiếp tục không? Thực tế, không phải trường hợp đặc biệt cao xin vui lòng ...

Một số nền tảng: chúng tôi có vài chục nhà phát triển làm việc trên các dự án sử dụng SVN, với mỗi dự án (hoặc nhóm các dự án tương tự) trong kho lưu trữ của riêng mình. Chúng tôi biết cách áp dụng các nhánh phát hành và tính năng để chúng tôi không gặp phải vấn đề rất thường xuyên (nghĩa là chúng tôi đã ở đó, nhưng chúng tôi đã học cách khắc phục các vấn đề của Joel về "một lập trình viên gây chấn thương cho cả nhóm" hoặc "cần sáu nhà phát triển trong hai tuần để tái hòa nhập một chi nhánh"). Chúng tôi có các nhánh phát hành rất ổn định và chỉ được sử dụng để áp dụng các lỗi. Chúng tôi có các thân cây đủ ổn định để có thể tạo một bản phát hành trong vòng một tuần. Và chúng tôi có các nhánh tính năng mà các nhà phát triển hoặc nhóm nhà phát triển duy nhất có thể làm việc. Có, chúng bị xóa sau khi tái hòa nhập để chúng không làm lộn xộn kho lưu trữ. ;)

Vì vậy, tôi vẫn đang cố gắng tìm ra những lợi thế của Hg / Git so với SVN. Tôi muốn có được trải nghiệm thực tế, nhưng chưa có dự án nào lớn hơn chúng tôi có thể chuyển sang Hg / Git, vì vậy tôi bị mắc kẹt khi chơi với các dự án nhân tạo nhỏ chỉ chứa một vài tệp được tạo. Và tôi đang tìm kiếm một vài trường hợp mà bạn có thể cảm nhận được sức mạnh ấn tượng của Hg / Git, vì cho đến nay tôi vẫn thường đọc về chúng nhưng không thể tự mình tìm thấy chúng.


2
Tôi nghĩ bạn nên chú ý đến các bản sao chính xác: stackoverflow.com/questions/43995/
Thẻ

11
Tôi đã đọc cái đầu tiên, cái còn lại là mới. Nhưng họ đã 1-2 tuổi và dường như chủ yếu là về các vấn đề trước svn-1.5 (trong đó svn chưa có theo dõi hợp nhất).
stmax

2
Chỉ cần một nhận xét rằng bạn cũng có thể gộp Bazaar với git / hg như một DVCS khác sẽ xử lý các vấn đề dưới đây một cách chính xác. Và vì bạn đã đề cập đến việc cố gắng tìm lợi thế: một lợi thế hậu cần đơn giản của git / hg / bzr là các chi nhánh không mang tính toàn cầu như với svn. Bạn không cần phải xem 67 chi nhánh, khi chỉ có một vài áp dụng cho bạn. Mọi người đều làm việc trong các nhánh "riêng tư" và sau đó sử dụng khả năng hợp nhất tuyệt vời để hợp nhất trở lại mà không đổ mồ hôi cho dù việc hợp nhất sẽ hoạt động trong 99% trường hợp.
wadesworld

5
@wade: bạn có thấy các chi nhánh "tư nhân" là lợi thế trong môi trường công ty không? Tôi lo lắng về sao lưu. tôi thường có các nhánh đặc trưng sống trong 1-2 tháng trước khi tái hòa nhập ..
stmax

9
@stmax: Một mối quan tâm hợp lệ. Tuy nhiên, những gì bạn tìm thấy trong nhiều môi trường doanh nghiệp với sự lật đổ là mọi người không thể kiểm tra cho đến khi mã của họ hoàn hảo và bạn có cùng mức độ hiển thị ở đó.
wadesworld

Câu trả lời:


91

Bản thân tôi không sử dụng Subversion, nhưng từ ghi chú phát hành cho Subversion 1.5: Hợp nhất theo dõi (nền tảng) có vẻ như có những khác biệt sau đây về cách hoạt động của theo dõi hợp nhất trong các hệ thống kiểm soát phiên bản DAG đầy đủ như Git hoặc Mercurial.

  • Hợp nhất thân cây với nhánh khác với việc hợp nhất nhánh với thân cây: vì một số lý do, việc hợp nhất thân cây với nhánh đòi hỏi phải có --reintegratetùy chọn svn merge.

    Trong các hệ thống kiểm soát phiên bản phân tán như Git hoặc Mercurial, không có sự khác biệt về kỹ thuật giữa thân cây và nhánh: tất cả các nhánh được tạo ra bằng nhau ( mặc dù có thể có sự khác biệt xã hội ). Sáp nhập theo một trong hai hướng được thực hiện theo cùng một cách.

  • Bạn cần cung cấp mới -g--use-merge-history tùy chọn ( ) cho svn logsvn blame đưa tính năng theo dõi hợp nhất vào tài khoản.

    Theo dõi hợp nhất Git và Mercurial sẽ tự động được tính đến khi hiển thị lịch sử (nhật ký) và đổ lỗi. Trong Git, bạn có thể yêu cầu chỉ theo dõi phụ huynh đầu tiên với--first-parent (tôi đoán tùy chọn tương tự cũng tồn tại đối với Mercurial) để "loại bỏ" thông tin theo dõi hợp nhất trong git log.

  • Từ những gì tôi hiểu svn:mergeinfo tính lưu trữ thông tin trên mỗi đường dẫn về xung đột (Subversion là dựa trên thay đổi), trong khi trong Git và Mercurial, nó chỉ đơn giản là cam kết các đối tượng có thể có nhiều hơn một cha mẹ.

  • "Các vấn đề đã biết"Tiểu mục để theo dõi hợp nhất trong Subversion cho thấy rằng hợp nhất lặp lại / tuần hoàn / phản chiếu có thể không hoạt động đúng. Điều đó có nghĩa là với lịch sử sau đây, phép hợp nhất thứ hai có thể không thực hiện đúng ('A' có thể là thân cây hoặc nhánh và 'B' có thể là nhánh hoặc thân cây, tương ứng):

    * --- * --- x --- * --- y --- * --- * --- * --- M2 <- A
             \ \ /
              - * ---- M1 --- * --- * --- / <- B
    

    Trong trường hợp nghệ thuật ASCII ở trên bị hỏng: Nhánh 'B' được tạo (rẽ nhánh) từ nhánh 'A' khi sửa đổi 'x', sau đó nhánh 'A' được sáp nhập khi sửa đổi 'y' thành nhánh 'B' như hợp nhất 'M1' và cuối cùng là nhánh 'B' được hợp nhất thành nhánh 'A' dưới dạng hợp nhất 'M2'.

    * --- * --- x --- * ----- M1 - * --- * --- M2 <- A
             \ / / 
              \ - * --- y --- * --- * --- / <- B
    

    Trong trường hợp nghệ thuật ASCII ở trên bị hỏng: Nhánh 'B' được tạo (rẽ nhánh) từ nhánh 'A' khi sửa đổi 'x', nó được sáp nhập vào nhánh 'A' tại 'y' là 'M1', và sau đó sáp nhập lại vào nhánh 'A' là 'M2'.

  • Subversion có thể không hỗ trợ trường hợp tiên tiến của hợp nhất chéo chéo .

    * --- b ----- B1 - M1 - * --- M3
         \ \ / /
          \ X /
           \ / \ /
            \ - B2 - M2 - *
    

    Git xử lý tình huống này tốt trong thực tế bằng cách sử dụng chiến lược hợp nhất "đệ quy". Tôi không chắc chắn về Mercurial.

  • Trong "Các vấn đề đã biết" có cảnh báo rằng hợp nhất theo dõi migh không hoạt động với đổi tên tệp, ví dụ: khi một bên đổi tên tệp (và có thể sửa đổi tệp) và bên thứ hai sửa đổi tệp mà không đổi tên (dưới tên cũ).

    Cả Git và Mercurial đều xử lý trường hợp như vậy trong thực tế: Git sử dụng phát hiện đổi tên , Mercurial sử dụng theo dõi đổi tên .

HTH


bằng cách nào đó (lỗi trong trình phân tích cú pháp Markdown?) phần sau <pre>...</pre>khối không được thụt lề như nó phải ...
Jakub Narębski

1
+1 cho nhiều ví dụ chi tiết. Tôi vẫn chưa hiểu tại sao ví dụ trong nghệ thuật ascii đầu tiên có thể gây ra vấn đề. có vẻ như cách tiêu chuẩn để xử lý các nhánh tính năng: giả sử A là thân cây, B là một nhánh tính năng. bạn hợp nhất hàng tuần từ A đến B và khi bạn hoàn thành tính năng, bạn hợp nhất mọi thứ từ B đến A và sau đó xóa B. luôn hoạt động với tôi. tôi đã hiểu nhầm sơ đồ?
stmax

1
Lưu ý rằng tôi không biết (tôi chưa kiểm tra) rằng các ví dụ nêu trên thực sự gây ra vấn đề trong Subversion . Đổi tên và hợp nhất chéo là vấn đề thực sự trong SVN, tôi nghĩ vậy.
Jakub Narębski

2
sáp nhập tái hòa nhập là một tùy chọn đặc biệt để giúp bạn trong trường hợp phổ biến nhất khi hợp nhất - không có sự khác biệt kỹ thuật giữa các nhánh và thân cây trong svn. Tôi có xu hướng không bao giờ sử dụng nó, và gắn bó với tùy chọn hợp nhất tiêu chuẩn. Tuy nhiên, vấn đề duy nhất với svn merge là nó xử lý một động thái / đổi tên dưới dạng xóa + bổ sung.
gbjbaanb

--reintegratebị phản đối
nè 101

120

Tôi cũng đã tìm kiếm một trường hợp, giả sử, Subversion không hợp nhất một nhánh và Mercurial (và Git, Bazaar, ...) làm điều đúng đắn.

Sách SVN mô tả cách các tệp được đổi tên được hợp nhất không chính xác . Điều này áp dụng cho Subversion 1.5 , 1.6 , 1.71.8 ! Tôi đã cố gắng tạo lại tình huống dưới đây:

cd / tmp
rm - rf svn - repo svn - thanh toán
svnadmin tạo svn - repo
tệp thanh toán svn : /// tmp / svn - repo svn - thanh toán
cd svn - thanh toán
chi nhánh thân cây mkdir
tiếng vang 'Tạm biệt, thế giới!' > thân cây / xin chào . txt 
svn thêm chi nhánh
svn cam kết - m 'Nhập ban đầu.' 
svn sao chép '^ / trunk' '^ / cành / đổi tên' - m 'Tạo chi nhánh.' 
chuyển đổi svn '^ / thân cây' . 
tiếng vang 'Xin chào, thế giới!' > xin chào . txt    
svn cam kết - m 'Cập nhật trên thân cây.' 
chuyển đổi svn '^ / chi nhánh / đổi tên' . 
svn đổi tên xin chào . xin chào . en . txt 
svn cam kết - m 'Đổi tên trên chi nhánh.' 
chuyển đổi svn '^ / thân cây' . 
hợp nhất svn - tái hòa nhập '^ / cành / đổi tên' 

Theo cuốn sách, việc hợp nhất sẽ kết thúc một cách sạch sẽ, nhưng với dữ liệu sai trong tệp được đổi tên kể từ khi cập nhật trunkbị lãng quên. Thay vào đó, tôi nhận được một xung đột cây (đây là với Subversion 1.6.17, phiên bản mới nhất trong Debian tại thời điểm viết):

--- Hợp nhất các khác biệt giữa các URL kho lưu trữ thành '.':
Xin chào.en.txt
   C hello.txt
Tóm tắt các xung đột:
  Cây xung đột: 1

Không nên có bất kỳ xung đột nào cả - bản cập nhật nên được hợp nhất thành tên mới của tệp. Trong khi Subversion thất bại, Mercurial xử lý chính xác điều này:

rm -rf /tmp/hg-repo
hg init /tmp/hg-repo
cd /tmp/hg-repo
echo 'Goodbye, World!' > hello.txt
hg add hello.txt
hg commit -m 'Initial import.'
echo 'Hello, World!' > hello.txt
hg commit -m 'Update.'
hg update 0
hg rename hello.txt hello.en.txt
hg commit -m 'Rename.'
hg merge

Trước khi hợp nhất, kho lưu trữ trông như thế này (từ hg glog):

@ thay đổi: 2: 6502899164cc
| thẻ: tiền boa
| cha mẹ: 0: d08bcebadd9e
| người dùng: Martin Geisler
| ngày: Thu ngày 01 tháng 4 12:29:19 2010 +0200
| tóm tắt: Đổi tên.
|
| o thay đổi: 1: 9d06fa155634
| / người dùng: Martin Geisler 
| ngày: Thu ngày 01 tháng 4 12:29:18 2010 +0200
| tóm tắt: Cập nhật.
|
o thay đổi: 0: d08bcebadd9e
   người dùng: Martin Geisler 
   ngày: Thu ngày 01 tháng 4 12:29:18 2010 +0200
   tóm tắt: Nhập khẩu ban đầu.

Đầu ra của hợp nhất là:

hợp nhất hello.en.txt và hello.txt thành hello.en.txt
0 tệp được cập nhật, 1 tệp được hợp nhất, 0 tệp bị xóa, 0 tệp chưa được giải quyết
(hợp nhất chi nhánh, đừng quên cam kết)

Nói cách khác: Mercurial lấy thay đổi từ phiên bản 1 và sáp nhập nó vào tên tệp mới từ phiên bản 2 ( hello.en.txt). Xử lý trường hợp này tất nhiên là cần thiết để hỗ trợ tái cấu trúc và tái cấu trúc chính xác là loại việc bạn sẽ muốn làm trên một nhánh.


+1 cho ví dụ chi tiết người ta có thể chạm vào bàn phím và tự mình xem điều gì sẽ xảy ra. Là một người mới của Mercurial, tôi tự hỏi liệu phiên bản hg của ví dụ này có tuân theo một cách rõ ràng, từng dòng một không?
DarenW

4
@DarenW: Tôi đã thêm các lệnh Mercurial tương ứng, tôi hy vọng nó làm cho mọi thứ rõ ràng hơn!
Martin Geisler

17

Không nói về những lợi thế thông thường (cam kết ngoại tuyến, quy trình xuất bản , ...) ở đây là một ví dụ "hợp nhất" tôi thích:

Kịch bản chính tôi tiếp tục thấy là một nhánh trong đó ... hai nhiệm vụ không liên quan thực sự được phát triển
(nó bắt đầu từ một tính năng, nhưng nó dẫn đến sự phát triển của tính năng khác này.
Hoặc nó bắt đầu từ một bản vá, nhưng nó dẫn đến phát triển tính năng khác).

Làm thế nào để bạn hợp nhất chỉ một trong hai tính năng trên nhánh chính?
Hoặc Làm thế nào để bạn cô lập hai tính năng trong các nhánh riêng của họ?

Bạn có thể thử tạo ra một số loại bản vá, vấn đề với điều đó là bạn không chắc chắn nữa về các phụ thuộc chức năng có thể tồn tại giữa:

  • các cam kết (hoặc sửa đổi cho SVN) được sử dụng trong các bản vá của bạn
  • các cam kết khác không phải là một phần của bản vá

Git (và Mercurial cũng vậy, tôi cho rằng) đề xuất tùy chọn rebase --onto để rebase (đặt lại gốc của nhánh) một phần của nhánh:

Từ bài viết của Jefromi

- x - x - x (v2) - x - x - x (v2.1)
           \
            x - x - x (v2-only) - x - x - x (wss)

bạn có thể gỡ rối tình huống này khi bạn có các bản vá cho v2 cũng như một tính năng wss mới vào:

- x - x - x (v2) - x - x - x (v2.1)
          |\
          |  x - x - x (v2-only)
           \
             x - x - x (wss)

, cho phép bạn:

  • kiểm tra từng nhánh riêng rẽ để kiểm tra xem mọi thứ biên dịch / làm việc như dự định
  • chỉ hợp nhất những gì bạn muốn chính.

Tính năng khác mà tôi thích (có ảnh hưởng đến việc hợp nhất) là khả năng squash cam kết (trong một nhánh chưa được đẩy sang repo khác) để trình bày:

  • một lịch sử sạch hơn
  • các cam kết mạch lạc hơn (thay vì commit1 cho function1, commit2 cho function2, commit3 một lần nữa cho function1 ...)

Điều đó đảm bảo việc hợp nhất dễ dàng hơn rất nhiều, với ít xung đột hơn.


svn không có cam kết ngoại tuyến? rofl? Làm thế nào bất cứ ai thậm chí có thể xem xét sử dụng nó nếu nó là như vậy?
o0 '.

@Lohoris Khi SVN ra đời, không có DVCS nguồn mở được sử dụng rộng rãi; tại thời điểm này, tôi nghĩ rằng chủ yếu là quán tính mà mọi người vẫn sử dụng nó.
Max Nanasy

@MaxNanasy một loại quán tính rất tệ ... vẫn vậy, chọn nó bây giờ sẽ đơn giản là ngu ngốc.
o0 '.

@Lohoris Trực tuyến (chính xác hơn, tập trung) cam kết không phải là một vấn đề lớn trong một nhóm nhỏ nơi kho lưu trữ có thể chỉ đơn giản là trên một máy chủ cục bộ được chia sẻ. Các DVCS chủ yếu được phát minh cho các nhóm lớn, phân phối theo địa lý (cả git và mercurial nhằm quản lý mã hạt nhân Linux) và các dự án nguồn mở (do đó là sự phổ biến của GitHub). Quán tính cũng có thể được coi là một đánh giá về rủi ro và lợi ích của việc thay đổi trung tâm công cụ thành quy trình làm việc của nhóm.
IMSoP

1
@Lohoris Tôi nghĩ rằng bạn đã hiểu sai quan điểm của tôi về DB, tường lửa, v.v .: có rất ít điểm tôi có thể cam kết trên máy chủ của mình nếu tôi thực sự không thể chạy mã đó trước. Tôi có thể làm việc mù quáng, nhưng thực tế là tôi không thể cam kết mọi thứ ở đâu đó sẽ không phải là điều chính khiến tôi bỏ cuộc.
IMSoP

8

Gần đây chúng tôi đã di chuyển từ SVN sang GIT và gặp phải sự không chắc chắn này. Có rất nhiều bằng chứng giai thoại cho thấy GIT tốt hơn, nhưng thật khó để bắt gặp bất kỳ ví dụ nào.

Mặc dù vậy, tôi có thể nói với bạn rằng GIT là RẤT NHIỀU khi sáp nhập hơn SVN. Đây rõ ràng là giai thoại, nhưng có một bảng để theo dõi.

Đây là một số trong những điều chúng tôi tìm thấy:

  • SVN đã từng ném rất nhiều xung đột cây trong những tình huống có vẻ như không nên. Chúng tôi chưa bao giờ đi đến tận cùng của điều này nhưng nó không xảy ra trong GIT.
  • Trong khi tốt hơn, GIT phức tạp hơn đáng kể. Dành thời gian cho đào tạo.
  • Chúng tôi đã quen với Rùa SVN, mà chúng tôi thích. Rùa GIT không tốt bằng và điều này có thể khiến bạn thất vọng. Tuy nhiên, bây giờ tôi sử dụng dòng lệnh GIT mà tôi rất thích Rùa SVN hoặc bất kỳ GUI nào của GIT.

Khi chúng tôi đánh giá GIT, chúng tôi đã chạy các thử nghiệm sau. Những người này cho thấy GIT là người chiến thắng khi hợp nhất, nhưng không nhiều. Trong thực tế, sự khác biệt lớn hơn nhiều, nhưng tôi đoán chúng ta đã không thể tái tạo được các tình huống mà SVN xử lý tồi.

Đánh giá hợp nhất GIT vs SVN


5

Những người khác đã bao gồm các khía cạnh lý thuyết hơn về điều này. Có lẽ tôi có thể cho vay một quan điểm thực tế hơn.

Tôi hiện đang làm việc cho một công ty sử dụng SVN trong mô hình phát triển "nhánh tính năng". Đó là:

  • Không có công việc có thể được thực hiện trên thân cây
  • Mỗi nhà phát triển có thể tạo chi nhánh riêng của họ
  • Các chi nhánh nên kéo dài trong suốt thời gian thực hiện nhiệm vụ
  • Mỗi nhiệm vụ nên có chi nhánh riêng của nó
  • Sáp nhập trở lại thân cây cần phải được ủy quyền (thông thường thông qua bugzilla)
  • Tại thời điểm cần mức độ kiểm soát cao, việc sáp nhập có thể được thực hiện bởi người gác cổng

Nói chung, nó hoạt động. SVN có thể được sử dụng cho một luồng như thế này, nhưng nó không hoàn hảo. Có một số khía cạnh của SVN cản trở và hình thành hành vi của con người. Điều đó mang lại cho nó một số khía cạnh tiêu cực.

  • Chúng tôi đã có khá nhiều vấn đề với những người phân nhánh từ các điểm thấp hơn ^/trunk. Những lứa này hợp nhất các bản ghi thông tin trên toàn cây, và cuối cùng phá vỡ theo dõi hợp nhất. Xung đột sai lầm bắt đầu xuất hiện, và sự nhầm lẫn ngự trị.
  • Chọn các thay đổi từ thân cây vào một nhánh tương đối thẳng về phía trước. svn mergelàm những gì bạn muốn. Hợp nhất các thay đổi của bạn lại yêu cầu (chúng tôi đã nói) --reintegratevề lệnh hợp nhất. Tôi chưa bao giờ thực sự hiểu công tắc này, nhưng điều đó có nghĩa là chi nhánh không thể được sáp nhập vào thân cây một lần nữa. Điều này có nghĩa là nó là một nhánh chết và bạn phải tạo một nhánh mới để tiếp tục làm việc. (Xem chú thích)
  • Toàn bộ hoạt động thực hiện các hoạt động trên máy chủ thông qua URL khi tạo và xóa các chi nhánh thực sự gây nhầm lẫn và khiến mọi người sợ hãi. Vì vậy, họ tránh nó.
  • Chuyển đổi giữa các nhánh rất dễ bị sai, khiến một phần của cây nhìn vào nhánh A, trong khi để một phần khác nhìn vào nhánh B. Vì vậy mọi người thích làm tất cả công việc của họ trong một nhánh.

Điều có xu hướng xảy ra là một kỹ sư tạo ra một chi nhánh vào ngày 1. Anh ta bắt đầu công việc của mình và quên nó đi. Một thời gian sau, một ông chủ đi cùng và hỏi liệu anh ta có thể giải phóng công việc của mình vào thân cây không. Các kỹ sư đã sợ hãi ngày hôm nay bởi vì tái hòa nhập có nghĩa là:

  • Hợp nhất nhánh sống lâu của anh ta trở lại vào thân cây và giải quyết tất cả các xung đột, và phát hành mã không liên quan đáng lẽ phải ở trong một nhánh riêng, nhưng không phải.
  • Xóa chi nhánh của mình
  • Tạo một chi nhánh mới
  • Chuyển bản sao làm việc của mình sang chi nhánh mới

... Và bởi vì kỹ sư làm điều này ít nhất có thể, họ không thể nhớ "câu thần chú" để thực hiện từng bước. Chuyển đổi và URL sai xảy ra, và đột nhiên họ gặp rắc rối và họ đi tìm "chuyên gia".

Cuối cùng tất cả đã lắng xuống, và mọi người học cách đối phó với những thiếu sót, nhưng mỗi người mới bắt đầu đều trải qua những vấn đề tương tự. Thực tế cuối cùng (trái ngược với những gì tôi đặt ra khi anh ấy bắt đầu) là:

  • Không có công việc được thực hiện trên thân cây
  • Mỗi nhà phát triển có một chi nhánh chính
  • Chi nhánh kéo dài cho đến khi công việc cần được phát hành
  • Sửa lỗi đánh dấu có xu hướng để có được chi nhánh riêng của họ
  • Sáp nhập trở lại thân cây được thực hiện khi được ủy quyền

...nhưng...

  • Đôi khi công việc khiến nó bị trục trặc khi không nên vì nó ở cùng nhánh với thứ khác.
  • Mọi người tránh tất cả sự hợp nhất (ngay cả những thứ dễ dàng), vì vậy mọi người thường làm việc trong bong bóng nhỏ của riêng họ
  • Sự hợp nhất lớn có xu hướng xảy ra, và gây ra một số lượng hỗn loạn hạn chế.

Rất may, nhóm đủ nhỏ để đối phó, nhưng nó sẽ không mở rộng. Điều quan trọng là, không có vấn đề nào trong số này là vấn đề với CVCS, nhưng hơn thế nữa bởi vì việc hợp nhất không quan trọng như trong DVCS, chúng không quá trơn tru. "Ma sát hợp nhất" đó gây ra hành vi có nghĩa là mô hình "Nhánh tính năng" bắt đầu bị hỏng. Sự hợp nhất tốt cần phải là một tính năng của tất cả các VCS, không chỉ DVCS.


Theo này bây giờ có một --record-onlycông tắc có thể được sử dụng để giải quyết --reintegratevấn đề, và rõ ràng v1.8 sẽ chọn khi làm một tái tích tự động, và nó không gây ra các chi nhánh là đã chết sau đó


Theo tôi hiểu, tùy chọn --reintegrate cho svn biết rằng bạn đã giải quyết các thay đổi xung đột khi hợp nhất vào nhánh tính năng. Thực tế, thay vì coi nó như một bản vá, nó ghi đè lên toàn bộ các tệp bằng phiên bản nhánh, đã kiểm tra trong lịch sử hợp nhất rằng tất cả các sửa đổi trung kế đã được sáp nhập vào nhánh.
IMSoP

@IMSoP: có thể, điều đó có ý nghĩa. Điều đó không giải thích cho tôi tại sao nó lại cần thiết hoặc tại sao nó lại không thể hợp nhất từ ​​chi nhánh đó. Không giúp được rằng tùy chọn này phần lớn không có giấy tờ.
Paul S

Tôi chỉ từng sử dụng nó qua TortoiseSVN, nơi nó luôn được giải thích nổi bật trong giao diện người dùng hợp nhất. Tôi tin rằng SVN 1.8 tự động chọn chiến lược phù hợp và không cần một tùy chọn riêng biệt, nhưng tôi không biết liệu họ đã sửa thuật toán hợp nhất thông thường để xử lý chính xác một nhánh đã được đặt lại theo cách này chưa.
IMSoP

3

Trước khi lật đổ 1.5 (nếu tôi không nhầm), lật đổ có một bất lợi đáng kể ở chỗ nó sẽ không nhớ lịch sử hợp nhất.

Hãy xem xét trường hợp được phác thảo bởi VonC:

- x - x - x (v2) - x - x - x (v2.1)
          |\
          |  x - A - x (v2-only)
           \
             x - B - x (wss)

Lưu ý sửa đổi A và B. Giả sử bạn đã hợp nhất các thay đổi từ sửa đổi A trên nhánh "wss" sang nhánh "chỉ v2" tại phiên bản B (vì bất kỳ lý do gì), nhưng vẫn tiếp tục sử dụng cả hai nhánh. Nếu bạn đã cố gắng hợp nhất hai nhánh một lần nữa bằng cách sử dụng đồng bóng, nó sẽ chỉ hợp nhất các thay đổi sau khi sửa đổi A và B. Với lật đổ, bạn phải hợp nhất mọi thứ, như thể bạn không thực hiện hợp nhất trước đó.

Đây là một ví dụ từ kinh nghiệm của riêng tôi, trong đó việc hợp nhất từ ​​B đến A mất vài giờ do khối lượng mã: đó sẽ là một nỗi đau thực sự phải trải qua một lần nữa , đó là trường hợp lật đổ trước 1.5.

Một sự khác biệt khác, có lẽ phù hợp hơn trong hành vi hợp nhất từ Hginit: Subversion Re-giáo dục :

Hãy tưởng tượng rằng bạn và tôi đang làm việc với một số mã, và chúng tôi phân nhánh mã đó và mỗi chúng tôi đi vào các không gian làm việc riêng biệt của chúng tôi và thực hiện nhiều thay đổi cho mã đó một cách riêng biệt, vì vậy chúng đã chuyển hướng khá nhiều.

Khi chúng tôi phải hợp nhất, Subversion cố gắng xem xét cả hai bản sửa đổi, mã sửa đổi của tôi và mã sửa đổi của bạn và nó cố gắng đoán làm thế nào để đập chúng lại với nhau trong một mớ hỗn độn lớn. Nó thường thất bại, tạo ra các trang và trang của xung đột hợp nhất giữa các cuộc xung đột, không thực sự xung đột, chỉ đơn giản là những nơi mà Subversion không thể tìm ra những gì chúng ta đã làm.

Ngược lại, trong khi chúng tôi làm việc riêng ở Mercurial, Mercurial bận rộn giữ một loạt các thay đổi. Và vì vậy, khi chúng tôi muốn hợp nhất mã của mình lại với nhau, Mercurial thực sự có nhiều thông tin hơn: nó biết mỗi chúng ta đã thay đổi gì và có thể áp dụng lại những thay đổi đó, thay vì chỉ nhìn vào sản phẩm cuối cùng và cố gắng đoán cách đặt nó cùng với nhau.

Nói tóm lại, cách phân tích sự khác biệt của Mercurial là (đã?) Vượt trội hơn so với lật đổ.


5
tôi đã đọc hginit. quá tệ, nó không hiển thị nhiều ví dụ thực tế về việc hg đang làm tốt hơn svn .. về cơ bản, nó cho bạn biết "tin tưởng tham gia" rằng hg chỉ tốt hơn. những ví dụ đơn giản mà anh ấy thể hiện có lẽ cũng có thể được thực hiện với svn .. thực sự đó là lý do tại sao tôi đã mở câu hỏi này.
stmax

1
Dựa trên cách nói này, câu hỏi ngây thơ xuất hiện trong đầu: nếu thuật toán hợp nhất của Mercurial được đưa vào Subversion thì sao? Svn sau đó có tốt như hg không? Không, bởi vì lợi thế của hg là ở tổ chức cấp cao hơn, chứ không phải toán học văn bản cấp thấp của các dòng hợp nhất từ ​​các tệp. Đó là ý tưởng mới lạ mà người dùng svn cần phải mò mẫm.
DarenW

@stmax: Tôi có thể hiểu ý của bạn. Tuy nhiên, ý kiến ​​của Joel hoặc bất kỳ ai khác không thực sự quan trọng: một công nghệ tốt hơn công nghệ kia (đối với các trường hợp sử dụng) hoặc không. @DarenW và @stmax: từ kinh nghiệm cá nhân của riêng tôi, Hg chiến thắng nhờ hoạt động phân tán (tôi không kết nối mọi lúc), hiệu suất (rất nhiều hoạt động cục bộ), phân nhánh cực kỳ trực quan được hỗ trợ bởi thuật toán hợp nhất vượt trội, hg rollback, đầu ra nhật ký templated, hg glog, thư mục .hg duy nhất ... Tôi có thể tiếp tục, và tiếp tục ... bất cứ điều gì khác ngoài git và bazaar cảm thấy giống như một chiếc áo khoác.
Tomislav Nakic-Alfirevic

Nhận xét hg trích dẫn về "thay đổi" có vẻ không chính xác đối với tôi. SVN biết rất rõ những thay đổi mà nó đang hợp nhất (một thay đổi về cơ bản là sự khác biệt giữa hai ảnh chụp nhanh và ngược lại, phải không?), Và có thể lần lượt áp dụng từng thay đổi nếu muốn; chắc chắn không phải "đoán" bất cứ điều gì. Nếu nó làm cho "một mớ hỗn độn lớn" thì đó là một vấn đề triển khai, không phải bất cứ điều gì cơ bản cho thiết kế. Vấn đề chính khó giải quyết trên thiết kế kiến ​​trúc hiện tại là di chuyển / sao chép / đổi tên tệp.
IMSoP
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.