Luồng công việc Git phù hợp cho nhiều bản phát hành hoạt động trong khi xử lý các hotfix


30

Tôi đang cố gắng chọn một quy trình công việc Git phù hợp nhất cho sản phẩm của chúng tôi. Dưới đây là các tham số:

  • Chúng tôi thực hiện một vài bản phát hành lớn mỗi năm, giả sử nhiều nhất là 10
  • Chúng tôi có nhiều phiên bản sản phẩm của chúng tôi hoạt động cùng một lúc (một số người ở phiên bản v10.1, một số phiên bản v11.2, v.v.)
  • Chúng tôi cần có khả năng làm việc trên nhiều bản phát hành cùng một lúc (vì vậy chúng tôi có thể làm việc trên v12.1, nhưng khi chúng tôi kết thúc bản phát hành, chúng tôi bắt đầu làm việc trên v12.2 cùng một lúc)
  • Chúng tôi cần có khả năng phát hành hotfix khi tìm thấy lỗi nghiêm trọng

Cho đến nay, đây là cách tôi nghĩ nó có thể hoạt động:

  • Repo từ xa duy nhất được sử dụng
  • Tạo nhánh 12.1 từ master
  • Tạo các nhánh tính năng dựa trên 12.1, cam kết chúng và hợp nhất lại thành 12.1, đẩy
  • Khi chúng ta cần bắt đầu làm việc với bản phát hành trong tương lai, hãy tạo một nhánh mới 12.2 dựa trên 12.1
  • Từ đó trở đi, khi làm việc trên một tính năng cho 12.1, hãy tạo nhánh từ 12.1, cam kết thay đổi và hợp nhất vào cả 12.1 và 12.2, đẩy
  • Nếu làm việc trên một tính năng cho 12.2, hãy tạo chi nhánh từ 12.2, cam kết thay đổi và chỉ hợp nhất thành 12.2, đẩy
  • Khi hoàn thành phát hành 12.1, hợp nhất nó vào nhánh chính và thẻ master với 12.1
  • Nếu cần một hotfix, hãy tạo một nhánh hotfix từ nhánh phát hành cũ nhất cần nó, cam kết thay đổi và hợp nhất trở lại vào tất cả các nhánh phát hành cho bản phát hành đó và các bản phát hành trong tương lai có thể bị ảnh hưởng; nếu nhánh phát hành ổn định mới nhất bị ảnh hưởng, hãy hợp nhất nó thành master.

Tôi có một vài lo ngại:

  • Tôi không chắc chắn rằng việc hợp nhất các hotfix từ các nhánh cũ thành các nhánh mới sẽ là một quá trình trơn tru, đặc biệt là nếu có nhiều thay đổi chồng chéo; nó sẽ thông minh hơn khi chỉ cần hotfix thủ công ở mỗi chi nhánh trong trường hợp có vẻ như sẽ có xung đột
  • Các mô hình quy trình công việc mà tôi thấy dường như không giữ cho các nhánh phát hành tồn tại nhiều, sau khi thực hiện xong, bản phát hành được hợp nhất thành chủ, được gắn thẻ và xóa. Vấn đề của tôi với điều đó là tôi không có ý tưởng hay về cách quản lý trạng thái phát hành nếu tất cả những gì tôi có là các thẻ trong master, có vẻ như hotfix dễ dàng hơn trong một nhánh và sau đó tôi có một bản phát hành mà tôi luôn có thể quay lại có hotfix mới nhất (tôi thậm chí có thể gắn thẻ các hotfix trong bản phát hành). Không chắc chắn có cách nào tôi có thể quay lại trong master và bằng cách nào đó có một bản sao của bản phát hành với hotfix được áp dụng và cập nhật thẻ đó.

Nhận xét được đánh giá cao về những điều tôi có thể đã bỏ qua hoặc cách tốt hơn để hoàn thành những điều được đưa ra theo yêu cầu tôi đã chỉ định.



11
Tôi biết về dòng chảy git, nhưng tôi không thấy cách nó giải quyết hoạt động trên nhiều bản phát hành mô phỏng. Có vẻ như các nhánh phát hành thậm chí không thực sự được thực hiện để thực hiện bất kỳ công việc nào, chủ yếu là để dọn dẹp và sau đó hợp nhất và gắn thẻ. Tôi phải làm gì khi có một hotfix ảnh hưởng đến 4 phiên bản phát hành khác nhau? Tôi đoán rằng tôi có thể kiểm tra một bản phát hành được gắn thẻ từ chủ, nhưng một khi tôi đã sửa nó, tôi sẽ làm việc lại như thế nào với bất kỳ bản sửa lỗi nào tôi đã làm thành bản chính cho bản phát hành cụ thể đó. Có vẻ như nó sẽ khá khó khăn.
Rocket04

Nếu bạn cần sửa chữa nhiều bản phát hành với cùng một bản sửa lỗi, trước tiên bạn có thể nên sửa phiên bản cũ nhất và hợp nhất lên bản mới hơn, điều chỉnh để phù hợp với từng bản phát hành. Nếu bạn làm việc từ mới đến cũ, bạn có nguy cơ kéo xuống các phụ thuộc từ các bản phát hành sau này sẽ làm phức tạp mọi thứ.
axl

Và như tôi đã đề cập trong câu trả lời được đề xuất của mình, nhánh chính không hoạt động tốt với nhiều bản phát hành trực tiếp, vì vậy trừ khi bạn thực sự cần nó vì một số lý do, tôi sẽ khuyên bạn không nên sử dụng nó.
axl

