Rasti ir atkurti ištrintą failą „Git“ saugykloje

Pasakykite, kad esu git saugykloje. Ištrinu failą ir įvykdau šį pakeitimą. Aš ir toliau dirbu ir dar kelis bandymus. Tada manau, kad reikia atkurti šį failą.

Žinau, kad galiu patikrinti failą su „ git checkout HEAD^ foo.bar , bet aš tikrai nežinau, kada šis failas buvo ištrintas.

  • Koks būtų greičiausias būdas surasti įsipareigojimą, kuris ištrino nurodytą failo pavadinimą?
  • Koks būtų lengviausias būdas grąžinti šį failą į mano darbo kopiją?

Tikiuosi, kad man nereikės rankiniu būdu peržiūrėti savo žurnalų, patikrinti visą šio SHA projektą ir tada rankiniu būdu nukopijuoti šį failą į pradinį projekto patikrinimą.

2509
05 июня '09 в 1:40 2009-06-05 01:40 avdgaagas nustatytas birželio 05'09 val. 1:40 2009-06-05 01:40
@ 22 atsakymai

Raskite paskutinį įvykį, kuris paveikė šį kelią. Kadangi failo nėra HEAD, šis įsipareigojimas turi būti ištrintas.

 git rev-list -n 1 HEAD -- <file_path> 

Tada patikrinkite versiją su įvykiu anksčiau naudodami „caret“ ( ^ ):

 git checkout <deleting_commit>^ -- <file_path> 

Arba vienoje komandoje, jei tas $file yra $file .

 git checkout $(git rev-list -n 1 HEAD -- "$file")^ -- "$file" 

Jei naudojate „zsh“ ir įjungėte „EXTENDED_GLOB“ parinktį, „caret“ simbolis neveiks. Vietoj to galite naudoti ~1 .

 git checkout $(git rev-list -n 1 HEAD -- "$file")~1 -- "$file" 
2848
11 июля '09 в 10:12 2009-07-11 10:12 CB Bailey atsakymą pateikė liepos 11 d., 09:12, 2009-07-11 10:12
  1. Naudokite git log --diff-filter=D --summary kad gautumėte visus ištrintus failus ir failus;
  2. Naudokite „ git checkout $commit~1 path/to/file.ext kad atkurtumėte ištrintą failą.
border=0

Kur $commit yra įsipareigojimo vertė, kurią radote 1 veiksme, pvz., e4cf499627

760
05 июня '09 в 2:10 2009-06-05 02:10 Robert Munteanu atsakymas birželio 05 d., 09:10 2009-06-05 02:10

Jei norite atkurti visus šiuos ištrintus failus aplanke, įveskite šią komandą.

 git ls-files -d | xargs git checkout -- 
305
02 дек. atsakymas duotas Manu 02 Dec 2010-12-02 09:11 '10 ne 9:11 2010-12-02 09:11

Aš atėjau į šį klausimą ir bandžiau atkurti ką tik ištrintą failą, bet dar nepadariau jokių pakeitimų. Tiesiog, jei atsidursite šioje situacijoje, jums tereikia:

git checkout HEAD -- path/to/file.ext

111
10 апр. Atsakymą pateikė Brett, balandžio 10 d. 2014-04-10 03:03 '14 at 3:03 2014-04-10 03:03

Jei esate protingas, naudokite git-bisect . Štai ką daryti:

 git bisect start git bisect bad git bisect good <some commit where you know the file existed> 

Dabar pereikite prie automatinio bandymo. Korpuso komanda '[ -e foo.bar ]' grąžina 0, jei egzistuoja foo.bar , ir 1 kitaip. „ git-bisect “ „paleisti“ komanda naudos dvejetainę paiešką, kad automatiškai ieškotų pirmojo įvykio, kai bandymas baigiasi klaidoje. Jis prasideda pusiaukelėje per tam tikrą intervalą (nuo gero iki blogo) ir perpjaunamas per pusę, priklausomai nuo nurodyto bandymo rezultato.

 git bisect run '[ -e foo.bar ]' 

