LƯU Ý: Câu trả lời này thay đổi SHA1, vì vậy hãy cẩn thận khi sử dụng nó trên một nhánh đã được đẩy. Nếu bạn chỉ muốn sửa lỗi chính tả của một tên hoặc cập nhật một email cũ, git cho phép bạn làm điều này mà không cần viết lại lịch sử bằng cách sử dụng .mailmap
. Xem câu trả lời khác của tôi .
Sử dụng Rebase tương tác
Bạn có thể làm
git rebase -i -p <some HEAD before all of your bad commits>
Sau đó đánh dấu tất cả các cam kết xấu của bạn là "chỉnh sửa" trong tệp rebase. Nếu bạn cũng muốn thay đổi cam kết đầu tiên của mình, bạn phải thêm thủ công dưới dạng dòng đầu tiên trong tệp rebase (theo định dạng của các dòng khác). Sau đó, khi git yêu cầu bạn sửa đổi từng cam kết, hãy làm
git commit --amend --author "New Author Name <email@address.com>"
chỉnh sửa hoặc chỉ đóng trình chỉnh sửa mở ra, sau đó làm
git rebase --continue
để tiếp tục cuộc nổi loạn.
Bạn có thể bỏ qua việc mở trình soạn thảo hoàn toàn ở đây bằng cách nối thêm --no-edit
để lệnh sẽ là:
git commit --amend --author "New Author Name <email@address.com>" --no-edit && \
git rebase --continue
Cam kết duy nhất
Như một số người bình luận đã lưu ý, nếu bạn chỉ muốn thay đổi cam kết gần đây nhất, lệnh rebase là không cần thiết. Cứ làm đi
git commit --amend --author "New Author Name <email@address.com>"
Điều này sẽ thay đổi tác giả thành tên được chỉ định, nhưng committer sẽ được đặt thành người dùng được cấu hình của bạn trong git config user.name
và git config user.email
. Nếu bạn muốn đặt committer thành thứ gì đó bạn chỉ định, điều này sẽ đặt cả tác giả và committer:
git -c user.name="New Author Name" -c user.email=email@address.com commit --amend --reset-author
Lưu ý về Cam kết hợp nhất
Có một lỗ hổng nhỏ trong phản ứng ban đầu của tôi. Nếu có bất kỳ cam kết hợp nhất nào giữa hiện tại HEAD
và của bạn <some HEAD before all your bad commits>
, thì git rebase
sẽ làm phẳng chúng (và nhân tiện, nếu bạn sử dụng các yêu cầu kéo GitHub, sẽ có một tấn cam kết hợp nhất trong lịch sử của bạn). Điều này rất thường có thể dẫn đến lịch sử rất khác nhau (vì các thay đổi trùng lặp có thể bị "loại bỏ") và trong trường hợp xấu nhất, nó có thể dẫn đến git rebase
yêu cầu bạn giải quyết xung đột hợp nhất khó khăn (có thể đã được giải quyết trong các cam kết hợp nhất). Giải pháp là sử dụng -p
cờ để git rebase
bảo tồn cấu trúc hợp nhất của lịch sử của bạn. Trang web git rebase
cảnh báo rằng việc sử dụng -p
và -i
có thể dẫn đến các vấn đề, nhưng trongBUGS
phần có nội dung "Chỉnh sửa cam kết và viết lại thông điệp cam kết của họ sẽ hoạt động tốt."
Tôi đã thêm vào -p
lệnh trên. Đối với trường hợp bạn chỉ thay đổi cam kết gần đây nhất, đây không phải là vấn đề.