Các chi nhánh của Nhật Bản, các thẻ của Tử và các thân cây có nghĩa là gì trong kho Subversion?


1193

Tôi đã thấy những từ này rất nhiều xung quanh các cuộc thảo luận về Subversion (và tôi đoán là kho lưu trữ chung).
Tôi đã sử dụng SVN cho các dự án của tôi trong vài năm qua, nhưng tôi chưa bao giờ nắm bắt được khái niệm hoàn chỉnh của các thư mục này.

Có ý nghĩa gì?


29
Đây là một bài viết hay mà tôi đã xem qua cách giải thích cách thức / thời điểm sử dụng thân cây, nhánh và thẻ. Tôi chưa từng sử dụng kiểm soát nguồn trước đây, nhưng bài viết này đã giúp cho một người mới như tôi hiểu được khá dễ dàng. Ngày qua ngày với Subversion
badmoon

Câu trả lời:


910

Hmm, không chắc chắn tôi đồng ý với thẻ Nick re giống với chi nhánh. Thẻ chỉ là một điểm đánh dấu

  • Trunk sẽ là cơ quan chính của sự phát triển, bắt nguồn từ khi bắt đầu dự án cho đến hiện tại.

  • Nhánh sẽ là một bản sao của mã xuất phát từ một điểm nhất định trong thân cây được sử dụng để áp dụng các thay đổi lớn cho mã trong khi vẫn giữ được tính toàn vẹn của mã trong thân cây. Nếu những thay đổi lớn hoạt động theo kế hoạch, chúng thường được hợp nhất trở lại vào thân cây.

  • Thẻ sẽ là một điểm trong thời gian trên thân cây hoặc một nhánh mà bạn muốn bảo tồn. Hai lý do chính để bảo quản là vì đây là bản phát hành chính của phần mềm, cho dù là alpha, beta, RC hay RTM, hay đây là điểm ổn định nhất của phần mềm trước khi áp dụng các sửa đổi lớn trên thân cây.

Trong các dự án nguồn mở, các chi nhánh lớn không được các bên liên quan của dự án chấp nhận có thể trở thành cơ sở cho các nhánh - ví dụ, các dự án hoàn toàn riêng biệt có chung nguồn gốc với mã nguồn khác.

Các nhánh cây và thẻ được phân biệt với thân cây theo các cách sau:

Subversion cho phép các sysadins tạo các tập lệnh hook được kích hoạt để thực thi khi một số sự kiện nhất định xảy ra; ví dụ, cam kết thay đổi kho lưu trữ. Việc triển khai kho lưu trữ Subversion điển hình là rất phổ biến để xử lý bất kỳ đường dẫn nào chứa "/ tag /" được bảo vệ chống ghi sau khi tạo; kết quả cuối cùng là các thẻ, một khi được tạo ra, là bất biến (ít nhất là đối với người dùng "thông thường"). Điều này được thực hiện thông qua các tập lệnh hook, thực thi tính bất biến bằng cách ngăn các thay đổi tiếp theo nếu thẻ là nút cha của đối tượng đã thay đổi.

Subversion cũng đã thêm các tính năng, kể từ phiên bản 1.5, liên quan đến "theo dõi hợp nhất chi nhánh" để các thay đổi được cam kết cho một chi nhánh có thể được hợp nhất trở lại vào trung kế với sự hỗ trợ cho việc hợp nhất "thông minh".


284
Sự nhầm lẫn với các thẻ và các nhánh là trong svn thực sự không có sự phân biệt giữa chúng, ngoài tên của thư mục. Trong svn, bạn có thể cam kết thay đổi thẻ và thực tế rất khó để ngăn chặn điều này. Hầu hết các VCS khác coi các thẻ là ảnh chụp nhanh bất biến (điểm theo thời gian).
Ken Liu

4
Tagsthư mục cũng thường được sử dụng để kiểm tra và xác minh các mốc quan trọng của người dùng thông thường. Đây sẽ là một nơi tốt để đặt một nguyên mẫu (chỉ một số ý tưởng trên đầu của tôi).
Jeff Noel

