Câu trả lời:
Bạn có thể sử dụng git revert <commit>…
cho tất cả n lần cam kết, sau đó đẩy như bình thường, giữ nguyên lịch sử.
Hoặc bạn có thể "quay trở lại" với git reset --hard HEAD~n
. Nếu bạn đang đẩy vào một kho lưu trữ công khai hoặc chia sẻ, bạn có thể phân tách và phá vỡ những công việc khác dựa trên nhánh ban đầu của bạn. Git sẽ ngăn bạn làm như vậy, nhưng bạn có thể sử dụng git push -f
để buộc cập nhật.
revert
sẽ khiến các nhánh tính năng của bạn được coi là "đã" hợp nhất. Đó là bởi vì các nhánh này thực sự đang được hợp nhất. Nhưng các thay đổi đã được hoàn nguyên. Giải pháp: Cherry-pick hoặc hoàn nguyên cam kết hoàn nguyên .
reset --hard
cũng khiến các nhánh tính năng được coi là đã được hợp nhất không? Giả định của tôi là nó sẽ không (nếu revert
có).
elmarco đúng ... đề xuất của anh ấy là tốt nhất cho kho lưu trữ chia sẻ / công khai (hoặc, ít nhất là các chi nhánh công khai). Nếu nó không được chia sẻ (hoặc bạn sẵn sàng làm phiền người khác), bạn cũng có thể đẩy một số giới thiệu cụ thể:
git push origin old_master:master
Hoặc, nếu có một cam kết SHA1 cụ thể (giả sử 1e4f99e ở dạng viết tắt), bạn muốn quay lại:
git push origin 1e4f99e:master
May mắn thay, tôi đã có thể sử dụng giải pháp của Pat Notz để loại bỏ hoàn toàn cam kết không mong muốn. Tuy nhiên, ban đầu tôi gặp lỗi
error: failed to push some refs to 'ssh://git@gitrepo.git'
To prevent you from losing history, non-fast-forward updates were rejected*
Nhưng thêm -f
tùy chọn force ( ) sẽ ghi đè lên lỗi này
git push -f origin 52e36b294e:master
Nếu bạn có quyền truy cập trực tiếp vào repo từ xa, bạn luôn có thể sử dụng:
git reset --soft <sha1>
Điều này hoạt động vì không có nỗ lực sửa đổi thư mục làm việc không tồn tại. Để biết thêm chi tiết, vui lòng xem câu trả lời gốc:
Làm cách nào để bỏ ghi chú lần cuối cùng trong kho lưu trữ git bare?
git reset --hard [sha1]
trong đó sha1 là định danh băm cam kết.