Dabar naudojate įsipareigojimą, kuris jį ištrino. Iš čia galite grįžti į ateitį ir naudoti „ git-revert kad panaikintumėte pakeitimą,

 git bisect reset git revert <the offending commit> 

Arba galite grįžti į vieną pataisą ir rankiniu būdu patikrinti žalą:

 git checkout HEAD^ cp foo.bar /tmp git bisect reset cp /tmp/foo.bar . 
87
05 июня '09 в 1:46 2009-06-05 01:46 Atsakymą davė Josh Lee birželio 05'09 09:46 2009-06-05 01:46

Mano naujas mėgstamiausias slapyvardis, pagrįstas bonyiii atsakymu (atnaujinta), ir mano atsakymas apie „Pasiduokite argumentą į komandą„ Git “ :

 git config alias.restore '!f() { git checkout $(git rev-list -n 1 HEAD -- $1)~1 -- $(git diff --name-status $(git rev-list -n 1 HEAD -- $1)~1 | grep '^D' | cut -f 2); }; f' 

Aš neteko klaidos ištrinto failo?
Greitas:

 git restore my_deleted_file 

Užkirto kelią krizei.


Robert Diley komentaruose siūlo šiuos slapyvardžius:

 restore-file = !git checkout $(git rev-list -n 1 HEAD -- "$1")^ -- "$1" 

Ir jegan prideda komentarus :

Jei norite įdiegti slapyvardį iš komandų eilutės, naudoju šią komandą:

 git config --global alias.restore "\!git checkout \$(git rev-list -n 1 HEAD -- \"\$1\")^ -- \"\$1\"" 
66
17 февр. atsakymą pateikė VonC 17 vasaris. 2013-02-17 18:33 '13, 18:33 2013-02-17 18:33

Jei žinote failo pavadinimą, tai paprastas būdas su pagrindinėmis komandomis:

Visų šio sąrašo įsipareigojimų sąrašas.

 git log -- path/to/file 

Paskutinis fiksatorius (viršutinis) yra tas, kuris pašalino failą. Taigi, reikia atkurti antrąjį ir paskutinį pranešimą.

 git checkout {second to last commit} -- path/to/file 
44
27 февр. Atsakymas pateikiamas 27 d 2016-02-27 04:50 '16 at 4:50 2016-02-27 04:50

Jei norite atkurti ištrintą ir užbaigtą failą:

 git reset HEAD some/path git checkout -- some/path 

Jis buvo išbandytas Git versijoje 1.7.5.4.

28
04 июля '12 в 7:39 2012-07-04 07:39 atsakymą pateikė Fedir RYKHTIK liepos 4 d. 12 d. 7:39 2012-07-04 07:39

Jei ką tik padarėte pakeitimus ir ištrynėte failą, bet jo nepadarėte, ir dabar jūs susiskaldėte su pakeitimais

 git checkout -- . 

bet ištrinti failai nebuvo grąžinti, tiesiog paleiskite šią komandą:

 git checkout <file_path> 

Ir presto, jūsų failas yra atgal.

23
02 сент. Atsakymą pateikė Paulo Linhares - Packapps 02 Sep. 2016-09-02 18:30 '16 at 18:30 2016-09-02 18:30

Turiu šį sprendimą .

  • Norėdami gauti komandų ID, kur failas buvo ištrintas, vienu iš toliau pateiktų būdų.

    • git log --grep=*word*
    • git log -Sword
    • git log | grep --context=5 *word*
    • git log --stat | grep --context=5 *word* git log --stat | grep --context=5 *word* # yra rekomenduojamas, jei tikėtina, kad nieko neprisiminsite
  • Turėtumėte gauti kažką panašaus:

įsipareigoti bfe68bd117e1091c96d2976c99b3bcc8310bebe7 Autorius: Alexander Orlov Data: gegužės 12 d. 23:44:27 2011 +0200

 replaced deprecated GWT class - gwtI18nKeySync.sh, an outdated (?, replaced by a Maven goal) I18n generation script 