6
@KenLiu Có những cái móc có thể làm cho thẻ không thay đổi. Đó là, bạn có thể tạo và kiểm tra thẻ, nhưng không thực hiện bất kỳ thay đổi nào. Tất nhiên, một thẻ chỉ là một phần của kho lưu trữ có nghĩa là toàn bộ lịch sử có sẵn. Nếu ai đó thay đổi một thẻ, bạn có thể theo dõi đó và tại sao. Trong nhiều VCS, nếu bạn sửa đổi thẻ, có thể không có cách nào để biết.
David W.

3
Có lẽ các nhánh ổn định nên được đề cập: những thay đổi được thực hiện thông thường không được hợp nhất trở lại vào thân cây .
Sói

4
Hiểu biết của tôi là trong một "thế giới hoàn hảo" không có sự phát triển nào xảy ra trong thân cây, thân cây phải luôn là mã chính xác đang tồn tại hoặc mã sắp được phát hành trực tiếp. như vậy sẽ làm cho các nhánh trở thành cơ quan chính của sự phát triển.
MikeT

556

Trước hết, như @AndrewFinnell và @KenLiu chỉ ra, trong SVN, tên thư mục không có nghĩa gì - "thân cây, nhánh và thẻ" chỉ đơn giản là một quy ước phổ biến được sử dụng bởi hầu hết các kho lưu trữ. Không phải tất cả các dự án đều sử dụng tất cả các thư mục (khá hợp lý khi không sử dụng "thẻ"), và trên thực tế, không có gì ngăn cản bạn gọi chúng bất cứ điều gì bạn muốn, mặc dù việc phá vỡ quy ước thường gây nhầm lẫn.

Tôi sẽ mô tả kịch bản sử dụng phổ biến nhất của các nhánh và thẻ và đưa ra một kịch bản ví dụ về cách chúng được sử dụng.

  • Trunk : Khu vực phát triển chính. Đây là nơi phát hành mã tiếp theo chính của bạn và thường có tất cả các tính năng mới nhất.

  • Chi nhánh : Mỗi khi bạn phát hành một phiên bản chính, nó sẽ tạo ra một chi nhánh. Điều này cho phép bạn thực hiện sửa lỗi và tạo một bản phát hành mới mà không phải phát hành các tính năng mới nhất - có thể chưa hoàn thành hoặc chưa được kiểm tra -.

  • Thẻ : Mỗi khi bạn phát hành một phiên bản (bản phát hành cuối cùng, phát hành ứng cử viên (RC) và betas), bạn tạo một thẻ cho phiên bản đó. Điều này cung cấp cho bạn một bản sao mã theo thời gian như ở trạng thái đó, cho phép bạn quay lại và tái tạo bất kỳ lỗi nào nếu cần trong phiên bản trước hoặc phát hành lại phiên bản quá khứ chính xác như cũ. Các nhánh và thẻ trong SVN rất nhẹ - trên máy chủ, nó không tạo một bản sao đầy đủ của các tệp, chỉ là một điểm đánh dấu "các tệp này đã được sao chép tại phiên bản này" chỉ chiếm một vài byte. Với suy nghĩ này, bạn không bao giờ nên quan tâm đến việc tạo thẻ cho bất kỳ mã được phát hành nào. Như tôi đã nói trước đó, các thẻ thường bị bỏ qua và thay vào đó, một thay đổi hoặc tài liệu khác làm rõ số sửa đổi khi phát hành được thực hiện.


Ví dụ: giả sử bạn bắt đầu một dự án mới. Bạn bắt đầu làm việc trong "thân cây", về những gì cuối cùng sẽ được phát hành dưới dạng phiên bản 1.0.

  • trunk / - phiên bản phát triển, sắp có 1.0
  • cành / - trống

Khi 1.0.0 kết thúc, bạn rẽ nhánh vào nhánh "1.0" mới và tạo thẻ "1.0.0". Bây giờ làm việc trên những gì cuối cùng sẽ là 1.1 tiếp tục trong thân cây.

  • trunk / - phiên bản phát triển, sắp có 1.1
  • chi nhánh / phiên bản 1.0 - 1.0.0
  • tags / 1.0.0 - Phiên bản phát hành 1.0.0

