Feature Branch — là một kỹ thuật rẽ nhánh trong Git, trong đó mỗi tính năng mới được phát triển trong một nhánh riêng biệt, cách ly khỏi mã chính. Điều này cho phép nhiều nhà phát triển làm việc đồng thời trên các tác vụ khác nhau mà không có nguy cơ làm hỏng phiên bản ổn định của dự án. Theo Atlassian, 2024, Feature Branch là một yếu tố quan trọng của Git Flow và được sử dụng trong hầu hết các dự án thương mại.
Những điểm chính
feature/tên-chức-năng trong Git Flow tiêu chuẩn.Feature Branch (nhánh tính năng) là một nhánh tạm thời trong Git được tạo từ develop để phát triển một chức năng cụ thể. Không giống như các nhánh tồn tại lâu dài main và develop, nhánh feature tồn tại trong một thời gian giới hạn — từ vài giờ đến vài tuần.
Mục đích chính của feature branch là cách ly các thay đổi liên quan đến một tác vụ khỏi phần mã còn lại. Nhà phát triển có thể thử nghiệm, thực hiện nhiều commit và thậm chí phá mã trong nhánh riêng của mình mà không ảnh hưởng đến công việc của các thành viên khác trong nhóm.
Sau khi hoàn thành phát triển, nhánh feature được hợp nhất trở lại develop thông qua Pull Request với đánh giá mã bắt buộc. Sau khi hợp nhất, nhánh thường bị xóa để giữ kho chứa sạch sẽ.
Theo Vincent Driessen, 2010, mô hình Git Flow với các nhánh feature đã trở thành tiêu chuẩn ngành nhờ sự phân chia trách nhiệm rõ ràng giữa các loại nhánh khác nhau.
Quy trình làm việc với feature branch bao gồm một chuỗi các bước mà nhà phát triển thực hiện cho mỗi tính năng mới. Quy trình này giảm thiểu xung đột hợp nhất và đảm bảo kiểm soát chất lượng mã.
Đồng bộ hóa định kỳ với develop là cực kỳ quan trọng. Nhánh feature tồn tại càng lâu mà không hợp nhất các thay đổi từ develop thì khả năng xảy ra xung đột khi hợp nhất cuối cùng càng cao.
| Tần suất đồng bộ | Rủi ro xung đột | Thuận tiện phát triển |
|---|---|---|
| Hàng ngày | Thấp | Yêu cầu rebase hoặc merge thường xuyên |
| Hàng tuần | Trung bình | Nhịp độ thoải mái, xung đột vừa phải |
| Hàng tháng | Cao | Rủi ro giải quyết xung đột phức tạp |
| Không bao giờ | Nghiêm trọng | Việc hợp nhất có thể không thực hiện được nếu không mất dữ liệu |
Đặt tên nhánh là một phần quan trọng của kỷ luật nhóm. Một tiêu chuẩn đặt tên thống nhất cho phép nhanh chóng xác định tác vụ nào đang được thực hiện và ai đang thực hiện nó.
feature/added-auth-module.feature/PROJ-42-add-login.feature/feat/analytics-dashboard.Sử dụng ID tác vụ từ JIRA, Trello hoặc hệ thống khác là một thực hành tốt nhất. Nó tự động liên kết mã với tác vụ và đơn giản hóa việc tìm kiếm nhánh qua git log.
Pull Request (hoặc Merge Request trong GitLab) là một yêu cầu hợp nhất nhánh feature vào develop. PR không chỉ là một thao tác kỹ thuật, mà là một quy trình đánh giá mã nhóm giúp cải thiện chất lượng mã và lan truyền kiến thức trong nhóm.
Một PR tốt chứa tiêu đề với mô tả ngắn gọn về tác vụ, liên kết đến ticket và mô tả các thay đổi. Nhà phát triển nên chỉ ra những gì đã được thực hiện, những tệp nào đã được thay đổi và liệu có rủi ro tiềm ẩn cho các phần khác của dự án hay không.
Nhóm xem xét mã trong PR, để lại nhận xét, yêu cầu thay đổi (change requests) và phê duyệt hợp nhất (approve). Sau khi phê duyệt, merge hoặc squash merge được thực hiện.
Thời gian đánh giá PR trung bình trong phát triển di động là từ 4 đến 24 giờ. Thư viện Danger tự động hóa một phần kiểm tra, chạy linters và kiểm thử trực tiếp trong PR.
Sau khi PR được phê duyệt, nhánh feature có thể được hợp nhất vào develop theo nhiều cách khác nhau. Việc lựa chọn chiến lược hợp nhất ảnh hưởng đến lịch sử commit và khả năng hoàn tác các thay đổi.
Đối với các dự án di động có bản phát hành thường xuyên, squash merge thường được sử dụng nhất: nó cung cấp lịch sử sạch sẽ trong develop, trong khi chi tiết phát triển vẫn nằm trong mô tả PR và tác vụ tracker.
Ngay cả những nhà phát triển giàu kinh nghiệm cũng mắc lỗi khi làm việc với các nhánh feature. Biết được các vấn đề điển hình giúp tránh mất thời gian và dữ liệu.
Cách tốt nhất để tránh những vấn đề này là thống nhất các quy tắc làm việc khi bắt đầu dự án và sử dụng các kiểm tra tự động trong đường ống CI/CD.
Hãy xem xét một kịch bản thực tế: một nhà phát triển bắt đầu một tính năng xác thực mới trong ứng dụng di động. Anh ta tạo một nhánh feature, làm việc trên mã và hoàn thành tác vụ bằng Pull Request.
# Cập nhật develop và tạo nhánh feature
git checkout develop
git pull origin develop
git checkout -b feature/add-login-screen
# Làm việc trên tính năng: commits
git add src/ui/login/
git commit -m "Add login screen layout"
# Đẩy nhánh feature lên máy chủ
git push origin feature/add-login-screen
# Đồng bộ hóa với develop (rebase)
git fetch origin develop
git rebase origin/develop
# Sau khi PR được phê duyệt: cập nhật develop cục bộ và xóa nhánh
git checkout develop
git pull origin develop
git branch -d feature/add-login-screen
Lệnh git branch -d xóa nhánh chỉ sau khi các thay đổi của nó đã được hợp nhất hoàn toàn. Nếu nhánh chưa được hợp nhất, Git sẽ đề xuất sử dụng git branch -D để xóa强制 — hãy sử dụng cờ này một cách thận trọng.
Đường ống CI/CD nên chạy cho mỗi nhánh feature trước khi tạo PR. Điều này cho phép phát hiện vấn đề ở giai đoạn sớm, trước khi mã đến được đánh giá của các nhà phát triển khác.
# GitHub Actions để kiểm tra nhánh feature
name: Feature Branch CI
on:
push:
branches:
- 'feature/**'
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run tests
run: ./gradlew test
- name: Lint check
run: ./gradlew lint
Đường ống kiểm tra rằng mã biên dịch được, kiểm thử đạt yêu cầu và phong cách mã tuân thủ các tiêu chuẩn của nhóm. Chỉ sau khi vượt qua tất cả các kiểm tra mới có thể tạo Pull Request.
Câu hỏi thường gặp
Có, đó là thực hành tiêu chuẩn. Mỗi nhà phát triển có thể làm việc trong nhánh feature riêng của mình và tất cả đều đồng bộ hóa với develop độc lập. Quy tắc chính là một nhánh cho một tác vụ để tránh các phụ thuộc chéo trong mã.
Thực hiện git rebase origin/develop trên nhánh feature của bạn. Nếu phát sinh xung đột — hãy giải quyết từng cái một, các commit sẽ được viết lại trên trạng thái mới nhất của develop. Sau rebase, bạn sẽ cần git push --force để cập nhật nhánh từ xa.
Nếu tác vụ bị hủy, bạn có thể xóa nhánh feature. Sử dụng git branch -d feature/name cho nhánh cục bộ và git push origin --delete feature/name cho nhánh từ xa. Tất cả các thay đổi chưa commit sẽ bị mất.
Về cơ bản là giống nhau. Các nhóm khác nhau sử dụng các tiền tố khác nhau: feature/, task/, feat/. Không có sự khác biệt trong cơ chế Git — tất cả đều là các nhánh tạm thời được tạo từ develop để phát triển biệt lập.
Có, đó là thực hành bắt buộc. Các nhánh sau khi hợp nhất làm lộn xộn danh sách tham chiếu và có thể gây nhầm lẫn. Hầu hết các nền tảng (GitHub, GitLab) đề xuất xóa nhánh ngay sau khi merge PR, và các nhánh cục bộ được xóa bằng lệnh git branch -d.
Tổng kết
Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay
IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.
Đọc thêm