Tôi có thể khôi phục các tệp đã xóa (hoàn tác một `git clean -fdx`) không?


119

Tôi đã làm theo hướng dẫn về cách tạo trang github và quên chuyển xuống thư mục con git của mình. Kết quả là, tôi chỉ cần xóa toàn bộ thư mục tài liệu với git clean -fdx.
Có cách nào tôi có thể hoàn tác sai lầm khủng khiếp này không?


2
Tôi không biết chắc chắn, nhưng tôi không nghĩ là có thể với git. Tuy nhiên, một tiện ích phục hồi cho hệ thống tệp của bạn có thể thực hiện thủ thuật.
static_rtti

9
Điều thú vị là Git Community Book cũng gợi ý git clean -fdxmà không có bất kỳ cảnh báo nào rằng hoạt động này rất nguy hiểm. Tôi tự hỏi có bao nhiêu người đã phá hủy tệp của họ một cách không thể phục hồi với gợi ý có vẻ vô tội này.
catpnosis

5
Đảm bảo kiểm tra xem IDE của bạn có "Lịch sử cục bộ" như Eclipse hoặc IDE IntelliJ không. Điều đó có thể giúp bạn đỡ đau lòng vì những git cleancuộc gọi vô tình . Ngoài ra, hãy cố gắng bỏ thói quen dọn dẹp mà không cần kiểm tra. Tạo một tập lệnh Powershell hoặc Bash có thể được gọi sẽ chạy git clean -fdxnvới lời nhắc xác nhận trước khi bạn thực sự chạy bản sạch vô cùng phá hoại.
Josh Burgess

Câu trả lời:


129

Không. Các tệp đó đã biến mất.

(Chỉ cần kiểm tra trên Linux: cuộc gọi sạch gitunlink() và không sao lưu bất kỳ thứ gì trước đó.)


32
Nếu bạn đang sử dụng IDE nâng cao như RubyMine, Eclipse, v.v., rất có thể nó sẽ có lịch sử cục bộ của các tệp đã bị xóa và bạn có thể khôi phục chúng.
Usman

1
@Usman trong trường hợp của tôi git cleanđã vô tình xóa các thay đổi bị xếp dỡ bên trong .ideathư mục ẩn và Lịch sử cục bộ đã lưu tôi!
emkman

2
Mẹo hay của @Usman. Với Eclipse, tôi có thể lấy lại tệp của mình bằng tùy chọn "Khôi phục từ Lịch sử cục bộ ...": i.imgur.com/XWNLOk5.gifv
brandizzi

1
Trên thực tế điều này là CÓ THỂ nhưng với phương pháp hacky. Xem câu trả lời này: stackoverflow.com/questions/6267180/can-i-undo-a-git-clean-fdx/…
Just Shadow

4
Trong PyCharm, bạn cũng có thể khôi phục chúng. Nhấp chuột phải vào thư mục chứa chúng, nhấp vào Lịch sử cục bộ, tìm xóa và nhấp hoàn nguyên.
Juanjo Conti

48
git clean -fdxn

Sẽ chạy nhanh và hiển thị cho bạn những tệp nào sẽ bị xóa nếu bạn chạy

git clean -fdx

(tất nhiên điều này chỉ hữu ích nếu bạn biết điều này trước, nhưng cho lần sau)


7
Để thêm vào điều này, -nhoạt động trên hầu hết các lệnh git (và nhiều lệnh * nix khác).
Nick McCurdy

23

IntelliJ / Android Studio cho phép khôi phục tệp từ lịch sử cục bộ .


3
PyCharm cũng hỗ trợ điều này! Cảm ơn bạn vì câu trả lời này. Tôi rất vui vì tôi đã đọc phần còn lại của câu trả lời sau khi top 3 là "không xin lỗi bạn không may mắn".
Bryson

18

Không. "Git clean -fdx" sẽ xóa tất cả các tệp và thư mục mà git không theo dõi khỏi thư mục làm việc của bạn. Vì Git không theo dõi các tệp này nên nó sẽ không có bất kỳ bản sao lưu nào của các tệp này. Ít nhất là không thường xuyên.

Nếu bạn đã thực hiện 'git add' trên một trong những tệp này gần đây (nhưng đã hủy bỏ cam kết), có khả năng bạn có thể tìm thấy nó với 'git fsck --lost-found'. Nó đáng để thử, nhưng đừng quá hy vọng.

Trong tương lai, bạn nên cân nhắc thay vì cam kết một vài lần thường xuyên hơn là một vài lần quá hiếm khi. Bằng cách đó, ít nhất bạn sẽ có một bản sao lưu cục bộ, ngay cả khi cuối cùng bạn không đẩy những cam kết này đến một điều khiển từ xa.