Bạn gặp một số lỗi trong mã và sửa chúng trong thân cây, sau đó hợp nhất các bản sửa lỗi với nhánh 1.0. Bạn cũng có thể làm ngược lại và sửa các lỗi trong nhánh 1.0 và sau đó hợp nhất chúng trở lại trung kế, nhưng thông thường các dự án chỉ gắn với việc hợp nhất một chiều để giảm nguy cơ bỏ lỡ điều gì đó. Đôi khi một lỗi chỉ có thể được sửa trong 1.0 vì nó đã lỗi thời trong 1.1. Điều đó không thực sự quan trọng: bạn chỉ muốn đảm bảo rằng bạn không phát hành 1.1 với cùng một lỗi đã được sửa trong 1.0.

  • trunk / - phiên bản phát triển, sắp có 1.1
  • chi nhánh / 1.0 - phát hành 1.0.1 sắp tới
  • tags / 1.0.0 - Phiên bản phát hành 1.0.0

Khi bạn tìm thấy đủ lỗi (hoặc có thể là một lỗi nghiêm trọng), bạn quyết định thực hiện bản phát hành 1.0.1. Vì vậy, bạn tạo một thẻ "1.0.1" từ nhánh 1.0 và giải phóng mã. Tại thời điểm này, thân cây sẽ chứa những gì sẽ là 1.1 và nhánh "1.0" chứa mã 1.0.1. Lần tiếp theo bạn phát hành bản cập nhật lên 1.0, nó sẽ là 1.0.2.

  • trunk / - phiên bản phát triển, sắp có 1.1
  • chi nhánh / 1.0 - phát hành 1.0.2 sắp tới
  • tags / 1.0.0 - Phiên bản phát hành 1.0.0
  • tags / 1.0.1 - phiên bản phát hành 1.0.1

Cuối cùng, bạn gần như đã sẵn sàng để phát hành 1.1, nhưng trước tiên bạn muốn thực hiện bản beta. Trong trường hợp này, bạn có thể thực hiện một nhánh "1.1" và thẻ "1.1beta1". Bây giờ, làm việc trên những gì sẽ là 1.2 (hoặc 2.0 có thể) tiếp tục trong thân cây, nhưng công việc trên 1.1 vẫn tiếp tục trong nhánh "1.1".

  • trunk / - phiên bản phát triển, sắp có 1,2
  • chi nhánh / 1.0 - phát hành 1.0.2 sắp tới
  • chi nhánh / 1.1 - phát hành 1.1.0 sắp tới
  • tags / 1.0.0 - Phiên bản phát hành 1.0.0
  • tags / 1.0.1 - phiên bản phát hành 1.0.1
  • thẻ / 1.1beta1 - 1.1 beta 1 phiên bản phát hành

Khi bạn phát hành 1.1 cuối cùng, bạn thực hiện thẻ "1.1" từ nhánh "1.1".

Bạn cũng có thể tiếp tục duy trì 1.0 nếu bạn muốn, chuyển các bản sửa lỗi giữa cả ba nhánh (1.0, 1.1 và thân cây). Điểm quan trọng là đối với mọi phiên bản chính của phần mềm bạn đang bảo trì, bạn có một nhánh chứa phiên bản mã mới nhất cho phiên bản đó.


Một cách sử dụng khác của các chi nhánh là cho các tính năng. Đây là nơi bạn phân nhánh thân cây (hoặc một trong các nhánh phát hành của bạn) và làm việc trên một tính năng mới trong sự cô lập. Khi tính năng được hoàn thành, bạn hợp nhất lại và xóa chi nhánh.

  • trunk / - phiên bản phát triển, sắp có 1,2
  • chi nhánh / 1.1 - phát hành 1.1.0 sắp tới
  • cành / ui-viết lại - nhánh tính năng thử nghiệm

Ý tưởng của việc này là khi bạn đang làm việc gì đó gây rối (điều đó sẽ cản trở hoặc cản trở người khác thực hiện công việc của họ), một điều gì đó thử nghiệm (thậm chí có thể không thực hiện được), hoặc có thể chỉ là một việc gì đó mất nhiều thời gian (và bạn sợ nếu nó giữ bản phát hành 1.2 khi bạn sẵn sàng phân nhánh 1.2 từ thân cây), bạn có thể làm điều đó một cách tách biệt trong nhánh. Nói chung, bạn luôn cập nhật nó với thân cây bằng cách hợp nhất các thay đổi vào nó mọi lúc, điều này giúp bạn dễ dàng tích hợp lại (hợp nhất trở lại thân cây) khi bạn kết thúc.


