Vấn đềBạn đã hoàn thành công việc, commit các thay đổi và chạy lệnh git push. Thay vì thông báo thành công, GitHub từ chối mã nguồn của bạn với lỗi GH006. Điều này thường xảy ra khi bạn đang làm việc trong một dự án nhóm, nơi nhánh main hoặc master bị khóa chặt để ngăn mã nguồn không ổn định đưa lên môi trường production.
remote: error: GH006: Cập nhật nhánh bị bảo vệ thất bại, không được phép cập nhật nhánh được bảo vệ: refs/heads/main.
To github.com:username/repository.git
! [remote rejected] main -> main (hook nhánh bị bảo vệ đã từ chối)
error: thất bại khi push một số tham chiếu đến 'github.com:username/repository.git'
Tại sao lỗi này xảy raGitHub sử dụng Branch Protection Rules (Quy tắc bảo vệ nhánh) để giữ cho mã nguồn production luôn ổn định. Khi các quy tắc này được kích hoạt, các lệnh push trực tiếp sẽ bị chặn để tránh việc ghi đè vô ý hoặc lọt lỗi chưa được kiểm duyệt. Nếu kho lưu trữ của bạn bật tùy chọn 'Require a pull request before merging', GitHub sẽ từ chối mọi nỗ lực bỏ qua quy trình PR. Các nguyên nhân phổ biến bao gồm thiếu phê duyệt cần thiết (thường là 1 hoặc 2 người kiểm duyệt), kiểm tra trạng thái CI/CD thất bại, hoặc quy tắc 'Restrict pushes' giới hạn quyền truy cập cho một số lập trình viên cấp cao.
Cách khắc phục lỗi### Cách 1: Quy trình làm việc chuẩn (Pull Request)Đây là con đường an toàn nhất và là cách mà nhóm của bạn mong đợi. Thay vì ép mã nguồn vào main, hãy chuyển nó sang một nhánh tính năng (feature branch) mới và để quy trình PR xử lý phần còn lại.
- Chuyển các thay đổi hiện tại sang một nhánh mới:
git checkout -b feature/fix-ui-styling- Push nhánh mới lên máy chủ từ xa (remote):git push -u origin feature/fix-ui-styling- Tạo một Pull Request: Mở kho lưu trữ trên GitHub. Bạn sẽ thấy một thanh màu vàng gợi ý "Compare & pull request." Hãy nhấp vào đó, mô tả 2-3 thay đổi chính của bạn và nhấn submit.- Merge mã nguồn: Sau khi đồng nghiệp phê duyệt PR và các bài kiểm tra (test) vượt qua, hãy nhấp vào Merge pull request trên GitHub.- Đồng bộ hóa môi trường cục bộ của bạn:``` git checkout main git pull origin main
- Tìm quy tắc cho `main` và nhấp vào **Edit**.- Tìm ô tích **"Include administrators"**. Nếu ô này được chọn, ngay cả chủ sở hữu cũng bị chặn push. Hãy bỏ chọn nó để cho phép bản thân bỏ qua quy tắc.- Ngoài ra, bạn có thể bỏ chọn **"Require a pull request before merging"** nếu bạn muốn tắt hoàn toàn tính năng bảo vệ trong chốc lát.- Cuộn xuống dưới cùng, nhấp vào **Save changes** và thử push lại lần nữa.### Cách 3: Kiểm tra danh sách "Restrict Pushes"Một số tổ chức sử dụng danh sách trắng (whitelist) để kiểm soát ai có thể push. Nếu bạn là nhân viên mới, tên người dùng của bạn có thể chưa có trong danh sách đó. Hãy yêu cầu trưởng nhóm kiểm tra phần **Restrict pushes** trong cài đặt bảo vệ nhánh và thêm tên người dùng GitHub hoặc tên nhóm của bạn vào.
## Xác minhChạy lệnh push của bạn một lần nữa để đảm bảo mọi thứ đã được giải quyết:
git push origin main
Một lệnh push thành công sẽ trông như thế này:
To github.com:username/repository.git d4e5f6g..h7i8j9k main -> main
## Mẹo phòng ngừa- **Áp dụng tư duy "Ưu tiên tạo nhánh":** Chạy lệnh `git checkout -b [tên-nhánh]` trước khi bạn viết bất kỳ dòng mã nào.- **Sử dụng Local Hooks:** Tạo một script `pre-push` trong thư mục `.git/hooks`. Script này có thể kiểm tra xem nhánh hiện tại có phải là `main` không và chặn lệnh push trước khi nó rời khỏi máy tính của bạn.- **PR nháp (Draft PRs):** Nếu bạn có hơn 10 commit và muốn nhận phản hồi sớm mà không cần kích hoạt quy trình xem xét cuối cùng, hãy sử dụng chế độ "Draft" của GitHub.

