Đối với tất cả các mục đích thực tế, điều đầu tiên bạn nên lo lắng là THAY ĐỔI MẬT KHẨU CỦA BẠN! Không rõ câu hỏi của bạn cho dù kho git của bạn là hoàn toàn cục bộ hay bạn đã có một kho lưu trữ từ xa ở nơi khác chưa; nếu nó ở xa và không được bảo mật từ những người khác thì bạn có vấn đề. Nếu bất cứ ai đã sao chép kho lưu trữ đó trước khi bạn sửa lỗi này, họ sẽ có một bản sao mật khẩu của bạn trên máy cục bộ của họ và không có cách nào bạn có thể buộc họ cập nhật lên phiên bản "đã sửa" của bạn từ lịch sử. Điều an toàn duy nhất bạn có thể làm là thay đổi mật khẩu của mình thành một thứ khác ở mọi nơi bạn đã sử dụng nó.
Với cách đó, đây là cách khắc phục. GitHub đã trả lời chính xác câu hỏi đó dưới dạng Câu hỏi thường gặp :
Lưu ý cho người dùng Windows : sử dụng dấu ngoặc kép (") thay vì đơn trong lệnh này
git filter-branch --index-filter \
'git update-index --remove PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA' <introduction-revision-sha1>..HEAD
git push --force --verbose --dry-run
git push --force
Cập nhật 2019:
Đây là mã hiện tại từ FAQ:
git filter-branch --force --index-filter \
"git rm --cached --ignore-unmatch PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA" \
--prune-empty --tag-name-filter cat -- --all
git push --force --verbose --dry-run
git push --force
Hãy nhớ rằng một khi bạn đã đẩy mã này vào một kho lưu trữ từ xa như GitHub và những người khác đã sao chép kho lưu trữ từ xa đó, thì bây giờ bạn đang ở trong tình huống bạn đang viết lại lịch sử. Khi những người khác thử kéo xuống những thay đổi mới nhất của bạn sau đó, họ sẽ nhận được một thông báo cho biết rằng những thay đổi đó không thể được áp dụng vì đó không phải là một chuyển tiếp nhanh.
Để khắc phục điều này, họ sẽ phải xóa kho lưu trữ hiện tại của mình và sao chép lại hoặc làm theo hướng dẫn trong phần "TÌM KIẾM TỪ UPSTREAM REBASE" trong trang web git-rebase .
Mẹo : Thực thigit rebase --interactive
Trong tương lai, nếu bạn vô tình thực hiện một số thay đổi với thông tin nhạy cảm nhưng bạn nhận thấy trước khi đẩy vào kho lưu trữ từ xa, có một số cách khắc phục dễ dàng hơn. Nếu lần cam kết cuối cùng của bạn là lần thêm thông tin nhạy cảm, bạn chỉ cần xóa thông tin nhạy cảm, sau đó chạy:
git commit -a --amend
Điều đó sẽ sửa đổi cam kết trước đó với bất kỳ thay đổi mới nào bạn đã thực hiện, bao gồm toàn bộ xóa tệp được thực hiện với a git rm
. Nếu các thay đổi được quay lại trong lịch sử nhưng vẫn không được đẩy vào kho lưu trữ từ xa, bạn có thể thực hiện phản hồi tương tác:
git rebase -i origin/master
Điều đó mở ra một trình soạn thảo với các cam kết bạn đã thực hiện kể từ tổ tiên chung cuối cùng của bạn với kho lưu trữ từ xa. Thay đổi "chọn" thành "chỉnh sửa" trên bất kỳ dòng nào thể hiện cam kết với thông tin nhạy cảm, đồng thời lưu và thoát. Git sẽ duyệt qua các thay đổi và để bạn ở một nơi mà bạn có thể:
$EDITOR file-to-fix
git commit -a --amend
git rebase --continue
Đối với mỗi thay đổi với thông tin nhạy cảm. Cuối cùng, bạn sẽ trở lại chi nhánh của mình và bạn có thể đẩy những thay đổi mới một cách an toàn.