Cũng lưu ý, sơ đồ phiên bản tôi sử dụng ở đây chỉ là một trong số rất nhiều. Một số nhóm sẽ thực hiện các bản phát hành sửa lỗi / bảo trì như 1.1, 1.2, v.v. và các thay đổi lớn là 1.x, 2.x, v.v ... Cách sử dụng ở đây là như nhau, nhưng bạn có thể đặt tên cho nhánh là "1" hoặc "1 .x "thay vì" 1.0 "hoặc" 1.0.x ". (Ngoài ra, phiên bản ngữ nghĩa là một hướng dẫn tốt về cách làm số phiên bản).


6
@baruch - Điều đó hoàn toàn sai. Các thẻ rất nhẹ và (liên quan đến chính Subversion) giống hệt với các nhánh.
Josh Kelley

7
Yêu chi tiết trường hợp sử dụng. Cảm ơn @gregmac.
Jeromy Pháp

2
Tôi có thể nhận được báo giá về việc thẻ / chi nhánh có trọng lượng nhẹ không? Có vẻ như không phải vậy ..
Cardin Lee JH

3
Đây phải là câu trả lời được chấp nhận tốt hơn rất nhiều ^^
Nam G VU

4
@Cardin Tôi không có tài liệu tham khảo ngay bây giờ, nhưng điều quan trọng cần lưu ý là thẻ rất nhẹ trên máy chủ, nhưng không phải máy khách. Nếu bạn kiểm tra tất cả các thẻ, bạn sẽ nhận được nhiều bản sao đầy đủ. Tuy nhiên, nếu bạn nhìn vào kích thước kho lưu trữ trên máy chủ, nó sẽ chỉ tăng thêm một vài byte cho mỗi thẻ. Đây là lý do tại sao bạn không nên kiểm tra thư mục gốc, nói chung.
gregmac

97

Ngoài những gì Nick đã nói, bạn có thể tìm hiểu thêm tại Streamed Lines: Các mô hình phân nhánh để phát triển phần mềm song song

nhập mô tả hình ảnh ở đây

Trong hình mainnày là thân cây, rel1-maintlà một nhánh và 1.0là một thẻ.


1
@Wolf anh ấy có thể - sơ đồ đó là khá chung chung bất kể công cụ. Tất cả các SCM sử dụng các từ khác nhau nhưng cùng một khái niệm, không có sự khác biệt giữa thân cây và Chính; hoặc thân cây và chủ. Sơ đồ đó cho thấy công ty hiện tại của tôi sử dụng SVN như thế nào.
gbjbaanb

@gbjbaanb Cảm ơn bạn đã chia sẻ. ... và các thẻ dường như không được giải quyết bằng câu hỏi. Có phải là sự trùng hợp thuần túy (cũng trong công ty hiện tại của bạn) rằng không có sự hợp nhất nào đi từ chính đến từ các chi nhánh được duy trì?
Sói

@Wolf Không có sự trùng hợp - chỉ phân nhánh từ thân cây, thực hiện công việc, nhập lại vào thân cây. Sau đó rẽ nhánh ra một nhánh thẻ. Chúng tôi đang xem xét một "thân cây" khác được gọi là Tích hợp đã hoàn thành các nhánh được hợp nhất với nó để thử nghiệm không tạo thành một bản phát hành, thân cây vẫn được sử dụng cho các nhánh mà chúng tôi quyết định đưa vào bản phát hành tiếp theo. Lần duy nhất bạn hợp nhất từ ​​thân cây đến một nhánh là cập nhật một nhánh chạy dài, nhưng tốt hơn (và dễ dàng hơn) chỉ đơn giản là tạo một nhánh mới ra khỏi thân cây và hợp nhất các thay đổi của nhánh cũ của bạn với nó nếu bạn cần.
gbjbaanb

75

