Main Branch (trước đây là Master) là nhánh chính của Git chứa mã sản xuất ổn định sẵn sàng để triển khai. Mỗi commit trong main tương ứng với một phiên bản phát hành của dự án và bản thân nhánh được bảo vệ khỏi các thay đổi trực tiếp và đóng vai trò là nguồn sự thật duy nhất cho toàn bộ nhóm. Theo GitHub, 2020, kể từ tháng 10 năm 2020, nhánh mới mặc định được gọi là main thay vì master.
Những điểm chính
Main Branch (hoặc Master — tùy thuộc vào cài đặt kho lưu trữ) là nhánh mặc định được tạo khi khởi tạo bất kỳ kho lưu trữ Git nào. Đây là nhánh chính của dự án và chứa mã sẵn sàng để triển khai vào sản xuất.
Không giống như develop, nơi công việc hàng ngày với các tính năng mới diễn ra sôi nổi, main là tủ trưng bày của dự án. Mỗi phiên bản mã trong main đã trải qua một chu trình đầy đủ: phát triển trong nhánh feature, tích hợp vào develop, chuẩn bị phát hành trong nhánh release và kiểm thử cuối cùng. Chỉ sau đó các thay đổi mới đến được main.
Nguyên tắc chính: main phải luôn ổn định. Nếu phát hiện lỗi trong main, điều đó có nghĩa là cần phát hành hotfix khẩn cấp ngoài lượt. Do đó, trong các dự án chuyên nghiệp, main được bảo vệ khỏi các thay đổi vô tình bằng các quy tắc bảo vệ nhánh.
Theo Git Book, main không phải là nhánh đặc biệt với các thuộc tính độc nhất, mà là một tham chiếu thông thường đến một commit được coi là chính theo quy ước. Git không phân biệt giữa main và bất kỳ nhánh nào khác ở cấp hệ thống.
Trong lịch sử, nhánh mặc định trong Git được gọi là master. Vào tháng 6 năm 2020, phong trào Black Lives Matter đã thu hút sự chú ý đến các thuật ngữ master và slave trong ngành CNTT. GitHub đã công bố quá trình chuyển đổi sang thuật ngữ main cho nhánh mặc định.
Kể từ tháng 10 năm 2020, tất cả các kho lưu trữ mới trên GitHub được tạo với nhánh main. GitLab và Bitbucket cũng đã triển khai hỗ trợ main làm tên mặc định. Git 2.28 (tháng 7 năm 2020) đã thêm tùy chọn init.defaultBranch để cấu hình tên nhánh mặc định.
Về mặt kỹ thuật, việc đổi tên nhánh hiện có từ master sang main là một thao tác đơn giản. Thách thức chính là cập nhật tất cả các tham chiếu trong cấu hình CI/CD, tài liệu và kho lưu trữ cục bộ của các nhà phát triển.
Để đổi tên nhánh trong kho lưu trữ hiện có, hãy chạy:
# Đổi tên cục bộ master thành main
git branch -m master main
# Cập nhật kho lưu trữ từ xa
git push -u origin main
# Xóa master cũ trên máy chủ
git push origin --delete master
# Cập nhật HEAD trên máy chủ
# (qua giao diện web GitHub: Settings → Branches → Default branch)
Git Flow và GitHub Flow định nghĩa vai trò của nhánh main khác nhau. Việc lựa chọn mô hình phụ thuộc vào quy mô nhóm, tần suất phát hành và yêu cầu về độ ổn định mã.
| Đặc điểm | Git Flow | GitHub Flow |
|---|---|---|
| Vai trò của main | Chỉ phiên bản phát hành | Nhánh phát triển trung tâm |
| Nhánh bổ sung | Develop, Release, Hotfix | Chỉ nhánh feature |
| Tần suất phát hành | 1-4 tuần một lần | Nhiều lần mỗi ngày |
| Độ phức tạp | Cao | Thấp |
| Khi nào chọn | Ứng dụng di động có chu kỳ phát hành | Dịch vụ web triển khai liên tục |
Đối với phát triển di động, Git Flow là tiêu chuẩn, vì việc xuất bản ứng dụng lên App Store và Google Play có chu kỳ phát hành cố định. GitHub Flow phù hợp hơn cho các dự án web có thể triển khai nhiều lần mỗi ngày.
Trong GitHub Flow, không có nhánh develop. Tất cả các nhánh feature được tạo trực tiếp từ main và sau khi hoàn thành được hợp nhất lại qua Pull Request. Mỗi lần hợp nhất vào main sẽ tự động kích hoạt triển khai vào sản xuất. Mô hình này đòi hỏi mức độ tự động hóa kiểm thử cao và kỷ luật nhóm.
Trong GitHub Flow, không có nhánh develop. Tất cả các nhánh feature được tạo trực tiếp từ main và sau khi hoàn thành được hợp nhất lại qua Pull Request. Mỗi lần hợp nhất vào main sẽ tự động kích hoạt triển khai vào sản xuất. Mô hình này đòi hỏi mức độ tự động hóa kiểm thử cao và kỷ luật nhóm.
Bảo vệ nhánh cho main là cài đặt bắt buộc trong bất kỳ dự án thương mại nào. Nếu không có nó, một push vô tình có thể gửi mã chưa hoàn thiện vào sản xuất hoặc phá vỡ ứng dụng đang hoạt động cho tất cả người dùng.
Cấu hình tất cả sáu quy tắc là tiêu chuẩn cho các dự án di động với 10.000+ người dùng. Đối với các dự án nhỏ, ba quy tắc đầu tiên là đủ.
Mức độ bảo vệ của main phụ thuộc vào quy mô dự án. Một startup có thể tồn tại với bảo vệ tối thiểu, trong khi ứng dụng doanh nghiệp yêu cầu các hạn chế tối đa.
Gắn thẻ là thực hành tạo các tham chiếu có tên đến các commit cụ thể trong main. Mỗi thẻ tương ứng với một phiên bản ứng dụng được phát hành vào sản xuất. Điều này cho phép chuyển nhanh đến bất kỳ bản phát hành nào trước đó để gỡ lỗi hoặc vá lỗi.
Tiêu chuẩn đặt tên thẻ trong phát triển di động là SemVer (Phiên bản ngữ nghĩa): v1.2.3, trong đó số đầu tiên là phiên bản chính (thay đổi phá vỡ), số thứ hai là phiên bản phụ (tính năng mới) và số thứ ba là bản vá (sửa lỗi).
Một thẻ được tạo sau khi hợp nhất nhánh release vào main. Commit này sau đó được xây dựng trong CI/CD, ký và gửi đến cửa hàng ứng dụng. Nếu phát hiện lỗi trong thẻ, một nhánh hotfix được tạo từ thẻ đó.
# Tạo thẻ phát hành có chú thích
git tag -a v2.4.1 -m "Release version 2.4.1"
# Gửi thẻ lên máy chủ
git push origin v2.4.1
# Xem tất cả thẻ trong kho lưu trữ
git tag -l "v2.*"
# Tạo nhánh hotfix từ một thẻ cụ thể
git checkout -b hotfix/crash-fix v2.4.1
Hiểu hệ thống phân cấp nhánh trong Git Flow là nền tảng để tổ chức phát triển cộng tác đúng cách. Mỗi loại nhánh có nguồn gốc, mục đích và quy tắc hợp nhất riêng.
Quy tắc quan trọng: feature không bao giờ được hợp nhất trực tiếp vào main. feature → develop → release → main là chuỗi hợp nhất chính xác. Vi phạm quy tắc này làm mất đi ý nghĩa của toàn bộ mô hình Git Flow.
Xem xét một tình huống: nhóm đã hoàn tất chuẩn bị phát hành v2.5.0. Nhánh release đã được đánh giá và sẵn sàng hợp nhất vào main. Sau khi hợp nhất, một thẻ được tạo và bản phát hành được công bố.
# Chuyển sang main và cập nhật
git checkout main
git pull origin main
# Hợp nhất nhánh release đã xác minh
git merge --no-ff release/2.5.0
# Tạo thẻ phát hành
git tag -a v2.5.0 -m "Release 2.5.0 - Payment integration"
# Gửi main và thẻ lên máy chủ
git push origin main --tags
Cờ --no-ff (không fast-forward) đảm bảo tạo commit hợp nhất, ngay cả khi việc hợp nhất có thể được thực hiện bằng cách chỉ di chuyển con trỏ. Điều này bảo tồn thông tin rằng các thay đổi đến từ nhánh release, giúp phân tích lịch sử dễ dàng hơn.
Nếu phát hiện lỗi nghiêm trọng trong sản xuất, quy trình sẽ khác với bản phát hành thông thường. Một hotfix được tạo từ main và sau khi sửa lỗi, nó được hợp nhất vào cả main và develop.
Nếu phát hiện lỗi nghiêm trọng trong sản xuất, quy trình sẽ khác với bản phát hành thông thường. Một hotfix được tạo từ main và sau khi sửa lỗi, nó được hợp nhất vào cả main và develop.
# Tạo nhánh hotfix từ main
git checkout main
git checkout -b hotfix/2.5.1-crash-fix
# Sửa lỗi và commit
git add src/fix/
git commit -m "Fix crash on login screen"
# Hợp nhất hotfix trở lại main
git checkout main
git merge --no-ff hotfix/2.5.1-crash-fix
git tag -a v2.5.1 -m "Hotfix 2.5.1"
git push origin main --tags
# Hợp nhất hotfix vào develop
git checkout develop
git merge --no-ff hotfix/2.5.1-crash-fix
git push origin develop
# Xóa nhánh hotfix
git branch -d hotfix/2.5.1-crash-fix
Câu hỏi thường gặp
Về mặt kỹ thuật — có, nó là một tham chiếu thông thường đến một commit. Nhưng thực tế — không, vì main là nhánh mặc định và hầu hết các nền tảng không cho phép xóa nhánh được đặt làm nhánh mặc định. Thay vì xóa, hãy tạo một nhánh mặc định mới và sau đó xóa nhánh cũ.
Nếu lỗi không nghiêm trọng, hãy sử dụng quy trình thông thường: tạo nhánh feature từ develop, sửa lỗi, thực hiện đánh giá mã và chờ chu kỳ phát hành tiếp theo. Hotfix chỉ được sử dụng cho các lỗi nghiêm trọng chặn công việc của người dùng.
main là nhánh cục bộ trên máy tính của bạn. origin/main là bộ nhớ đệm cục bộ trạng thái của nhánh từ xa trên máy chủ. Lệnh git fetch cập nhật origin/main, trong khi git pull hợp nhất ngay lập tức các thay đổi vào main cục bộ của bạn.
Sử dụng git clone để sao chép toàn bộ kho lưu trữ vào thư mục mới. Nếu cần thay đổi URL từ xa, hãy chạy git remote set-url origin. Để thay đổi thư mục làm việc mà không sao chép kho lưu trữ, hãy sử dụng git worktree add.
Có, ngay cả trong nhóm hai người, việc bảo vệ main là hợp lý. Một push vô tình với lệnh sai có thể ghi đè lịch sử. Bảo vệ tối thiểu — cấm push trực tiếp và yêu cầu PR — mất 5 phút để thiết lập và ngăn chặn hàng giờ khôi phục dữ liệu.
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