įsipareigoti 3ea4e3af253ac6fd1691ff6bb89c964f54802302 Autorius: Alexander Orlov Data: Thu 12 Geg 22:10:22 2011 +0200

3. Dabar naudodami įsipareigojimo identifikatorių bfe68bd117e1091c96d2976c99b3bcc8310bebe7:

 git checkout bfe68bd117e1091c96d2976c99b3bcc8310bebe7^1 yourDeletedFile.java 

Kadangi įsipareigojimo identifikatorius reiškia įsipareigojimą, kuriame failas jau buvo ištrintas, turite nurodyti nuorodą prieš pat bfe68b, kurį galite padaryti pridėdami ^1 . Tai reiškia: leiskite man nustatyti prieš pat bfe68b.

22
01 марта '12 в 13:48 2012-03-01 13:48 atsakymas pateikiamas Alex kovo 1 d. 12 val. 13:48 2012-03-01 13:48
 git checkout /path/to/deleted.file 
14
25 июня '13 в 22:40 2013-06-25 22:40 atsakymą pateikė vartotojo1528493 birželio 25 d. 13 val. 10:40 2013-06-25 22:40

Daugeliu atvejų naudinga naudoti „ coreutils“ (grep, sed ir tt) kartu su „Git“. Jau gerai žinau šiuos įrankius, bet Git yra mažesnis. Jei norėjau ieškoti ištrinto failo, norėčiau atlikti šiuos veiksmus:

 git log --raw | grep -B 30 $'D\t.*deleted_file.c' 

Kai randa peržiūrą / pataisą:

 git checkout <rev>^ -- path/to/refound/deleted_file.c 

Kaip ir kiti prieš mane.

Dabar failas bus atkurtas iki būsenos, kuri buvo prieš ištrynimą. Nepamirškite iš naujo išspręsti darbo medžio, jei norite jį išsaugoti.

10
22 окт. Thomas E atsakymas spalio 22 d. 2012-10-22 16:09 '12, 4:09 val. 2012-10-22 16:09

git undelete path/to/file.ext

  • Įdėkite jį į .bash_profile (arba kitą tinkamą failą, kuris įkeliamas atidarant komandų apvalkalą):

     git config --global alias.undelete '!sh -c "git checkout $(git rev-list -n 1 HEAD -- $1)^ -- $1" -' 
  • Tada naudokite:

     git undelete path/to/file.ext 

Šis slapyvardis pirmiausia patikrina, ar suras paskutinį įvykį, kuriame buvo šis failas, tada patikrinkite šį kelią į failą iš paskutinio įvykio, kuriame yra šis failas. šaltinis

9
08 июня '17 в 4:13 2017-06-08 04:13 atsakymą pateikė „ Beau Smith “ birželio 8 d. 17 d. 4:13 2017-06-06 04:13

Taigi turėjau atkurti ištrintus failus iš tam tikro įvykio, ir man pavyko įvykdyti dvi komandas:

 git show <rev> --diff-filter=D --summary --name-only --no-commit-id | xargs git checkout <rev>^ -- git show <rev> --diff-filter=D --summary --name-only --no-commit-id | xargs git reset HEAD 

(Atkreipkite dėmesį į galutinę vietą kiekvienos komandos pabaigoje.)

Failai buvo įtraukti į .gitignore failą, o tada išvalyti naudojant git rm, man reikėjo atkurti failus, bet tada juos išjungti. Turėjau šimtus failų, kuriuos reikia atkurti, rankiniu būdu įrašyti kiekvieną failą, kaip ir kituose pavyzdžiuose, tai buvo per lėtas.

6
29 нояб. atsakymas pateikiamas kzar 29 d 2013-11-29 23:05 '13, 11:05 val. 2013-11-29 23:05

Tiesą sakant, šis klausimas yra tiesiogiai susijęs su „ Git , bet kažkas panašaus į mane dirba su tokiais GUI įrankiais kaip „ WebStorm VCS“, išskyrus žinant „git cli .

