Main và Master Branch trong Git: nó là gì và tại sao cần nhánh chính

Tác giả: IT Sectr Đã đăng: 2026-05-10 Thời gian đọc: 8 phút

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 / Master Branch — nhánh ổn định với mã sản xuất, mỗi commit là một phiên bản phát hành.
  • Bảo vệ khỏi thay đổi trực tiếp — push trực tiếp vào main bị cấm, mọi thay đổi đều qua nhánh release hoặc hotfix.
  • Quá trình chuyển đổi từ master sang main diễn ra vào năm 2020 để có thuật ngữ bao trùm trên tất cả các nền tảng Git.
  • Git Flow và GitHub Flow sử dụng main khác nhau: trong Git Flow chỉ dành cho phát hành, trong GitHub Flow là nhánh trung tâm.
  • Thẻ phiên bản trên mỗi commit phát hành trong main cho phép dễ dàng quay lại bất kỳ phiên bản nào trước đó.

Main / Master Branch trong Git là gì

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.

Chuyển đổi từ master sang main

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:

bash
# Đổ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)

Vai trò của main trong Git Flow và GitHub Flow

Git FlowGitHub 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ểmGit FlowGitHub Flow
Vai trò của mainChỉ phiên bản phát hànhNhánh phát triển trung tâm
Nhánh bổ sungDevelop, Release, HotfixChỉ nhánh feature
Tần suất phát hành1-4 tuần một lầnNhiều lần mỗi ngày
Độ phức tạpCaoThấp
Khi nào chọnỨng dụng di động có chu kỳ phát hànhDị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.

GitHub Flow — phương pháp đơn giản hóa

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 main

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.

  • Require pull request — push trực tiếp vào main bị cấm. Mọi thay đổi qua PR có đánh giá.
  • Require approvals — tối thiểu 2 phê duyệt để hợp nhất vào main (phòng trường hợp người đánh giá bỏ sót).
  • Require status checks — tất cả kiểm tra CI/CD phải thành công trước khi hợp nhất.
  • Require up-to-date — PR phải dựa trên commit main mới nhất.
  • Include administrators — bảo vệ áp dụng ngay cả với chủ sở hữu kho lưu trữ.
  • Require signed commits — tất cả commit trong main phải được ký bằng khóa GPG.

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à đủ.

So sánh mức độ bảo vệ cho các loại dự án khác nhau

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.

Phát hành và thẻ trong main

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ẻ đó.

bash
# 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

Hệ thống phân cấp nhánh Git Flow

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.

  • Main (Cấp 1) — nhánh gốc, chỉ chứa phiên bản phát hành. Được tạo khi khởi tạo kho lưu trữ.
  • Develop (Cấp 2) — được tạo từ main khi bắt đầu dự án. Chứa mã tích hợp của tất cả các tính năng.
  • Feature (Cấp 3) — được tạo từ develop. Phát triển riêng biệt các tính năng riêng lẻ.
  • Release (Cấp 2) — được tạo từ develop. Chuẩn bị một bản phát hành cụ thể để ra mắt.
  • Hotfix (Cấp 2) — được tạo từ main. Sửa lỗi khẩn cấp các lỗi sản xuất nghiêm trọ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.

Ví dụ lệnh làm việc với main

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ố.

bash
# 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.

Làm việc với hotfix qua main

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.

bash
# 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

Có thể xóa nhánh main không?

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ũ.

Làm thế nào để sửa lỗi trong main mà không cần hotfix?

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.

Sự khác biệt giữa main và origin/main là gì?

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.

Làm thế nào để di chuyển main sang thư mục khác?

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ó cần bảo vệ main nếu nhóm nhỏ không?

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

  • Main / Master Branch — nhánh chính của Git chứa mã sản xuất ổn định, mỗi commit là một phiên bản phát hành.
  • Chuyển đổi từ master sang main đã trở thành tiêu chuẩn ngành từ năm 2020, được hỗ trợ bởi tất cả các nền tảng Git lớn.
  • Git Flow sử dụng main chỉ cho phát hành, trong khi GitHub Flow biến nó thành nhánh trung tâm với triển khai liên tục.
  • Bảo vệ main bao gồm 6 quy tắc: PR, phê duyệt, kiểm tra CI/CD, cập nhật, bao gồm quản trị viên, commit đã ký.
  • Gắn thẻ mỗi bản phát hành trong main bằng SemVer đảm bảo truy cập nhanh vào bất kỳ phiên bản ứng dụng nào.
  • Nhánh hotfix được tạo từ main để sửa lỗi khẩn cấp và được hợp nhất vào cả main và develop.
  • Khuyến nghị: luôn sử dụng --no-ff khi hợp nhất vào main và cấu hình quy tắc bảo vệ nhánh trước commit đầu tiên vào dự án.

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.

Thảo luận dự án

Đọc thêm