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à develop
và master
. master
giữ bản phát hành mới nhất của bạn và develop
giữ bản sao phát triển "ổn định" mới nhất của bạn.
Người đóng góp tạo feature
các nhánh (có tiền tố feature/
theo quy ước) tắt develop
:
$ git checkout -b feature/my-feature develop
và hotfix
cá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 feature
nhá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 hotfix
nhánh, chúng hợp nhất lại thành cả hai master
và develop
vì 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 release
nhá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 release
nhá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 develop
trong khi bạn sửa lỗi và thêm các release
chi 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 release
chi nhánh thành cả hai master
và develop
(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 release
nhánh hoặc một hotfix
nhá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-ff
tù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 describe
và 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-ff
và 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 đó.