Nói chung (quan điểm bất khả tri của công cụ), một nhánh là cơ chế được sử dụng để phát triển song song. Một SCM có thể có từ 0 đến n nhánh. Lật đổ có 0.

  • Trunk là một nhánh chính được đề xuất bởi Subversion , nhưng bạn không bị buộc phải tạo ra nó. Bạn có thể gọi nó là 'chính' hoặc 'phát hành', hoặc không có cái nào cả!

  • Chi nhánh đại diện cho một nỗ lực phát triển. Không bao giờ được đặt tên theo tài nguyên (như 'vonc_branch') nhưng sau:

    • mục đích 'myProject_dev' hoặc 'myProject_Merge'
    • chu vi phát hành 'myProjetc1.0_dev'or myProject2.3_Merge' hoặc 'myProject6..2_Patch1' ...
  • Thẻ là ảnh chụp nhanh của các tệp để dễ dàng quay lại trạng thái đó. Vấn đề là thẻ và nhánh đó giống nhau trong Subversion . Và tôi chắc chắn sẽ đề nghị phương pháp hoang tưởng:

    bạn có thể sử dụng một trong các tập lệnh kiểm soát truy cập được cung cấp với Subversion để ngăn chặn bất kỳ ai làm bất cứ điều gì ngoài việc tạo các bản sao mới trong khu vực thẻ.

Một thẻ là cuối cùng. Nội dung của nó không bao giờ nên thay đổi. KHÔNG BAO GIỜ. Không bao giờ. Bạn quên một dòng trong ghi chú phát hành? Tạo một thẻ mới. Lỗi thời hoặc loại bỏ cái cũ

Bây giờ, tôi đã đọc rất nhiều về "hợp nhất lại như vậy và như vậy trong các nhánh như vậy và cuối cùng, sau đó cuối cùng trong nhánh thân cây". Đó được gọi là quy trình làm việc hợp nhất và không có gì bắt buộc ở đây . Không phải vì bạn có một nhánh thân mà bạn phải hợp nhất lại bất cứ thứ gì.

Theo quy ước, nhánh trung kế có thể đại diện cho trạng thái phát triển hiện tại của bạn, nhưng đó là cho một dự án tuần tự đơn giản, đó là một dự án có:

  • không phát triển 'trước' (đối với việc chuẩn bị phiên bản tiếp theo ngụ ý những thay đổi như vậy mà chúng không tương thích với sự phát triển 'thân cây' hiện tại)
  • không tái cấu trúc lớn (để thử nghiệm một lựa chọn kỹ thuật mới)
  • không bảo trì dài hạn bản phát hành trước

Bởi vì với một (hoặc tất cả) kịch bản đó, bạn sẽ có được bốn "thân cây", bốn "phát triển hiện tại" và không phải tất cả những gì bạn làm trong sự phát triển song song đó nhất thiết phải được hợp nhất lại trong "thân cây".


38

Trong SVN một thẻ và chi nhánh thực sự giống nhau.

Tag = một lát cắt được xác định theo thời gian, thường được sử dụng để phát hành

Nhánh = cũng là một lát cắt được xác định theo thời gian mà sự phát triển có thể tiếp tục, thường được sử dụng cho phiên bản chính như 1.0, 1.5, 2.0, v.v., sau đó khi bạn phát hành, bạn gắn thẻ nhánh. Điều này cho phép bạn tiếp tục hỗ trợ một bản phát hành sản xuất trong khi di chuyển về phía trước với việc phá vỡ các thay đổi trong thân cây

Trunk = không gian làm việc phát triển, đây là nơi tất cả sự phát triển sẽ xảy ra và sau đó các thay đổi được hợp nhất trở lại từ các bản phát hành chi nhánh.


30

Chúng không thực sự có bất kỳ ý nghĩa chính thức. Một thư mục là một thư mục cho SVN. Chúng là một cách thường được chấp nhận để tổ chức dự án của bạn.

  • Thân cây là nơi bạn giữ dòng phát triển chính của mình. Thư mục nhánh là nơi bạn có thể tạo, tốt, các nhánh, rất khó để giải thích trong một bài viết ngắn.

  • Một nhánh là một bản sao của một tập hợp con của dự án mà bạn làm việc tách rời khỏi thân cây. Có thể đó là cho các thử nghiệm có thể không đi đến đâu hoặc có thể là cho phiên bản tiếp theo, sau này bạn sẽ hợp nhất trở lại vào thân cây khi nó trở nên ổn định.

  • Và thư mục thẻ là để tạo các bản sao được gắn thẻ của kho lưu trữ của bạn, thường là tại các điểm kiểm tra phát hành.

