Làm cách nào để sử dụng github, chi nhánh và bản phát hành tự động để quản lý phiên bản? [đóng cửa]


24

Bây giờ tôi đã hiểu hầu hết các khái niệm Git / Github cơ bản, tuy nhiên tôi vẫn gặp khó khăn trong việc hiểu bức tranh lớn hơn.

Đây là một số điều mà tôi đã quản lý để có được làm việc cho đến nay:

  • Cam kết đẩy
  • Làm việc với các chi nhánh
  • Tích hợp Github với Travis CI, một hệ thống tích hợp liên tục
  • Thông qua Travis CI, tự động xây dựng trên mọi cam kết để làm chủ và đặt bản phát hành dưới dạng ZIP trên Github dưới các bản phát hành.

Tuy nhiên, tôi mới chỉ làm việc trên các phiên bản alpha / beta của các dự án, vì vậy tôi chưa bao giờ thấy các phiên bản được phát hành trong thực tế.

Vì vậy, tôi muốn tìm hiểu thêm về phiên bản, duy trì các phiên bản riêng biệt, cập nhật các phiên bản, v.v.

Làm thế nào tôi có thể đảm bảo rằng những điều sau đây xảy ra:

  • Có các phiên bản khác nhau của dự án của tôi, ví dụ phiên bản 1.1.0 và 2.0.0
  • Có khả năng đẩy các hotfix trên các phiên bản, sắp xếp phiên bản lên 1.1.1 hoặc 2.0.1, v.v.
  • Tạo một hệ thống tích hợp liên tục tự động xây dựng phiên bản đó trên cam kết và nếu thành công, sau đó xuất bản bản phát hành cho phiên bản cụ thể đó.

Tôi nghi ngờ giữa các tùy chọn sau:

  • Tôi có cần sử dụng thẻ cho mọi phiên bản không? Nếu vậy, làm thế nào một hệ thống tích hợp liên tục có thể xây dựng các bản phát hành tự động?
  • Tôi có nên tạo chi nhánh cho mọi phiên bản? Nếu vậy, điều đó sẽ không tạo ra cả tấn nhánh (như nhánh 1.1 và nhánh 2.0, tất nhiên các hotfix sẽ đi vào nhánh đó)
  • Làm thế nào tôi có thể chỉ định số phiên bản? Có ổn không khi có một tệp cấu hình chỉ định số phiên bản, hoặc có những cách thông minh hơn xung quanh nó? Trong trường hợp này, nó sẽ là một dự án Java, nếu điều đó quan trọng.

3
Như hiện tại, đây là một câu hỏi khá rộng trên toàn bộ Git. Có một số các câu hỏi liên quan đến chủ đề này mà bạn có thể muốn duyệt. Có lẽ đọc một vài trong số đó và thu hẹp nó lại hoặc tách nó ra để có thể trả lời mà không cần viết một cuốn sách.
Ampt

Phạm vi xuống tiêu đề một chút để phản ánh nội dung.
Michael Durrant


1
Tôi sẽ chỉ ra rằng khi tôi có thể tìm thấy rất nhiều, và nhiều hơn nữa (tôi đã hết phòng), các bản sao có thể có cho các câu hỏi riêng lẻ trong câu hỏi này tôi tin rằng câu hỏi tổng thể là một chút về phía 'quá rộng'.

"Câu hỏi của bạn nên được sắp xếp hợp lý ..." ( trung tâm trợ giúp ). Xem meta.programmers.stackexchange.com/questions/6483/ từ
gnat

Câu trả lời:


42

Bạn nên nhìn vào dòng chảy git . Đó là một mô hình phân nhánh tuyệt vời (và phổ biến).

Tóm tắt dòng Git

Phân nhánh

Các thân cây chính tồn tại mãi mãi là developmaster. mastergiữ bản phát hành mới nhất của bạn và developgiữ bản sao phát triển "ổn định" mới nhất của bạn.

Người đóng góp tạo featurecác nhánh (có tiền tố feature/theo quy ước) tắt develop :

$ git checkout -b feature/my-feature develop

hotfixcác chi nhánh (có tiền tố hotfix/theo quy ước) tắt master:

# hotfix the latest version of master
$ git checkout -b hotfix/hotfix-version-number master

# or hotfix from a specific version
$ git checkout -b hotfix/hotfix-version-number <starting-tag-name>

Các nhánh này là "dùng một lần", có nghĩa là chúng có tuổi thọ ngắn trước khi chúng được hợp nhất trở lại các thân chính. Chúng có nghĩa là gói gọn các phần nhỏ của chức năng.

Chi nhánh hoàn thiện

Khi một người đóng góp được thực hiện với một featurenhánh, họ hợp nhất lại thành develop:

$ git checkout develop
$ git merge --no-ff feature/my-feature
$ git branch -d feature/my-feature

Khi chúng được thực hiện với một hotfixnhánh, chúng hợp nhất lại thành cả hai masterdevelopvì vậy, hotfix sẽ chuyển tiếp:

$ git checkout master
$ git merge --no-ff hotfix/hotfix-version-number
$ git checkout develop
$ git merge --no-ff hotfix/hotfix-version-number
$ git branch -d hotfix/hotfix-version-number

Đây là khía cạnh tích hợp liên tục.

Phát hành

Khi bạn đã sẵn sàng bắt đầu đóng gói một bản phát hành, bạn tạo một releasenhánh từ nhánh "ổn định" của mình develop(giống như tạofeature các nhánh). Sau đó, bạn tăng số phiên bản trong một thẻ (được mô tả bên dưới).

Sử dụng các releasenhánh riêng biệt cho phép bạn tiếp tục phát triển các tính năng mới developtrong khi bạn sửa lỗi và thêm các releasechi tiết hoàn thiện cho chi nhánh.

Khi bạn đã sẵn sàng hoàn thành việc phát hành, bạn hợp nhất releasechi nhánh thành cả hai masterdevelop(giống như a hotfix) để mọi thay đổi của bạn được tiến hành.

Gắn thẻ

Khi bạn tạo một releasenhánh hoặc một hotfixnhánh, bạn kết hợp số phiên bản một cách thích hợp trong một thẻ. Với vanilla git, trông như thế này:

$ git tag -a <tag-name> -m <tag-description>

Sau đó, bạn cũng sẽ phải đẩy các thẻ (riêng biệt) vào kho lưu trữ từ xa của mình:

$ git push --tags

Thông thường tốt nhất là sử dụng phiên bản ngữ nghĩa trong đó các phiên bản của bạn có dạng major.minor.hotfix. Các lỗi chính không tương thích ngược, trong khi các lỗi nhỏ và hotfix không tương thích ngược (trừ khi bạn đang ở giai đoạn thử nghiệm 0.x.x).

Sáp nhập

Như bạn đã thấy ở trên, git-Flow khuyến khích bạn hợp nhất các nhánh với lệnh sau:

$ git merge --no-ff <branch-name>

Các --no-fftùy chọn cho phép bạn duy trì tất cả lịch sử chi nhánh của bạn mà không để lại một loạt các chi nhánh nằm xung quanh trong hiện cam kết của các kho lưu trữ (để không phải lo lắng, bạn sẽ không có một chi nhánh cho mọi phiên bản).

Bạn cũng được khuyến khích kéo theo

$ git pull --rebase

Vì vậy, bạn không thêm nhiều cam kết hợp nhất vô dụng.

Bạn có thể định cấu hình git để thực hiện cả hai điều này theo mặc định trong .gitconfig . Tôi sẽ cho phép bạn nhìn cái đó lên;)

Phiên bản duyệt

Khi ai đó đang tìm kiếm một phiên bản cụ thể của cơ sở mã của bạn, họ có thể kiểm tra thẻ theo tên:

# checkout in detached HEAD to browse
$ git checkout <tag-name>

# OR checkout and create a new local branch (as you might for a hotfix)
$ git checkout -b <new-branch-name> <tag-name>

Hoặc, nếu ai đó đang duyệt trên github, cũng có một tab "thẻ" trong danh sách thả xuống "chi nhánh".

Sử dụng phần mở rộng dòng git (được khuyến nghị)

Cách ưa thích của tôi để sử dụng mô hình này là với phần mở rộng dòng git cho git.