Dešiniuoju pelės mygtuku spustelėkite kelią, kuriame yra ištrintas failas, tada eikite į „ Git ir spustelėkite „ Show History “.

2019

24 нояб. atsakymą pateikė „ AmerllicA“ 24 nov. 2018-11-24 14:12 '18, 14:12 pm, 2018-11-24 14:12

Turiu tą patį klausimą. Nežinodamas tai padariau nugriovusią .

Kabančiųjų sąrašas

git fsck --lost-found

Patikrinkite kiekvieną pakabinimą

git reset --hard <commit id>

Mano failai vėl atsirado, kai persijungiau į pakabinimą.

git status pagal priežastį:

"HEAD detached from <commit id where it detached>"

4
04 янв. Atsakymas yra suteiktas rustyMagnet Jan 04 2018-01-04 20:08 '18, 08:08 val. 2018-01-04 20:08
 user@bsd:~/work/git$ rm slides.tex user@bsd:~/work/git$ git pull Already up-to-date. user@bsd:~/work/git$ ls slides.tex ls: slides.tex: No such file or directory 

Atkurti ištrintą failą:

 user@bsd:~/work/git$ git checkout D .slides.tex.swp D slides.tex user@bsd:~/work/git$ git checkout slides.tex user@bsd:~/work/git$ ls slides.tex slides.tex 
4
29 нояб. atsakymą pateikė vartotojo1797498 lapkričio 29 d. 2012-11-29 19:35 '12 19:35 val. 2012-11-29 19:35

Mūsų atveju mes netyčia ištrinome failo įrašus, o kai kurie vėliau įrašyti, supratome klaidą ir norėjome grąžinti visus ištrintus failus, bet ne tuos, kurie buvo pakeisti.

Remiantis Charles Bailey, puikus atsakymas čia yra mano vienas linijinis laivas:

 git co $(git rev-list -n 1 HEAD -- <file_path>)~1 -- $(git diff --name-status $(git rev-list -n 1 HEAD -- <file_path>)~1 head | grep '^D' | cut -f 2) 
3
02 июля '12 в 23:52 2012-07-02 23:52 atsakymas duotas bonyiii liepos 2 d. 12 val. 23:52 2012-07-02 23:52

Jei žinote <SHA1_deletion> , ištrintą failą (-us), paleiskite šią komandą, kurioje <SHA1_deletion> yra įsipareigojimas, ištrinantis failą:

 git diff --diff-filter=D --name-only <SHA1_deletion>~1 <SHA1_deletion> | xargs git checkout <SHA1_deletion>~1 -- 

Prieš kanalą pateiktoje dalyje išvardijami visi faile, kurie buvo ištrinti įsipareigojime; visos jos yra patikrintos iš ankstesnės fiksacijos, kad jas atkurtumėte.

3
03 дек. Atsakymą pateikė Tony Wickham 03 dec. 2015-12-03 04:04 '15, 04:04 2015-12-03 04:04

Paprasta ir tiksli

Visų pirma, gaukite paskutinį stabilų įvykį, kuriame turite šį failą:

 git log 

Tarkime, jūs radote $ saistībuid 1234567 ..., tada

 git checkout <$commitid> $fileName 

Tokiu būdu bus atkurta failo versija, kuri buvo padaryta šiame faile.

1
26 окт. Atsakymas, kurį pateikė Sudhanshu Jain 26 spalis 2018-10-26 09:41 '18, 9:41 ; 2018-10-26 09:41

Jei susiduriate su šia problema dažniau ir esate pasirengę naudoti „Git“ GUI įrankį, peržiūrėkite „ DeepGit“ ir naudokite „ File“ | Paieška

-1
17 дек. atsakymas pateikiamas 17 d. 2016-12-17 16:21 '16, 16:21 pm 2016-12-17 16:21
 $ git log --diff-filter=D --summary | grep "delete" | sort 
-1
05 февр. atsakymas pateikiamas kujiy 05 Feb. 2018-02-05 04:01 '18 at 4:01 2018-02-05 04:01

Kiti klausimai apie žymes arba Ask a Question