Câu trả lời:


9

Bạn dường như đang phân nhánh trên mỗi bản phát hành chính (12.0.0), sau đó có các bản cập nhật nhỏ có thể cho mỗi (12.1.0) và các bản sửa lỗi nóng (12.2.1). Chính xác?

Không có lý do cụ thể tại sao bạn không thể giữ các nhánh phát hành còn sống trong GitFlow sau khi phát hành, ngoài việc điều phối các thay đổi giữa nhiều nhánh chuyển hướng trong một thời gian dài là khó khăn với bất kỳ mô hình nào. Tôi cho rằng GitFlow cũng được mô hình hóa nhiều hơn cho các sản phẩm duy trì một bản phát hành trực tiếp duy nhất trong khi phát triển phần tiếp theo.

Tôi sẽ gắn bó với GitFlow và thực hiện một vài sửa đổi;

Bỏ qua nhánh chủ. Tôi đã không sử dụng thực tế của nó cho đến nay, và nó sẽ mất tính tuyến tính của nó như cách bạn làm việc. Tiếp tục phát triển trên phiên bản chính tiếp theo về phát triển. Nếu bạn quyết định giữ bản gốc, đừng đặt thẻ phát hành lên bản gốc, hãy đặt chúng vào cam kết cuối cùng trên nhánh phát hành tạo ra nhị phân mà bạn đang vận chuyển.

Đừng vứt bỏ các nhánh phát hành sau khi bạn hợp nhất chúng lại để phát triển. Thay vào đó giữ chúng xung quanh cho bản phát hành nhỏ tiếp theo và các bản sửa lỗi nóng có thể. Nếu bạn ngừng hỗ trợ phát hành, tôi cho rằng việc xóa chúng là tốt. Bạn có thể đặt tên cho các nhánh phát hành theo thành phần chính của chúng, phát hành / 12, và sau đó tạo các nhánh phát hành phụ, phát hành / 12.1, phát hành / 12.2 khỏi nó. Tôi đã không phải lo lắng quá nhiều về mức độ song song này, nhưng đó có lẽ là những gì tôi đã thử. Bạn có thể nghĩ mỗi nhánh phát hành chính là môi trường GitFlow phụ của riêng nó trong trường hợp này.

Nếu bạn phải làm việc song song trên các tính năng cho một số bản phát hành lớn trong tương lai cùng một lúc, có lẽ bạn phải tiếp tục phát triển (13) tiếp theo và bất cứ điều gì cho các phiên bản sau (14, 15) trên các nhánh "phát triển-N" bổ sung . Điều đó có vẻ rất khó để duy trì nói chung, nhưng sẽ có thể.


3

Có vẻ như một giải pháp khả thi cho vấn đề chính của bạn ( «Chúng tôi cần có thể làm việc trên nhiều bản phát hành cùng một lúc [...]» ) đang làm phiềngit worktree add <path> [<branch>]

Kho git có thể hỗ trợ nhiều cây làm việc , cho phép bạn kiểm tra nhiều nhánh cùng một lúc.
Với git worktree add, một cây làm việc mới được liên kết với kho lưu trữ.

Cây làm việc mới này được gọi là "cây làm việc được liên kết" trái ngược với "cây làm việc chính" được chuẩn bị bởi " git init" hoặc " git clone" .
Kho lưu trữ có một cây làm việc chính (nếu đó không phải là kho lưu trữ trần) và không hoặc nhiều cây làm việc được liên kết.

Xem câu trả lời SO này để giới thiệu chi tiết về git worktree.


1

Bạn đã đề cập rằng bạn quen thuộc với gitflow. Tôi đề nghị thêm nó cho kịch bản của bạn. Bạn sẽ cần tạo các nhánh từ nhánh phát triển của mình để hỗ trợ các phiên bản cũ hơn. Các phiên bản cũ hơn này cũng sẽ cần phải có các nhánh phát hành / nhánh chính và các nhánh hotfix riêng. Bạn sẽ cần định kỳ hợp nhất các nhánh hỗ trợ của mình vào các nhánh hỗ trợ mới hơn và nhánh phát triển.

Khi sự phát triển của các phiên bản chính phân kỳ, điều này sẽ tiếp tục khó khăn hơn. Không có viên đạn bạc cho việc này. Đôi khi sẽ dễ dàng hơn để thực hiện thay đổi bằng tay. Chi phí duy trì các phiên bản cũ sẽ tăng lên và đến một lúc nào đó nó sẽ không còn giá trị nữa.

Tất cả phụ thuộc vào loại thay đổi bạn đang thực hiện trong các phiên bản cũ hơn. Nếu chỉ sửa lỗi, đó là tương đối dễ dàng để hợp nhất. Nếu bạn thử thêm các tính năng mới, điều đó sẽ khó khăn.


Nhưng như tôi đã đề cập, trong trường hợp dòng chảy git, có vẻ như họ không sử dụng các nhánh phát hành nhiều. Có vẻ như không có sự phát triển lớn nào đang diễn ra ở đó. Có vẻ như nhánh phát triển là vô dụng nếu chúng ta chủ yếu làm việc trong các nhánh phát hành, cũng có thể loại bỏ nó, mỗi nhánh phát hành về cơ bản là một nhánh phát triển trong một khoảng thời gian nhất định. Hay tôi đang thiếu một cái gì đó?
Rocket04
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.