Nhưng như tôi đã nói, với SVN, một thư mục là một thư mục. branch, trunkVà thẻ chỉ là một quy ước.

Tôi đang sử dụng từ 'bản sao' một cách tự do. SVN không thực sự tạo ra các bản sao đầy đủ của các thứ trong kho lưu trữ.


13

Các thân cây là dòng phát triển chứa mã nguồn mới nhất và các tính năng. Nó nên có các bản sửa lỗi mới nhất trong đó cũng như các tính năng mới nhất được thêm vào dự án.

Các nhánh thường được sử dụng để làm một cái gì đó từ thân cây (hoặc dòng phát triển khác) mà nếu không sẽ phá vỡ bản dựng. Các tính năng mới thường được xây dựng trong một nhánh và sau đó được hợp nhất trở lại vào thân cây. Các nhánh thường chứa mã không nhất thiết phải được phê duyệt cho dòng phát triển mà nó được phân nhánh. Ví dụ, một lập trình viên có thể thử tối ưu hóa một cái gì đó trong một nhánh và chỉ hợp nhất trở lại trong dòng phát triển một khi tối ưu hóa là thỏa đáng.

Các thẻ là ảnh chụp nhanh của kho lưu trữ tại một thời điểm cụ thể. Không có sự phát triển nên xảy ra trên những. Chúng thường được sử dụng để lấy một bản sao của những gì đã được phát hành cho khách hàng để bạn có thể dễ dàng truy cập vào những gì khách hàng đang sử dụng.

Đây là một liên kết đến một hướng dẫn rất tốt để lưu trữ:

Các bài viết trong Wikipedia cũng đáng đọc.


12

Bây giờ đó là điều về phát triển phần mềm, không có kiến ​​thức nhất quán về bất cứ điều gì, mọi người dường như có cách riêng của họ, nhưng đó là vì dù sao đó cũng là một ngành học tương đối trẻ.

Đây là cách đơn giản của tôi,

trunk - Thư mục trunk chứa nội dung công việc hiện tại, được phê duyệt và hợp nhất. Trái với những gì nhiều người đã thú nhận, thân cây của tôi chỉ dành cho công việc sạch sẽ, gọn gàng, được phê duyệt, và không phải là một khu vực phát triển, mà là một khu vực phát hành.

Tại một số thời điểm nhất định khi thân cây dường như tất cả đã sẵn sàng để phát hành, sau đó nó được gắn thẻ và phát hành.

chi nhánh - Thư mục chi nhánh chứa các thí nghiệm và công việc đang diễn ra. Làm việc dưới một chi nhánh ở đó cho đến khi được chấp thuận để sáp nhập vào thân cây. Đối với tôi, đây là khu vực mà tất cả các công việc được thực hiện.

Ví dụ: Tôi có thể có một nhánh lặp-5 cho vòng phát triển thứ năm trên sản phẩm, có thể là nhánh nguyên mẫu-9 cho vòng thử nghiệm thứ chín, v.v.

tags - Thư mục thẻ chứa ảnh chụp nhanh của các nhánh và bản phát hành thân được phê duyệt. Bất cứ khi nào một nhánh được chấp thuận để hợp nhất vào thân cây, hoặc một bản phát hành được tạo ra từ thân cây, một ảnh chụp nhanh của nhánh hoặc bản phát hành thân được phê duyệt được thực hiện theo các thẻ.

Tôi cho rằng với các thẻ tôi có thể nhảy qua lại theo thời gian để quan tâm điểm khá dễ dàng.


10

Tôi tìm thấy hướng dẫn tuyệt vời này về SVN khi tôi nhìn lên các trang web của các tác giả của OpenCV 2 Computer Vision Application Programming Cookbook và tôi nghĩ rằng tôi nên chia sẻ.

Anh ta có một hướng dẫn về cách sử dụng SVN và các cụm từ 'thân cây', 'thẻ' và 'nhánh' có nghĩa là gì.

Trích dẫn trực tiếp từ hướng dẫn của mình:

Phiên bản hiện tại của dự án phần mềm của bạn, trong đó nhóm của bạn hiện đang làm việc thường nằm trong một thư mục có tên là trunk . Khi dự án phát triển, nhà phát triển cập nhật phiên bản đó sửa lỗi, thêm các tính năng mới) và gửi các thay đổi của anh ta trong thư mục đó.

Tại bất kỳ thời điểm nào, bạn có thể muốn đóng băng phiên bản và chụp ảnh chụp nhanh phần mềm vì nó đang ở giai đoạn phát triển này. Điều này thường tương ứng với các phiên bản chính thức của phần mềm của bạn, ví dụ: phiên bản bạn sẽ cung cấp cho khách hàng của mình. Các ảnh chụp nhanh này được đặt trong thư mục thẻ của dự án của bạn.

Cuối cùng, thường hữu ích khi tạo một dòng phát triển mới cho phần mềm của bạn. Điều này xảy ra, ví dụ, khi bạn muốn thử nghiệm một triển khai thay thế trong đó bạn phải sửa đổi phần mềm của mình nhưng bạn không muốn gửi những thay đổi này cho dự án chính cho đến khi bạn quyết định xem bạn có áp dụng giải pháp mới hay không. Nhóm chính sau đó có thể tiếp tục làm việc với dự án trong khi nhà phát triển khác làm việc trên nguyên mẫu. Bạn sẽ đặt những dòng phát triển mới của dự án dưới một thư mục gọi là các nhánh .


9

Thư mục trung kế là thư mục mà bạn có thể quen thuộc nhất, bởi vì nó được sử dụng để giữ những thay đổi gần đây nhất. Codebase chính của bạn nên ở trong thân cây.

Thư mục chi nhánh là để giữ các chi nhánh của bạn, bất kể chúng có thể là gì.

Thư mục thẻ về cơ bản là để gắn thẻ một tập hợp các tệp nhất định. Bạn làm điều này cho những thứ như bản phát hành, trong đó bạn muốn "1.0" trở thành những tệp này tại các phiên bản này và "1.1" là những tệp này tại các phiên bản này. Bạn thường không sửa đổi các thẻ một khi chúng được thực hiện. Để biết thêm thông tin về các thẻ, xem Chương 4. Phân nhánh và hợp nhất (trong Kiểm soát phiên bản với Subversion ).


9

Một trong những lý do tại sao mọi người có một định nghĩa hơi khác nhau là vì Subversion thực hiện không hỗ trợ cho các nhánh và thẻ. Subversion về cơ bản nói: Chúng tôi đã xem xét các nhánh và thẻ đầy đủ tính năng trong các hệ thống khác và không thấy chúng hữu ích, vì vậy chúng tôi không thực hiện bất cứ điều gì. Thay vào đó, chỉ cần tạo một bản sao vào một thư mục mới với một quy ước tên . Tất nhiên mọi người đều có thể có những quy ước hơi khác nhau. Để hiểu sự khác biệt giữa thẻ thực và quy ước chỉ sao chép + đặt tên, hãy xem mục & thẻ Subversion của mục nhập Wikipedia .


8

Tag = một lát cắt được xác định theo thời gian, thường được sử dụng để phát hành

Tôi nghĩ rằng đây là những gì người ta thường có nghĩa là "thẻ". Nhưng trong lật đổ:

Chúng không thực sự có bất kỳ ý nghĩa chính thức. Một thư mục là một thư mục cho SVN.

mà tôi thấy khá khó hiểu: một hệ thống kiểm soát sửa đổi không biết gì về các nhánh hoặc thẻ. Từ quan điểm thực hiện, tôi nghĩ cách Subversion tạo ra "bản sao" là rất thông minh, nhưng tôi phải biết về nó là cái mà tôi gọi là một sự trừu tượng bị rò rỉ .

Hoặc có lẽ tôi đã sử dụng CVS quá lâu.