( Chỉnh sửa: Louis đã đề xuất ngã ba AVH hoạt động tốt hơn git describevà có thể hoạt động nhiều hơn bây giờ. Cảm ơn Louis.)

Tiện ích mở rộng tự động hóa tất cả các phần lộn xộn (như sử dụng merge --no-ffvà xóa các nhánh sau khi hợp nhất) để bạn có thể tiếp tục cuộc sống của mình.

Ví dụ: với tiện ích mở rộng, bạn có thể tạo một nhánh tính năng như vậy:

$ git flow feature start my-feature-name

và hoàn thành nó như vậy

$ git flow feature finish my-feature-name

Các lệnh cho hotfix và bản phát hành là tương tự nhau, mặc dù chúng sử dụng số phiên bản thay cho tên chi nhánh, như vậy:

# Create hotfix number 14 for this minor version.
$ git flow hotfix start 2.4.14

# Create the next release
$ git flow release start 2.5.0

Git Flow sau đó tạo thẻ phiên bản cho bạn và vui lòng nhắc nhở bạn nâng cấp phiên bản trong bất kỳ tệp cấu hình hoặc tệp kê khai nào (mà bạn có thể làm với trình quản lý tác vụ như grunt).


Hy vọng điều đó có ích :) Tôi không chắc chắn chính xác cách bạn tích hợp tất cả với thiết lập Travis CI của bạn, nhưng tôi đoán githooks sẽ đưa bạn đến đó.


Khi bắt đầu một nhánh phát hành, bạn có sử dụng cùng một chuỗi chữ 'phát hành' làm tên nhánh cho mỗi bản phát hành, hoặc một phiên bản cụ thể như 'v0.3.0' không? Các hướng dẫn này rất tuyệt vời và tôi sẽ cố gắng theo chúng để gửi thư, nhưng tôi không muốn làm hỏng khía cạnh này của nó.
Paul

1
Sử dụng lệnh git Flow plugin, bạn sẽ đặt mã định danh phiên bản, như v0.3.0, cho <release> git flow release start <release> [<base>]. Dưới mui xe, nó sẽ tạo một tên chi nhánh bao gồm cả phiên bản, như thế nào release/v0.3.0.
mxdubois

3

Tôi có cần sử dụng thẻ cho mọi phiên bản không?

Không, bạn không cần phải sử dụng thẻ. Nếu bạn muốn gắn thẻ mọi bản phát hành, điều đó tốt hoặc nếu bạn muốn gắn thẻ mỗi khi hệ thống CI của bạn xây dựng, bạn cũng có thể làm điều đó. Các thẻ về cơ bản chỉ là đặt một tên thân thiện với người dùng cho cam kết, để bạn có thể dễ dàng kéo nó lên và xem nó sau này.

Tôi có nên tạo chi nhánh cho mọi phiên bản?

Chắc chắn rồi! Chi nhánh rẻ / miễn phí trong Git, vì vậy tôi tận dụng nó mọi cơ hội tôi nhận được. Bạn cũng có thể hợp nhất và xóa các nhánh khá nhanh. Nếu bạn cảm thấy rằng bạn phải có nhiều chi nhánh, bạn luôn có thể cắt giảm chúng sau này với một số hợp nhất có chọn lọc. Có một loạt các lược đồ phân nhánh Git có sẵn nếu bạn muốn sử dụng một lược đồ đã thử và đúng.

Làm thế nào tôi có thể chỉ định số phiên bản?

Thẻ thường là cách bạn chỉ định số phiên bản, vì nó liên quan đến git. Nếu bạn đang nói về cách tạo phiên bản cho một dự án, hoặc cách tốt nhất để làm điều đó, bạn sẽ phải thực hiện một số công việc đào bới, vì đó là một câu hỏi khá dựa trên quan điểm. Một số dự án ở lại bản Beta mãi mãi, một số dự án khác tăng số phiên bản toàn bộ như sắp hết kiểu (Nhìn vào chrome của bạn)


3

Tôi có cần sử dụng thẻ cho mọi phiên bản không?

