2012-03-10 18 views
9

zrobiłem:Jak cofnąć ditmę git rm -rf bez pierwszego zatwierdzenia?

git init 
git add . 
git rm -rf dirname 

Patrząc na inne answsers, git reset --hard HEAD, git checkout -f i git reflog nie działa, podobno dlatego, że ma głowę, by wrócić do nich, ani zobowiązać się, aby uzyskać pliki z powrotem.

Czy istnieje sposób na odzyskanie plików?

Odpowiedz

8

Nie ma sposobu.

Zazwyczaj git rm sprawdza, czy pliki zostały już zatwierdzone przed ich usunięciem, więc nie stracisz żadnej ze swoich prac. Jednak użycie tej opcji powoduje zastąpienie wartości -f.

W skrócie:

  • Nie używaj -f.
  • Nie dotykaj niczego, czego nie popełniłeś.
+2

Podobnie jak unix - '-f' oznacza, że ​​lepiej się upewnić, co robisz. –

1

Nie, o ile wiem. Wierzę, że git rozłącza pliki, tak jak robi to rm -rf. Nie ma znaczenia, czy wie o plikach, czy nie, chętnie wyrzuci katalog. Naprawdę, jedynym wyjściem jest próba użycia narzędzia do odzyskiwania plików, tak jak gdyby miał wykonał

0

Jeśli git nie śledzi katalogu dirname, nie pozwoli na usunięcie katalogu z git rm -rf, ponieważ nie wie o nim. Będziesz (musiałaby) pojawia się błąd jak

fatal: pathspec 'dirname' did not match any files 

Jedyny sposób mogłeś usunięty jest, jeśli uczynił git add . lub git add dirname po git init. Jeśli tak jest, twoje pliki zniknęły i nie możesz ich odzyskać, ponieważ nigdy nie zostały zatwierdzone, a git ich nie śledzi. To jest tak dobre, jak robi rm -rf na normalnym folderze (i nie można odzyskać, chyba że masz kopie zapasowe)

+0

Czy to jednak? Nie przetestowałem tego, ale myślałem, że flaga -f zlikwiduje ten błąd. – Matt

+0

Chyba że używasz '-f'? To "zastąpi aktualną kontrolę.", Cokolwiek to znaczy. –

+0

@Matt - Nie, to nie tłumi. '-f' w' git rm' ma jedynie zastąpić aktualną kontrolę. – manojlds

0

git reset --hard pomógł natomiast usunięcie nie został jeszcze zaangażowani i, ogólnie rzecz biorąc, delecja został przerwany przez Ctrl+Z

1

Ostrzeżenie:: Uruchomienie git prune bez opcji -n (1) spowoduje usunięcie Twoich nieosiągalnych danych.

Może być sposób, używając git prune i git cat-file.

Running git prune -n lista będzie obiektów, które zostaną usunięte przez przycinanie:

$ git prune -n 
9cc84ea9b4d95453215d0c26489d6a78694e0bc6 blob 
c315143703752ef4d11ca7d93f2c324872b2ebff blob 

Każda linia odpowiada usuniętego pliku.

Teraz, używając git cat-file, jesteśmy w stanie przywrócić zawartość pliku usuniętego do nowego pliku:

git cat-file -p 9cc84ea9b4d95453215d0c26489d6a78694e0bc6 > restored-filename.whatever 

(1) Z git prune docs:

NAME
git-prune - Przycinaj wszystkie nieosiągalne obiekty z bazy danych obiektów

OPCJE
-n
--dry-run
Nie usuwaj niczego; po prostu zgłoś, co usunie.

Powiązane problemy