Giả sử rằng chi nhánh của bạn được gọi master
cả ở đây và từ xa, và điều khiển từ xa của bạn được gọi là origin
bạn có thể làm:
git reset --hard <commit-hash>
git push -f origin master
Tuy nhiên, bạn nên tránh làm điều này nếu bất kỳ ai khác đang làm việc với kho lưu trữ từ xa của bạn và đã kéo các thay đổi của bạn. Trong trường hợp đó, sẽ tốt hơn là hoàn nguyên các cam kết mà bạn không muốn, sau đó đẩy như bình thường.
Cập nhật: bạn đã giải thích bên dưới rằng những người khác đã thực hiện các thay đổi mà bạn đã đẩy, vì vậy tốt hơn là tạo một cam kết mới hoàn nguyên tất cả các thay đổi đó . Có một lời giải thích hay về các lựa chọn của bạn để thực hiện điều này trong câu trả lời này từ Jakub Narębski . Cái nào thuận tiện nhất phụ thuộc vào số lần xác nhận bạn muốn hoàn nguyên và phương thức nào có ý nghĩa nhất đối với bạn.
Vì từ câu hỏi của bạn, rõ ràng là bạn đã sử dụng git reset --hard
để đặt lại master
chi nhánh của mình , bạn có thể cần phải bắt đầu bằng cách sử dụng git reset --hard ORIG_HEAD
để di chuyển chi nhánh của mình trở lại vị trí trước đó. (Như mọi khi git reset --hard
, đảm bảo rằng git status
sạch sẽ, rằng bạn đang ở đúng nhánh và bạn biết đó git reflog
là một công cụ để phục hồi các cam kết bị mất rõ ràng.) Bạn cũng nên kiểm tra ORIG_HEAD
các điểm đó với đúng cam kết, với git show ORIG_HEAD
.
Xử lý sự cố:
Nếu bạn nhận được một thông báo như " ! [Từ chối từ xa] a60f7d85 -> master (móc nhận trước bị từ chối) "
sau đó bạn phải cho phép viết lại lịch sử chi nhánh cho chi nhánh cụ thể. Trong BitBucket chẳng hạn, nó cho biết "Viết lại lịch sử chi nhánh không được phép". Có một hộp kiểm có tên Allow rewriting branch history
mà bạn phải kiểm tra.
origin/master
chưa bị kéo và đẩy sang? Thay đổi lịch sử của kho lưu trữ công khai (tức là không cục bộ) là điều bạn muốn tránh mọi lúc.