Một quan điểm khác là điều ngược lại là đúng, rằng việc áp đặt khái niệm thẻ trên mô hình đối tượng lật đổ sẽ bị trừu tượng hóa theo hướng ngược lại. Như tôi đoán bạn biết, lật đổ là một phản ứng đối với CVS, một nỗ lực để "làm CVS đúng". Tôi không thể tìm thấy tài liệu tham khảo, nhưng các nhà thiết kế lật đổ ban đầu đã nói rằng họ đã loại bỏ khái niệm thẻ 100% một cách có chủ ý, rằng sự khác biệt giữa các nhánh và thẻ hoàn toàn là vấn đề chính sách. Nếu các đội muốn áp đặt chính sách và quy ước lên trên mô hình đối tượng lật đổ, thì hãy làm như vậy. Đó chính xác là những gì chúng ta có ngày hôm nay.
Darryl

6

Tôi nghĩ rằng một số nhầm lẫn xuất phát từ sự khác biệt giữa khái niệm thẻ và việc triển khai trong SVN. Để SVN một thẻ là một nhánh là một bản sao. Sửa đổi thẻ được coi là sai và trên thực tế, các công cụ như TortoiseSVN sẽ cảnh báo bạn nếu bạn cố gắng sửa đổi bất cứ điều gì với ../tags/ .. trong đường dẫn.


5

Tôi không thực sự chắc chắn 'thẻ' là gì, nhưng nhánh là một khái niệm kiểm soát nguồn khá phổ biến.

Về cơ bản, một nhánh là một cách để thay đổi mã mà không ảnh hưởng đến thân cây. Giả sử bạn muốn thêm một tính năng mới khá phức tạp. Bạn muốn có thể kiểm tra các thay đổi khi bạn thực hiện chúng, nhưng không muốn nó ảnh hưởng đến thân cây cho đến khi bạn hoàn thành tính năng này.

Đầu tiên bạn tạo một nhánh. Đây về cơ bản là một bản sao của thân cây kể từ thời điểm bạn thực hiện chi nhánh. Sau đó, bạn sẽ làm tất cả công việc của bạn trong chi nhánh. Bất kỳ thay đổi nào được thực hiện trong chi nhánh đều không ảnh hưởng đến thân cây, vì vậy thân cây vẫn có thể sử dụng được, cho phép những người khác tiếp tục làm việc ở đó (như thực hiện sửa lỗi hoặc cải tiến nhỏ). Khi tính năng của bạn hoàn tất, bạn sẽ tích hợp nhánh trở lại vào thân cây. Điều này sẽ di chuyển tất cả các thay đổi của bạn từ chi nhánh đến thân cây.

Có một số mẫu người sử dụng cho các chi nhánh. Nếu bạn có một sản phẩm có nhiều phiên bản chính được hỗ trợ cùng một lúc, thông thường mỗi phiên bản sẽ là một chi nhánh. Nơi tôi làm việc, chúng tôi có chi nhánh QA và chi nhánh sản xuất. Trước khi phát hành mã của chúng tôi sang QA, chúng tôi tích hợp các thay đổi cho nhánh QA, sau đó triển khai từ đó. Khi phát hành vào sản xuất, chúng tôi tích hợp từ nhánh QA sang nhánh sản xuất, vì vậy chúng tôi biết mã đang chạy trong sản xuất giống hệt với những gì QA đã thử nghiệm.

Đây là mục Wikipedia trên các chi nhánh , vì có lẽ họ giải thích mọi thứ tốt hơn tôi có thể. :)


4

Trunk : Sau khi hoàn thành mọi cuộc chạy nước rút nhanh nhẹn, chúng tôi đưa ra một sản phẩm có thể thay đổi một phần. Những bản phát hành được giữ trong thân cây.

Chi nhánh : Tất cả các mã phát triển song song cho mỗi lần chạy nước rút đang diễn ra được giữ trong các chi nhánh.

Thẻ : Mỗi khi chúng tôi phát hành một loại sản phẩm phiên bản beta có thể thay đổi một phần, chúng tôi sẽ tạo một thẻ cho nó. Điều này cung cấp cho chúng tôi mã có sẵn tại thời điểm đó, cho phép chúng tôi quay lại trạng thái đó nếu được yêu cầu tại một số điểm trong quá trình phát triển.


Đây là quy trình làm việc cụ thể của bạn , nó không được áp dụng chung.
Jason S

4

Đối với những người quen thuộc với GIT, chủ trong GIT tương đương với trung kế trong SVN.

Chi nhánh và thẻ có cùng thuật ngữ trong cả GIT và SVN.

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.