Nếu theo "phiên bản", bạn có nghĩa là một tập hợp các tệp tạo ra một bản phát hành hoặc một ứng cử viên phát hành, thì tôi khuyên bạn nên gắn thẻ mọi phiên bản. Nếu bạn cần tham khảo phiên bản 1.2.7, bạn có muốn tìm kiếm một hàm băm của cam kết hay chỉ sử dụng số phiên bản?

Ngoài ra nếu bạn sử dụng git describeđể ghi thông tin xây dựng ở đâu đó (như tôi làm), thì việc sử dụng thẻ cho phép nó cung cấp đầu ra đẹp hơn nhiều.

Nếu vậy, làm thế nào một hệ thống tích hợp liên tục có thể xây dựng các bản phát hành tự động?

Một hệ thống tích hợp liên tục có thể xây dựng các bản phát hành bất kể bạn sử dụng thẻ như thế nào. Bạn có thể bảo nó xây dựng một bản phát hành trên cơ sở hàm băm của một cam kết. Thẻ làm cho cuộc sống của bạn dễ dàng hơn.

Tôi có nên tạo chi nhánh cho mọi phiên bản? Nếu vậy, điều đó sẽ không tạo ra cả tấn nhánh (như nhánh 1.1 và nhánh 2.0, tất nhiên các hotfix sẽ đi vào nhánh đó)

Tôi không thấy phân nhánh là một thứ "mỗi phiên bản". Tôi có một vài dự án trong đó các phiên bản của tôi đều được cam kết trên masterchi nhánh. Tôi không cần bất cứ điều gì phức tạp hơn này cho bây giờ vì không phải dự án đang trong giai đoạn ổn định và không có nhu cầu hỗ trợ các phiên bản cũ dài hạn. Nhưng giả sử tôi phát hành 1.0, 1.1, 1.2, sau đó tôi phát hành 2.0 và tôi vẫn phải hỗ trợ loạt 1.0 với các bản sửa lỗi bảo mật, v.v. .

Làm thế nào tôi có thể chỉ định số phiên bản? Có ổn không khi có một tệp cấu hình chỉ định số phiên bản, hoặc có những cách thông minh hơn xung quanh nó? Trong trường hợp này, nó sẽ là một dự án Java, nếu điều đó quan trọng.

Có một nguồn duy nhất cho số phiên bản của bạn, như tệp cấu hình, là cách tốt nhất vì nó ngăn ngừa các lỗi ngón tay có thể xảy ra nếu bạn phải cập nhật số ở một số vị trí. Tôi đang nói từ ... hmm ... kinh nghiệm xấu hổ. Bạn phát hành 1.3 chỉ để thấy rằng phần mềm vẫn báo cáo rằng đó là phiên bản 1.2. Rất tiếc!

Trong một câu trả lời khác, mxdubois đề nghị gitflow cho bạn. Nếu bạn quyết định sử dụng gitflow, tôi khuyên bạn nên sử dụng phiên bản AVH . Phiên bản gốc không còn được duy trì tích cực. Một điểm khác biệt đáng chú ý là phiên bản AVH thực hiện hợp nhất phát hành cho phép git describehoạt động thông minh. Phiên bản gốc thực hiện hợp nhất theo cách mà chuyến đigit describe .


0

Quét danh sách của bạn, tôi thấy phiên bản là trọng tâm của bạn, vì vậy ...

Một cách để duy trì các phiên bản là với các nhánh và hợp nhất (hoặc rebasing).

Vì vậy, bạn có:

master

sau đó bạn tạo một nhánh

v1

sau đó bạn thêm nhiều thay đổi vào

master(diff1)

sau đó bạn tạo một nhánh

v3

sau đó bạn thêm nhiều thay đổi vào

master(diff2)

Hiện nay:

Để cập nhật Phiên bản 2, bây giờ bạn làm

git checkout v2
git merge master  # for the changes you want to bring into version 2
# rebasing is also an option
# resolve any merge conflicts
# Done.

Để cập nhật phiên bản 3

git checkout v3
git merge master

Trên đây là để cập nhật bán buôn.

Có lẽ nhiều khả năng mặc dù bạn sẽ muốn chọn ra những thay đổi cụ thể cho việc đó

git cherry-pick

Tìm hiểu thêm về hái cherry tại http://git-scm.com/docs/git-cherry-pick

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.