Thay đổi lịch sử
Nếu đó là cam kết gần đây nhất, bạn chỉ cần làm điều này:
git commit --amend
Thao tác này sẽ hiển thị trình chỉnh sửa với thông báo cam kết cuối cùng và cho phép bạn chỉnh sửa tin nhắn. (Bạn có thể sử dụng -m
nếu bạn muốn xóa sạch tin nhắn cũ và sử dụng tin nhắn mới.)
Đẩy
Và sau đó khi bạn đẩy, làm điều này:
git push --force-with-lease <repository> <branch>
Hoặc bạn có thể sử dụng "+":
git push <repository> +<branch>
Hoặc bạn có thể sử dụng --force
:
git push --force <repository> <branch>
Hãy cẩn thận khi sử dụng các lệnh này.
Nếu ai đó đẩy các thay đổi vào cùng một chi nhánh, có lẽ bạn muốn tránh phá hủy những thay đổi đó. Các--force-with-lease
tùy chọn là an toàn nhất, bởi vì nó sẽ hủy bỏ nếu có bất kỳ thay đổi ở thượng nguồn (
Nếu bạn không chỉ định chi nhánh rõ ràng, Git sẽ sử dụng cài đặt đẩy mặc định. Nếu cài đặt đẩy mặc định của bạn là "khớp", thì bạn có thể hủy các thay đổi trên một số nhánh cùng một lúc.
Kéo / lấy sau đó
Bất cứ ai đã kéo bây giờ sẽ nhận được thông báo lỗi và họ sẽ cần cập nhật (giả sử họ không thực hiện bất kỳ thay đổi nào) bằng cách thực hiện một cái gì đó như thế này:
git fetch origin
git reset --hard origin/master # Loses local commits
Cẩn thận khi sử dụng reset --hard
. Nếu bạn có thay đổi cho chi nhánh, những thay đổi đó sẽ bị hủy.
Một lưu ý về sửa đổi lịch sử
Dữ liệu bị hủy thực sự chỉ là thông điệp cam kết cũ, nhưng --force
không biết điều đó và cũng sẽ vui vẻ xóa các dữ liệu khác. Vì vậy, hãy nghĩ đến --force
"Tôi muốn hủy dữ liệu và tôi biết chắc chắn dữ liệu nào đang bị hủy." Nhưng khi dữ liệu bị hủy được cam kết, bạn thường có thể khôi phục các xác nhận cũ từ reflog, dữ liệu thực sự mồ côi thay vì bị hủy (mặc dù các cam kết mồ côi bị xóa theo định kỳ).
Nếu bạn không nghĩ mình đang hủy dữ liệu, thì hãy tránh xa --force
... những điều tồi tệ có thể xảy ra .
Đây là lý do tại sao --force-with-lease
có phần an toàn hơn.