Trong hầu hết các trường hợp, có.
Tùy thuộc vào trạng thái kho lưu trữ của bạn khi bạn chạy lệnh, các hiệu ứng git reset --hard
có thể từ tầm thường đến hoàn tác, về cơ bản là không thể.
Dưới đây tôi đã liệt kê một loạt các kịch bản có thể khác nhau và cách bạn có thể phục hồi từ chúng.
Tất cả các thay đổi của tôi đã được cam kết, nhưng bây giờ các cam kết đã biến mất!
Tình huống này thường xảy ra khi bạn chạy git reset
với một đối số, như trong git reset --hard HEAD~
. Đừng lo lắng, điều này rất dễ để phục hồi!
Nếu bạn vừa chạy git reset
và chưa làm gì khác kể từ đó, bạn có thể quay lại nơi bạn đang ở với chiếc áo lót này:
git reset --hard @{1}
Điều này đặt lại chi nhánh hiện tại của bạn bất kể trạng thái trước khi nó được sửa đổi lần cuối (trong trường hợp của bạn, sửa đổi gần đây nhất cho chi nhánh sẽ là thiết lập lại cứng mà bạn đang cố gắng hoàn tác).
Tuy nhiên, nếu bạn đã thực hiện các sửa đổi khác cho chi nhánh của mình kể từ khi đặt lại, thì một lớp lót ở trên sẽ không hoạt động. Thay vào đó, bạn nên chạy để xem danh sách tất cả các thay đổi gần đây được thực hiện cho chi nhánh của bạn (bao gồm cả đặt lại). Danh sách đó sẽ trông giống như thế này:git reflog
<branchname>
7c169bd master@{0}: reset: moving to HEAD~
3ae5027 master@{1}: commit: Changed file2
7c169bd master@{2}: commit: Some change
5eb37ca master@{3}: commit (initial): Initial commit
Tìm hoạt động trong danh sách này mà bạn muốn "hoàn tác". Trong ví dụ trên, nó sẽ là dòng đầu tiên, dòng có nội dung "thiết lập lại: chuyển sang ĐẦU ~". Sau đó sao chép đại diện của cam kết trước (bên dưới) hoạt động đó. Trong trường hợp của chúng tôi, đó sẽ là master@{1}
(hoặc 3ae5027
, cả hai đều đại diện cho cùng một cam kết) và chạy git reset --hard <commit>
để đặt lại chi nhánh hiện tại của bạn trở lại cam kết đó.
Tôi dàn dựng những thay đổi của mình với git add
, nhưng không bao giờ cam kết. Bây giờ những thay đổi của tôi đã biến mất!
Đây là một chút khó khăn hơn để phục hồi từ. git không có bản sao của các tệp bạn đã thêm, nhưng vì các bản sao này không bao giờ được gắn với bất kỳ cam kết cụ thể nào, bạn không thể khôi phục tất cả các thay đổi cùng một lúc. Thay vào đó, bạn phải định vị các tệp riêng lẻ trong cơ sở dữ liệu của git và khôi phục chúng theo cách thủ công. Bạn có thể làm điều này bằng cách sử dụnggit fsck
.
Để biết chi tiết về điều này, hãy xem Hoàn tác thiết lập lại git - với các tệp không được cam kết trong khu vực tổ chức .
Tôi đã thay đổi các tập tin trong thư mục làm việc của mình mà tôi chưa bao giờ dàn dựng git add
và không bao giờ cam kết. Bây giờ những thay đổi của tôi đã biến mất!
À ồ. Tôi ghét phải nói với bạn điều này, nhưng có lẽ bạn không gặp may. git không lưu trữ các thay đổi mà bạn không thêm hoặc cam kết với nó, và theo tài liệu chogit reset
:
--cứng
Đặt lại chỉ mục và cây làm việc. Mọi thay đổi đối với các tệp được theo dõi trong cây làm việc <commit>
đều bị loại bỏ.
Có thể bạn có thể khôi phục các thay đổi của mình bằng một số tiện ích khôi phục đĩa hoặc dịch vụ khôi phục dữ liệu chuyên nghiệp, nhưng tại thời điểm này có lẽ nhiều rắc rối hơn giá trị của nó.