Bạn đang thấy một tính năng an toàn Git. Git từ chối cập nhật chi nhánh từ xa với chi nhánh của bạn, bởi vì cam kết đầu chi nhánh của bạn không phải là hậu duệ trực tiếp của cam kết đầu hiện tại của chi nhánh mà bạn đang đẩy tới.
Nếu đây không phải là trường hợp, thì hai người đẩy vào cùng một kho lưu trữ cùng một lúc sẽ không biết rằng có một cam kết mới xuất hiện cùng một lúc và bất cứ ai đẩy cuối cùng sẽ mất công việc của người đẩy trước mà không có một trong hai họ nhận ra điều này.
Nếu bạn biết rằng bạn là người duy nhất đang đẩy và bạn muốn đẩy một cam kết đã sửa đổi hoặc đẩy một cam kết quay trở lại chi nhánh, bạn có thể 'buộc' Git cập nhật chi nhánh từ xa bằng cách sử dụng công -f
tắc.
git push -f origin master
Ngay cả điều này có thể không hoạt động vì Git cho phép các kho lưu trữ từ xa từ chối các lần đẩy không nhanh chóng ở phía xa bằng cách sử dụng biến cấu hình receive.denynonfastforwards
. Nếu đây là trường hợp, lý do từ chối sẽ giống như thế này (lưu ý phần 'từ chối từ xa'):
! [remote rejected] master -> master (non-fast forward)
Để giải quyết vấn đề này, bạn cần phải thay đổi cấu hình của kho lưu trữ từ xa hoặc là một bản hack bẩn, bạn có thể xóa và tạo lại nhánh, do đó:
git push origin :master
git push origin master
Nói chung, tham số cuối cùng để git push
sử dụng định dạng <local_ref>:<remote_ref>
, trong đó local_ref
là tên của nhánh trên kho lưu trữ cục bộ và remote_ref
là tên của nhánh trên kho lưu trữ từ xa. Cặp lệnh này sử dụng hai tốc ký. :master
có một local localf có nghĩa là đẩy một nhánh null sang phía từ xa master
, tức là xóa nhánh từ xa. Tên nhánh không có :
nghĩa là đẩy nhánh cục bộ có tên đã cho sang nhánh từ xa có cùng tên. master
trong tình huống này là viết tắt của master:master
.