Khi nào bạn nên chi nhánh?


Câu trả lời:


59

Có một số cách sử dụng để phân nhánh. Một trong những cách sử dụng phổ biến nhất là để tách các dự án đã từng có cơ sở mã chung. Điều này rất hữu ích để thử nghiệm với mã của bạn mà không ảnh hưởng đến đường trục chính.

Nói chung, bạn sẽ thấy hai loại nhánh:

  • Chi nhánh tính năng: Nếu một tính năng cụ thể đủ gây rối mà bạn không muốn toàn bộ nhóm phát triển bị ảnh hưởng trong giai đoạn đầu của nó, bạn có thể tạo một chi nhánh để thực hiện công việc này.

  • Nhánh sửa lỗi: Trong khi tiếp tục phát triển trên thân chính, một nhánh sửa lỗi có thể được tạo để giữ các bản sửa lỗi cho phiên bản mới nhất của phần mềm.

Bạn có thể quan tâm đến việc kiểm tra bài viết sau, giải thích các nguyên tắc phân nhánh và khi nào sử dụng chúng:


Tôi chưa bao giờ nghe hoặc nghĩ về cách sử dụng phổ biến mà bạn đã đề cập nhưng đó là một ý tưởng thực sự tuyệt vời. Tôi thực sự có thể sử dụng điều này trong dự án sắp tới. Cảm ơn đã chỉ ra điều đó.
Nils Riedemann

82

Nói chung, mục đích chính của việc phân nhánh (VCS - Hệ thống kiểm soát phiên bản - tính năng) là để đạt được sự cô lập về mã .

Bạn có ít nhất một nhánh, có thể đủ để phát triển tuần tự và được sử dụng cho nhiều tác vụ đang được ghi (cam kết) trên cùng một nhánh duy nhất đó.

Nhưng mô hình đó nhanh chóng cho thấy giới hạn của nó:

Khi bạn có nỗ lực phát triển (tái cấu trúc, tiến hóa, sửa lỗi, ...) và bạn nhận ra rằng bạn không thể thực hiện những thay đổi đó một cách an toàn trong cùng một nhánh với nhánh phát triển hiện tại của bạn (vì bạn sẽ phá vỡ API hoặc giới thiệu mã sẽ bị hỏng mọi thứ), sau đó bạn cần một nhánh khác .
(Để tách biệt mã mới đó cho mã kế thừa, mặc dù hai bộ mã sẽ được hợp nhất sau này)

Vì vậy, đó là câu trả lời của bạn ngay tại đó:
Bạn nên phân nhánh bất cứ khi nào bạn không thể theo đuổi và ghi lại hai nỗ lực phát triển trong một nhánh.
(mà không cần phải duy trì một lịch sử phức tạp khủng khiếp).


Một nhánh có thể hữu ích ngay cả khi bạn là người duy nhất làm việc trên mã nguồn, nếu bạn có nhiều.
Nhưng bạn không nên đặt "một nhánh cho mỗi nhà phát triển":
mục đích "cô lập" được thực hiện để cô lập nỗ lực phát triển (một nhiệm vụ có thể chung chung như "hãy phát triển phiên bản tiếp theo của phần mềm của chúng tôi" hoặc cụ thể như "hãy sửa lỗi 23 "),
không phải để cô lập" tài nguyên " .

(một nhánh có tên "VonC" không có ý nghĩa gì đối với nhà phát triển khác: Điều gì sẽ xảy ra nếu "VonC" rời khỏi dự án? Bạn phải làm gì với nó?
Một nhánh có tên "bugfix_212" có thể được hiểu trong ngữ cảnh của hệ thống theo dõi lỗi chẳng hạn và bất kỳ nhà phát triển nào cũng có thể sử dụng nó với ít nhất một số ý tưởng về những gì anh ta phải làm với nó)

Chi nhánh không phải là một thẻ (SVN là một hệ thống sửa đổicố gắng đề xuất versioning tính năng giống như phân nhánh và gắn thẻ thông qua các thư mục với tập tin bản sao giá rẻ: đó không có nghĩa là thẻ được một chi nhánh)

