2012-03-05 38 views
40

Tôi đã thực hiện "git rm -rf". (cố gắng xóa bộ nhớ cache của các tệp mà tôi đã xóa sau khi thực hiện "git add.") mà không cần suy nghĩ git sẽ xóa các tệp đó. Tôi chưa có cam kết/chi nhánh ban đầu.Khôi phục các đốm màu lơ lửng trong git

$ git init 
$ git add . 

Tôi nhớ thêm ".gitignore" của mình. Sau đó, ra khỏi lười biếng và cũng không bận tâm để tìm kiếm các lệnh thích hợp tôi đã làm:

$ git rm -rf . 

Bây giờ mọi tập tin mà git đang theo dõi đã biến mất. Rất tiếc.

Làm thế nào để phục hồi các tập tin bằng cách sử dụng các đốm màu lủng lẳng

$ git fsck 
notice: HEAD points to an unborn branch (master) 
notice: No default references 
dangling blob 45cb2316b079df7898a28bab1389c87d37de4da5 
dangling blob 06b9d0f91bb0643a54ec027efc0efd6645d95326 
dangling blob c6c828230bc129da40928d55297577421c6f2e79 
dangling blob 087b296f5ae80151fb0d6150927ebe8049ed7706 
dangling blob c957743cb7ea533ce772d178394ce9f656b17b7c 
dangling blob 0ea745612b105394f5cd5c0119a829de98a0a954 
dangling blob 8fb1fa03c12cd56d4e2284008e92a3666bc60b93 
dangling blob cf49a6cf77ac792b108577c01ccf88cb2c28228c 
dangling blob 93817d9eeefea6ea894544e78b0e0970aa5adc46 
dangling blob 94a9ed024d3859793618152ea559a168bbcbb5e2 
dangling blob 574b7130959f2278c88946cf385fc49adcdf28c2 
dangling blob 582f5bceb8b35c01fd7442678a3cd7e1088b7957 
dangling blob d9fb7ca5775745b4332f630400d52c979aab35cd 
dangling blob 2087b182bf8b4b8d5ed8fe45a50c7661bda25feb 
dangling blob 6109baf32d04410c84d860501057a7f55a13f9dd 
dangling blob 22cc2ac7585b1d47bccf2ecb7bf57e16c2142bb6 
dangling blob 63b329443cc27273fad14c1e41de5bb9bf1bdd03 
dangling blob a2296d429715c9b6d730fdcc972eefdf8273d2e2 
dangling blob e41aedd7b2dbdee8b965a30d40ed0c9275194984 
dangling blob 6dc7b06e8f03cda72cf223b050d07ccd2b850fc8 
dangling blob ee52d86d94a40e7092dc34d1b2760244ec7dccaf 
dangling blob 2ffa08c086d3702563d498c9069a345940b3a348 
dangling blob 6fafa07526ad288ff2f6e26810ed9818eb18aabb 
dangling blob b1cdf17b5bb40b4839cfc80f7e91bbcf7b94f798 
dangling blob 353db77b88c248c752cdbd914787b9ebdf2d700f 
dangling blob f61d3492ce0d0e396fd322114a5e3475886de1cc 
dangling blob 7756a8713095390f5b106b81ae7f7247f762970b 
dangling blob bc995b7f9f6806dd5678227579a515bb5768d3a0 
dangling blob fce4a77b63b25abbc010859b4037589983820329 
dangling blob 3e3335f8cd27168d4fe81f61421d647f2905b7b0 
dangling blob 7f56efed4f8706e5b79408afbde197964d824eab 

Nhìn xung quanh tôi chỉ có thể tìm thấy hướng dẫn về phục hồi tòn ten cam

+1

Trong trường hợp bất cứ ai đọc điều này vẫn không biết, '(cố gắng để tẩy bộ nhớ cache của các tập tin tôi đã gỡ bỏ sau khi làm" git add.) 'Là _really_ thực hiện bằng cách sử dụng' git reset' hoặc 'git rm --cached' (lưu ý bit cuối cùng!). –

Trả lời

50

Bạn có thể sử dụng git show fce4a77b63b25abbc010859b4037589983820329 để xem nội dung (hoặc git show fce4a > somefile để đổ nó vào một tập tin).

Tên tệp bị mất (trừ khi cũng có treo lơ lửng cây hoặc các nguồn thông tin khác như lịch sử lệnh trong .bash_history).

Nếu bạn có thể thấy (với git ls-tree) cây gốc của mình, bạn có thể tạo một cam kết với cây đó bằng cách sử dụng lệnh git commit-tree hoặc một số git checkout e48751c3b37a9cab692133202bbb933241f73f69 -- . để truy xuất tệp.

7

Xem ở đây: http://schacon.github.com/git/user-manual.html#dangling-objects

Đối với cam kết, bạn chỉ có thể sử dụng:

$ gitk <dangling-commit-sha-goes-here> --not --all 

Điều này yêu cầu tất cả lịch sử có thể truy cập từ cam kết đã cho nhưng không phải từ bất kỳ chi nhánh, thẻ hoặc tham chiếu nào khác. Nếu bạn quyết định nó là cái gì bạn muốn, bạn luôn có thể tạo ra một tài liệu tham khảo mới cho nó, ví dụ,

$ git branch recovered-branch <dangling-commit-sha-goes-here> 

Đối với các đốm màu và cây cối, bạn không thể làm như vậy, nhưng bạn vẫn có thể kiểm tra chúng. Bạn chỉ có thể làm

$ git show <dangling-blob/tree-sha-goes-here> 

Thông thường, treo lủng lẳng đốm màu và cây không phải là rất thú vị. Chúng hầu như luôn là kết quả của việc sáp nhập nửa chiều (đốm màu thường sẽ có dấu xung đột từ việc hợp nhất trong đó, nếu bạn đã có các xung đột xung đột mà bạn đã cố định bằng tay) hoặc đơn giản là do bạn bị gián đoạn một "git fetch" với^C hoặc một cái gì đó như thế, để lại một số đối tượng mới trong cơ sở dữ liệu đối tượng, nhưng chỉ lúng túng và vô dụng.

+0

OP muốn khôi phục các tệp chưa được cam kết. –

+0

Với một số phép thuật bash bạn có thể thực hiện một vòng lặp và khôi phục các tệp, nhưng nếu bạn không có tên tệp trong một số nội dung của nó và không phải là một cây lơ lửng, tất cả những gì bạn phải làm là gửi tệp theo tệp đoán tên của nó bằng nội dung của nó. – rcdmk

+0

Tôi có thể xem các tập tin bị mất ngay bây giờ. Tôi sẽ viết một tập lệnh đặt các đốm màu vào các tệp 1.txt, 2.txt, 3.txt, v.v. –

40

tôi đã khôi phục chúng trong quá khứ bằng cách sử dụng lệnh fsck với những gì đã mất và tìm thấy tùy chọn:

git fsck --lost-found

Chạy rằng sau đó lưu các đốm màu lủng lẳng vào đường dẫn sau

.git/lost-found/other

+2

Điều này vừa lưu một $$ của tôi. Vì lý do nào đó, tôi đã chọn 'đặt lại các thay đổi' trong Tiện ích mở rộng Git trước khi cam kết - mất công việc buổi chiều. Lệnh này đã khôi phục tất cả các tệp của tôi vào thư mục như đã đề cập. Sau đó tôi kiểm tra từng người để khôi phục lại nội dung và khôi phục lại mã cho codebase của tôi. Cảm ơn bạn! –

Các vấn đề liên quan