Vấn đề thực sự là thư mục không được coi là một kho lưu trữ. Nhìn lại nhật ký, lần lượt ra tôi quên cd vào thư mục repo mới sau khi mkdir-ing nó
Eric

1
Ngay sau khi đọc câu hỏi này, tôi đã viết một bản vá cho Git để thêm một biến cấu hình để sao lưu từng tệp đã xóa. Có lẽ nó có thể hữu ích cho những người khác? github.com/kusma/git/tree/work/clean-backup
kusma

1
Tôi đã may mắn hôm nay !!! Cảm ơn "git fsck --lost-found". Tôi đã sử dụng phần sau để nhận TẤT CẢ các thay đổi: git fsck | awk '{print $ 3}' | xargs git show | tee searchresults.log Vì tôi muốn toàn bộ tệp mà tôi đã thêm và sau đó xóa, tôi có thể lấy nó từ nhật ký. :)
Marcello de Sales

11

Như @kusma đã đề cập ở trên, nếu bạn may mắn (nếu bạn đã từng làm "git add"), thì bạn có thể sử dụng cách sau để giải nén toàn bộ đối tượng:

git fsck | awk '{print $3}' | xargs git show | tee searchresults.log

Bằng cách đó, nó sẽ tìm kiếm tất cả các loại khối, thu thập toàn bộ khác biệt và thêm vào một tệp mà bạn có thể giải nén tệp bị mất. Trong trường hợp của tôi, tôi đã mất toàn bộ lớp Java.


8

Nếu bạn đang sử dụng bất kỳ IDE Jetbrains nào, có một tùy chọn để xem lịch sử cục bộ của tệp. Trong trường hợp bạn đã làmgit clean , bạn có thể tạo lại tệp và kiểm tra lịch sử cục bộ của tệp và khôi phục nó từ đó.

Làm việc cho tôi cho một tệp duy nhất. Đối với một thư mục hoàn chỉnh, tôi không có bất kỳ ý tưởng nào để làm điều đó.


Tạo tệp ở cùng một vị trí với cùng tên tệp. Trong IDE nhấp chuột phải và nhấp vào "Hiển thị lịch sử". Sao chép dán nội dung từ nó. Lời khuyên tuyệt vời @Rajesh. Cảm ơn.
sâu

1
Tôi đã được cứu. Cảm ơn bạn.
Scott

Không cần sao chép nội dung tệp, chỉ cần nhấp chuột phải vào tệp và nhấp vào 'hoàn nguyên' để khôi phục nó trở lại phiên bản đó (ngay cả khi bạn đã xóa nó)
n00b

7

Tôi đã có vấn đề này ngày hôm nay.

Như những người khác đã nói, git không giữ các tệp.

Cách duy nhất để hoàn tác việc này là sử dụng tiện ích phục hồi. Tôi đã sử dụng "extundelete" và khôi phục mọi thứ, nhưng số dặm / hệ thống tệp của bạn có thể khác.


7

Nếu bạn đang làm việc trên Eclipse, một trong những giải pháp khả thi là khôi phục từ lịch sử cục bộ của Eclipse.


2
tôi đang sử dụng PyCharm và lịch sử địa phương đã cứu tôi
psychok7

1
Điều tương tự trong IntelliJ IDEA!
arthurakay

RubyMine cũng có lịch sử địa phương. cứu tôi!
Usman

Tất cả các trình duyệt IntelliJ đều có lịch sử cục bộ. Rất may. Tôi đang sử dụng WebStorm và vừa bị chứng phình động mạch trước khi tôi phát hiện ra điều đó. 3 ngày làm việc 12 tiếng đồng hồ trôi qua, và tôi nghiêm túc cân nhắc việc làm rơi một chai rượu mạnh trên bàn làm việc của mình.
Josh Burgess

7

Trên thực tế ! Điều này là khả thi! Nhưng không sử dụng lệnh git.
Tất cả những gì chúng ta cần chỉ là một công cụ khôi phục tập tin như Recuva .
Chỉ cần đề cập đến đường dẫn từ nơi nó đã bị xóa và để nó khôi phục các tệp.