Để xác định một chi nhánh cũng có nghĩa là xác định một quy trình hợp nhất : bạn cần biết vị trí hợp nhất chi nhánh của mình khi bạn hoàn thành việc này.
Vì vậy, chương 7 của Lực lượng thực hành (Laura WINGERD - O'Reilly) là một phần giới thiệu hay (theo thuyết bất khả tri của VCS) để hợp nhất quy trình làm việc giữa các loại nhánh khác nhau: "" Cách phần mềm phát triển "(pdf)

Nó định nghĩa thuật ngữ codeline (nhánh ghi lại các bước phát triển quan trọng của mã, thông qua các thẻ tại một số điểm nhất định hoặc thông qua hợp nhất quan trọng trở lại nhánh)

Nó giới thiệu mô hình dòng chính (một dòng mã trung tâm để ghi lại các bản phát hành) và mô tả các mục đích khác nhau để phân nhánh:

  • Luồng phát triển tích cực : một quy trình mã hóa liên tục khi các phát triển khác nhau liên tiếp diễn ra
  • các nhánh nhiệm vụ : các nhánh tồn tại trong thời gian ngắn cho tác vụ cụ thể hơn (sửa lỗi là một cách cổ điển, nhưng bạn cũng có thể xác định một nhánh cho nỗ lực hợp nhất mà bạn biết là phức tạp để hoàn thành: bạn có thể hợp nhất, cam kết và kiểm tra trong nhánh tác vụ đó mà không giới thiệu vấn đề cho nhánh phát triển chính hiện tại)
  • nhánh dàn : để chuẩn bị phát hành, với một số tệp cấu hình hoặc dữ liệu cụ thể trước khi sản xuất.
  • Chi nhánh tư nhân, chi nhánh đặc biệt và chi nhánh thưa thớt : dành cho những nhiệm vụ rất nhỏ, chỉ để có thể cam kết một số công việc đang thực hiện mà không cần đợi hoàn thành chính thức hoặc đánh giá thử nghiệm.
    Điều đó cho phép "cam kết sớm, cam kết thường xuyên".

Các khái niệm thú vị khác xung quanh VCS: Các khái niệm cơ bản
(về ClearCase ban đầu, nhưng cũng có giá trị đối với bất kỳ VCS nào)


19

Tất cả các SCM của thế kỷ 21 đang nói với bạn:

Phân nhánh cho mọi tác vụ bạn phải làm , bất kể đây là tính năng mới, bản sửa lỗi, thử nghiệm, bất cứ điều gì. Đây được gọi là nhánh chủ đề và nó thay đổi cách bạn làm việc với SCM của mình.

Bạn lấy:

  • Cách ly tốt hơn
  • Khả năng truy xuất nguồn gốc tốt hơn -> bạn liên kết các nhiệm vụ với các nhánh chứ không phải các tập thay đổi riêng lẻ, điều này giúp bạn tự do cam kết bao nhiêu lần tùy thích và không áp đặt giới hạn như "một lần đăng ký cho mỗi tác vụ".
  • Các nhiệm vụ là độc lập (thường bắt đầu từ một đường cơ sở ổn định, vì vậy bạn chỉ tập trung vào mã của mình chứ không phải sửa lỗi từ người của bạn) và bạn có thể chọn xem bạn có muốn tích hợp chúng vào một thời điểm nào đó hay không, nhưng chúng luôn ở dưới kiểm soát phiên bản
  • Bạn có thể xem lại mã một cách dễ dàng (từ kiểm soát phiên bản, không phải cam kết trước nhảm nhí) trước khi nhấn vào dòng chính

Các công cụ có thể làm điều đó:

Những công cụ KHÔNG THỂ LÀM ĐƯỢC:

  • SVN
  • CVS
  • VSS
  • TFS
  • Perforce

1
Tại sao bạn không thể làm điều đó với SVN ??
yegor256

4
SVN sáp nhập không tốt. Do thiếu theo dõi hợp nhất thích hợp. Cũng bởi vì việc tạo ra một nhánh không hề rẻ như những nhánh tôi đã chỉ, nên nó sẽ trở thành một cơn ác mộng trong điều kiện thực tế.
pablo

Truy xuất nguồn gốc tốt hơn: Tại sao bạn muốn cam kết bao nhiêu lần tùy ý? Không phải một lần cho mỗi nhiệm vụ là đủ khi nhiệm vụ không phải là một tính năng phức tạp? Ngoài ra, các lỗi từ folks có thể dễ dàng tìm đường đến nhánh chính và làm cho nó không "ổn định" và không "an toàn", ngay tại thời điểm chúng hợp nhất.
Paiman Samadian

@PaimanSamadian: "Không phải một lần cho mỗi nhiệm vụ là đủ khi nhiệm vụ không phải là một tính năng phức tạp?" Chắc chắn rồi. Tương tự như vậy, khi nhiệm vụ được phức tạp, một cam kết là không đủ (tôi cam kết mỗi vài phút nếu mọi thứ đang tiến triển tốt). Tại sao buộc một cam kết cho mỗi nhiệm vụ? • "Ngoài ra bọ từ mọi người có thể dễ dàng tìm đường đến chi nhánh chính" Thực ra là không. Một phần quan điểm của luồng công việc nhánh tính năng là nó giúp cho việc xem xét và kiểm tra mã có thể thực hiện được trước khi mã được hợp nhất vào nhánh chính.
Marnen Laibow-Koser

1
@PaimanSamadian nhiều kiểm tra là rất tốt để giải thích các thay đổi trung gian và dễ dàng xem xét. Ngoài ra, nếu bạn đang làm việc vài giờ cho một thứ gì đó, thì nhiều lần kiểm tra là rất tốt.
pablo

8

Nó cũng phụ thuộc vào công cụ SCM bạn đang sử dụng. Các SCM hiện đại (git, tensurial, v.v.) giúp việc tạo và hủy các nhánh ngày càng dễ dàng bất cứ khi nào cần. Ví dụ, điều này cho phép bạn tạo một nhánh cho mỗi lỗi mà bạn đang xử lý. Khi bạn hợp nhất các kết quả của mình vào thân cây, bạn sẽ loại bỏ nhánh.

Các SCM khác, ví dụ như subversion và CVS, có mô hình phân nhánh "nặng hơn" nhiều. Điều đó có nghĩa là, một nhánh chỉ được coi là thích hợp cho một thứ gì đó lớn hơn một bản vá hai mươi dòng. Ở đó, các nhánh được sử dụng cổ điển để theo dõi toàn bộ quá trình phát triển, như phiên bản sản phẩm trước đó hoặc trong tương lai.


5

Khi bạn cần thực hiện các thay đổi quan trọng và / hoặc thử nghiệm đối với cơ sở mã của mình, đặc biệt nếu bạn muốn thực hiện các thay đổi trung gian mà không ảnh hưởng đến thân cây.


5

Nó phụ thuộc vào loại SCM bạn đang sử dụng.

Trong các phiên bản phân phối mới hơn (như git và thương mại), bạn luôn tạo ra các nhánh và vẫn tiếp tục hoạt động. Tôi thường sẽ làm việc trên một nhánh riêng biệt trong một thời gian chỉ vì ai đó đã phá vỡ bản dựng trên đường chính hoặc do mạng ngừng hoạt động và sau đó hợp nhất các thay đổi lại sau khi nó được khắc phục và việc này dễ dàng đến mức không gây khó chịu .

Tài liệu (ngắn và dễ đọc) đã giúp tôi hiểu rõ nhất về những gì đang diễn ra trong hệ thống phân tán là: Hiểu rõ về tinh thần .

Trong các hệ thống cũ hơn với kho lưu trữ trung tâm, (như CVS, SVN và ClearCase), thì đó là một vấn đề nghiêm trọng hơn nhiều cần được quyết định ở cấp độ nhóm và câu trả lời sẽ giống như 'duy trì một bản phát hành cũ trong khi cho phép phát triển để tiếp tục trên dòng chính ', hoặc' như một phần của thử nghiệm lớn '.

Tôi nghĩ rằng mô hình phân tán tốt hơn nhiều và chỉ thiếu các công cụ đồ họa đẹp để trở thành mô hình thống trị. Tuy nhiên, nó không được hiểu rộng rãi và các khái niệm khác nhau, vì vậy nó có thể gây nhầm lẫn cho người dùng mới.


3

Tôi thấy lời khuyên từ Laura Wingerd & Christopher Seiwald tại Perforce thực sự ngắn gọn và hữu ích:

* Branch only when necessary.
* Don't copy when you mean to branch.
* Branch on incompatible policy.
* Branch late.
* Branch, instead of freeze.

Xem http://www.perforce.com/sites/default/files/pdf/perforce-best-practices.pdf để biết giải thích chi tiết về từng loại và các phương pháp hay nhất khác.


3
Mọi người P4 thường nói điều này, nhưng ngày nay hoạt động tiếp thị của họ đang nói điều gì đó khác. Họ đã cố gắng để tránh sự phân nhánh trong nhiều năm qua, đơn giản chỉ vì họ không thể làm nhiệm vụ hoặc chủ đề, ngành tốt như các hệ thống khác trên mạng như Git
pablo

Phản hồi vào năm 2015! Lý do để tránh rẽ nhánh là để tránh sự cần thiết phải hợp nhất - không phải vì Perforce không có nhánh nhiệm vụ / chủ đề (bạn có thể thực hiện "nhánh nhiệm vụ" trong các luồng - trong Perforce chúng tôi gọi nó là "luồng nhiệm vụ". Như những người khác đã đề cập - sự phân nhánh được ngụ ý trong DVCS và câu hỏi này trở nên không cần thiết. Tôi nghĩ rằng cuộc thảo luận chỉ nên giới hạn ở các công cụ hoạt động theo kiểu máy khách-máy chủ. Hoặc DVCS được sử dụng theo kiểu tập trung (kể từ bản phát hành 2015.1, bạn có thể sử dụng Perforce ở chế độ DVCS - tốt nhất của cả hai thế giới).
Lester Cheung

2

Có nhiều mục đích khác nhau để phân nhánh:

  1. Đặc điểm / nhánh lỗi. Các nhánh năng động và hoạt động được chuyển trở lại thân cây khi tính năng / sửa lỗi hoàn tất.
  2. Các nhánh tĩnh (các thẻ trong Subversion, mặc dù về bản chất chỉ là một 'nhánh bình thường'). Họ cung cấp một ảnh chụp nhanh tĩnh về nói, một bản phát hành. Mặc dù chúng có thể được làm việc, chúng vẫn không bị ảnh hưởng.

1

Nhu cầu phân nhánh cũng có thể phát sinh:

  • khi bạn muốn cung cấp một hotfix cho một khách hàng cụ thể (nói là quan trọng) và bạn không chắc liệu bản sửa lỗi sẽ là một phần của các bản phát hành trong tương lai


  • 1

    Bất cứ khi nào bạn cảm thấy thích nó.

    Bạn có thể sẽ không thường xuyên làm việc với SCM tập trung vì các chi nhánh là một phần của kho lưu trữ chính thức và điều đó không thực sự mời gọi nhiều thử nghiệm, chưa kể đến việc hợp nhất thực sự gây hại.

    OTOH, không có sự khác biệt về kỹ thuật giữa chi nhánh và thanh toán trong SCM phân tán và việc hợp nhất dễ dàng hơn rất nhiều. Bạn sẽ cảm thấy muốn phân nhánh nhiều hơn thường xuyên hơn.


    0

    Khi bạn cần thực hiện thay đổi, dựa trên nhánh hiện tại của bạn, không dành cho bản phát hành tiếp theo từ nhánh đó (và không phải trước đó).

    Ví dụ, chúng tôi thường làm việc trên thân cây. Vào khoảng thời gian phát hành, ai đó sẽ cần thực hiện một thay đổi mà chúng tôi không muốn trong bản phát hành hiện tại (có thể là trước khi phát hành, tại thời điểm này, thường là sau khi phát hành). Đây là lúc chúng ta phân nhánh, để đặt bản phát hành trên nhánh của chính nó và tiếp tục phát triển cho bản phát hành tiếp theo trên thân cây.


    0

    Bỏ tất cả các kỹ thuật sang một bên .....

    Chi nhánh khi bạn biết sẽ dễ dàng hợp nhất lại!

    Hãy nhớ rằng việc hợp nhất sẽ luôn ảnh hưởng đến cách công việc được thực hiện trong một dự án.

    Một khi điều này đạt được, tất cả các vấn đề cấp ba khác sẽ xuất hiện.

    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.