Ngoài ra đây là một số lưu ý hữu ích khi sử dụng ứng dụng đó:

  1. Tôi thực sự khuyên bạn nên chọn hộp kiểm này trước khi khôi phục tệp (khi tệp đã xóa xuất hiện trong cửa sổ khôi phục):
    Advanced Mode-> Options-> Actions->Restore folder structure
    Với điều này, tất cả các tệp của bạn sẽ được phục hồi bằng cách giữ cấu trúc thư mục nên sẽ dễ dàng hơn nhiều chỉ cần kéo và thả thư mục đó đến đường dẫn từ nơi nó đã bị xóa.
  2. Cài đặt công cụ khôi phục trên thiết bị USB là tốt hơn nhiều (vì cảnh báo bên dưới)
  3. Trong khi đề cập đến nơi khôi phục tệp, tránh chọn cùng một ổ đĩa từ nơi tệp bị xóa (một lần nữa vì cảnh báo được đề cập bên dưới), vì tệp được khôi phục hiện tại có thể ghi đè tệp đã xóa khác chưa được phục hồi. Khôi phục tệp vào bất kỳ ổ USB nào luôn là một giải pháp tốt ở đó.

Cảnh báo! Ngay sau khi bạn làm mất (vô tình xóa) bất kỳ tệp nào, cố gắng không chạm vào (thêm / sửa tệp) vào ổ đĩa từ nơi nó đã bị xóa để tăng khả năng khôi phục thành công. Nếu không, bạn có thể mất hoàn toàn tệp đó.

Tại sao nó hoạt động: Khi bạn xóa một tệp, thực ra nó không bị xóa. Nó chỉ được đánh dấu là "đã xóa" nên lần sau khi bạn thêm / cập nhật tệp vào cùng một ổ đĩa, những tệp cũ đó sẽ được ghi đè bằng tệp mới. Nhưng cho đến khi chúng bị ghi đè, bạn vẫn có thể đọc (và tất nhiên là khôi phục) các tệp.


1
Cảm ơn bạn đã cứu cuộc sống của tôi. Tôi không biết đó có phải là câu trả lời chính xác hay không vì tôi không thể khôi phục mọi thứ nhưng tôi đã may mắn vì tôi đã có được những tệp quan trọng nhất mà tôi cần.
XzaR

2

Tôi đã làm với một mã mà tôi phải thêm vào kho lưu trữ của mình và tôi đã làm sạch bằng -dfx, tôi có thể khôi phục các tệp.

Tôi đã cố gắng sử dụng gỡ lỗi, tìm kiếm và liên kết từ inodes, đĩa thử nghiệm và nhiều công cụ khác xuất hiện và không ai tìm thấy thư mục mà người ta viết ngu ngốc này đã vô tình xóa.

Tải xuống exundelete từ sourceforge.
Bạn có thể sẽ cần cài đặt gói e2fslibs-dev
Run

$ ./configure 
$ make 

Nó sẽ tạo ra tệp nhị phân cho phép mở rộng bên trong thư mục src Trong trường hợp của tôi, tôi đã xóa nhầm một thư mục. hãy gọi nó là FOOBAR

Tôi vừa chạy:

$  sudo ./extundelete --restore-directory <full path to FOOBAR > <the partition> 


và nó đã tạo một thư mục có tên RESTORED_FOLDERS


Chà! mặc dù điều này không khôi phục được tệp tôi muốn, nhưng đó là điều tôi sẽ ghi chú lại - chắc chắn sẽ có ích!
vyom

1

Nếu bạn đang sử dụng git với MSBuild, tôi đã tạo một mục tiêu sao chép tất cả các tệp và sau đó thực hiện git clean -xdf. Bằng cách này, bạn có thể dễ dàng khôi phục tệp nếu bạn nhận ra rằng bạn đã xóa nội dung nào đó mà bạn không muốn xóa. Hãy xem tại đây: http://blog.3d-logic.com/2012/11/04/safe-git-clean-with-msbuild/


1

Nếu bạn đang sử dụng máy Mac và được sao lưu bằng máy Mac Time Machine, thì bạn có thể khôi phục


0

May mắn thay, tôi đã mắc lỗi này khi sử dụng Windows 7. Đã vào thùng rác, đánh dấu tất cả các tệp đã xóa và nhấp vào "Khôi phục". Làm xong.


6
Ý anh là gì? git cleankhông di chuyển tệp vào thùng rác.
MEMark 14/09/18

0

Nếu bạn không thể đẩy các thay đổi của mình (git push), bạn cũng có thể khôi phục thông tin từ máy chủ chưa được cập nhật. Tôi đã sử dụng filezilla để khôi phục các tệp tôi đã xóa và sao chép chúng vào các tệp cục bộ của mình. Nó không phải là cách tốt nhất để làm điều đó, nhưng nó hoạt động và tránh sử dụng bảng điều khiển

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.