Atšaukti gitų atkūrimą - su neapdorotais failais sustojimo zonoje

Bandau atkurti savo darbą. Aš kvailai git reset --hard - prieš tai, bet prieš tai aš tik git reset --hard get add . ir git commit . Prašome padėti! Čia yra mano žurnalas:

 MacBookPro:api user$ git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # modified: .gitignore ... MacBookPro:api user$ git reset --hard HEAD is now at ff546fa added new strucuture for api 

Ar šiuo atveju galima atšaukti git reset --hard ?

100
10 сент. nustatyti eistrati 10 sep . 2011-09-10 22:28 '11, 10:28 PM 2011-09-10 22:28
@ 8 atsakymai

Turėtumėte sugebėti atkurti visus failus, kuriuos pridėjote prie indekso (pvz., Kaip ir jūsų situacijoje, naudodami git add. ), Nors tai gali būti šiek tiek laiko. Norėdami pridėti failą prie indekso, „git“ ją prideda prie objekto duomenų bazės, o tai reiškia, kad jis gali būti atkurtas, jei šiukšlių surinkimas dar neįvyko. Čia pateikiamas pavyzdys, kaip tai padaryti, atsakant į Yakub Narebsky :

Tačiau bandžiau tai atlikti bandymų saugykloje, ir iškilo keletas problemų - - --cached turėtų būti - --cache , ir aš sužinojau, kad jis iš tikrųjų nesukuria .git/lost-found katalogo. Tačiau man atlikta šie veiksmai:

 git fsck --cache --unreachable $(git for-each-ref --format="%(objectname)") 

Tai turėtų išleisti visus objektų duomenų bazės objektus, kurie nėra prieinami nė vienai iš nuorodų nei indekso, nei nuorodų žurnalo. Išvestis atrodys taip:

 unreachable blob 907b308167f0880fb2a5c0e1614bb0c7620f9dc3 unreachable blob 72663d3adcf67548b9e0f0b2eeef62bce3d53e03 

... ir kiekvienam iš šių BLOB galite padaryti:

 git show 907b308 

Norėdami rodyti failo turinį.


Per daug produktų?

Atnaujinkite, atsakydami į toliau pateiktą komentarą:

Jei pastebėsite, kad turite daug įsipareigojimų ir medžių, išvardytų šios komandos išvestyje, galbūt norėsite pašalinti iš išvesties visus objektus, kuriuos nurodo nesusiję įsipareigojimai. (Paprastai jūs galite grįžti prie šių įvykių per „reflog“) - mes tiesiog domisi objektais, kurie buvo įtraukti į indeksą, bet niekada negali būti rasti naudojant įsipareigojimą.)

Pirmiausia išsaugokite komandų išvestį:

 git fsck --cache --unreachable $(git for-each-ref --format="%(objectname)") > all 

Dabar šių neprieinamų įsipareigojimų objektų pavadinimus galima rasti naudojant:

 egrep commit all | cut -d ' ' -f 3 

Taigi, galite rasti tik prie indekso pridėtus, bet bet kuriuo metu nepatvirtintus medžius ir objektus, naudodami:

 git fsck --cache --unreachable $(git for-each-ref --format="%(objectname)") \ $(egrep commit all | cut -d ' ' -f 3) 

Tai labai sumažina objektų, kuriuos turėtumėte apsvarstyti, skaičių.


Atnaujinimas: „ Philip Oakley“ žemiau siūlo kitą būdą, kaip sumažinti aptariamų objektų skaičių, būtent tiesiog peržiūrėkite naujausius .git/objects failus. Juos galite rasti su:

 find .git/objects/ -type f -printf '%TY-%Tm-%Td %TT %p\n' | sort 

(Radau šį skambutį čia .) Šio sąrašo pabaiga gali atrodyti taip:

 2011-08-22 11:43:43.0234896770 .git/objects/b2/1700b09c0bc0fc848f67dd751a9e4ea5b4133b 2011-09-13 07:36:37.5868133260 .git/objects/de/629830603289ef159268f443da79968360913a 

Tokiu atveju šiuos objektus galite matyti iš:

 git show b21700b09c0bc0fc848f67dd751a9e4ea5b4133b git show de629830603289ef159268f443da79968360913a 

(Atkreipkite dėmesį, kad kelio pabaigoje turite ištrinti / ištrinti objekto pavadinimą.)

159
11 сент. Atsakymas, kurį pateikė Mark Longair Rugsėjo 11 2011-09-11 10:44 '11, 10:44, 2011-09-11 10:44

Aš tiesiog padariau gitą iš naujo - pasisekė ir prarado vieną užraktą. Bet aš žinojau pasišventimą , todėl galėjau atkurti „ Git Cherry COMMIT_HASH“ pasirinkimą .

border=0

Tai padariau per kelias minutes po to, kai praradote fiksaciją, todėl tai gali būti naudinga kai kuriems iš jūsų.

58
27 авг. Richard Saunders atsakymas, rugpjūčio 27 d 2013-08-27 20:42 '13, 20:42 2013-08-27 20:42

Ačiū Markui Longei, grąžinau savo daiktus!

Pirma, išsaugojau visus failus:

 git fsck --cache --unreachable $(git for-each-ref --format="%(objectname)") > allhashes 

paskui aš juos visus (ištrindamas „atblokuojamąjį blob“ dalyką) sąraše ir visus duomenis įkeliu į naujus failus ... jums reikia pasirinkti failus ir pervadinti juos dar kartą, ko jums reikia ... bet man reikėjo tik keleto failų. Tikiuosi, kad tai padės kam nors ...

 commits = ["c2520e04839c05505ef17f985a49ffd42809f", "41901be74651829d97f29934f190055ae4e93", "50f078c937f07b508a1a73d3566a822927a57", "51077d43a3ed6333c8a3616412c9b3b0fb6d4", "56e290dc0aaa20e64702357b340d397213cb", "5b731d988cfb24500842ec5df84d3e1950c87", "9c438e09cf759bf84e109a2f0c18520", ... ] from subprocess import call filename = "file" i = 1 for c in commits: f = open(filename + str(i),"wb") call(["git", "show", c],stdout=f) i+=1 
13
08 янв. atsakymas duotas berniukui 08 Jan 2014-01-08 16:52 '14 at 16:52 2014-01-08 16:52

@ „Ajedi32“ sprendimas pastabose dirbo man šioje konkrečioje situacijoje.

 git reset --hard @{1} 

Atkreipkite dėmesį, kad visi šie sprendimai priklauso nuo „git gc“ nebuvimo, o kai kurie iš jų gali sukelti vieną, todėl prieš bandydami viską, kad galėtumėte atsigauti, jei nesate dirbę, užsisakysiu .git katalogo turinį. jums.

5
11 янв. Atsakymą pateikė Duncan McGregor sausio 11 d. 2016-01-11 22:14 '16 at 22:14 pm 2016-01-11 22:14

Įtraukite tą pačią problemą, bet nepridėjote jokių indekso pakeitimų. Taigi, visos minėtos komandos nepadarė man reikiamų pakeitimų.

Po visų pirmiau minėtų sudėtingų atsakymų tai yra naivus užuomina, bet galbūt tai išgelbės ką nors, kas iš pradžių nemanė apie tai, kaip ir aš.

Nusivylus, aš bandžiau paspausti CTRL-Z mano redaktoriuje (LightTable) vieną kartą kiekviename atvirame skirtuke - tai, laimei, atkurė failą šiame skirtuke iki paskutinės būsenos prieš git reset --hard . NTN.

3
30 сент. Atsakymas suteiktas 30 rugsėjis. 2016-09-30 13:59 '16, 13:59 pm 2016-09-30 13:59

Malonumas, aš ištraukiau plaukus, kol susidūriau su šiuo klausimu ir jo atsakymais. Manau, kad teisingas ir glaustas atsakymas į pateiktą klausimą yra prieinamas tik tada, jei ištraukiate du aukščiau pateiktus komentarus, todėl čia viskas yra vienoje vietoje:

  • Kaip minėta chilicuil, paleiskite „git reflog“, kad nustatytumėte ten, kur norite sugrįžti

  • Kaip paminėjo akimsko, greičiausiai NEGALIMA pasirinkti vyšnių, nebent praradote savo įsipareigojimą, todėl turėtumėte paleisti „git reset --hard

Pastaba „Eclipse“ naudotojams: „Aš negalėjau rasti būdų, kaip atlikti šiuos veiksmus„ Eclipse “naudojant„ egit “. Uždarymas „Eclipse“, vykdydamas aukščiau minėtas komandas iš terminalo >

1
03 дек. Atsakymas duotas Lolo 03 d. 2014-12-03 08:50 '14 at 8:50 2014-12-03 08:50

Minėti sprendimai gali veikti, tačiau yra lengviau išspręsti šią problemą, o ne eiti per sudėtingą „ git atšaukimą. Manau, kad dauguma git-drop'ų atsiranda su nedideliu failų skaičiumi, o jei jau naudojate VIM, tai gali būti efektyviausias sprendimas. Problema ta, kad jūs jau turėtumėte naudoti užsispyrę anuliuoti „ ViM's , kuriuos turėtumėte naudoti bet kuriuo atveju, nes tai suteikia galimybę atšaukti neribotą skaičių pakeitimų.

Pateikiami veiksmai:

  1. „Vim“ spustelėkite : ir įveskite set undodir . Jei .vimrc undodir=~/.vim_runtime/temp_dirs/undodir persistent undo , jis parodys panašų rezultatą kaip undodir=~/.vim_runtime/temp_dirs/undodir .

  2. Repo atveju naudokite git log kad sužinotumėte paskutinės komisijos datą ir laiką.

  3. Savo apvalkale eikite į „ undodir naudodami cd ~/.vim_runtime/temp_dirs/undodir .

  4. Šiame kataloge naudokite šią komandą, kad surastumėte visus failus, kuriuos pakeitėte nuo paskutinio įvykio.

    find. -newermt "2018-03-20 11:24:44" \! -newermt "2018-03-23" \( -type f -regextype posix-extended -regex '.*' \) \-not -path "*/env.git/*"

    Čia "2018-03-20 11:24:44" yra paskutinio įvykio data ir laikas. Jei data, kurią atlikote, git reset --hard yra "2018-03-22", tada naudokite "2018-03-22" ir tada "2018-03-23". Taip yra dėl to, kad apatinė riba yra visa apimanti ir viršutinė riba yra išskirtinė. https://unix.stackexchange.com/a/70404/242983

  5. Tada eikite į kiekvieną failą, atidarykite juos vime ir paleiskite „anksčiau nei 20 m“. Daugiau informacijos apie „anksčiau“ galite rasti „h anksčiau“. earlier 20m reiškia, kad prieš 20 minučių grįšite į failo būseną, darant prielaidą, kad prieš 20 min. Pakartokite tai visiems failams, kurie buvo pasirinkti iš find . Esu tikras, kad kas nors gali parašyti scenarijų, kuris apjungs šiuos dalykus.

0
21 марта '18 в 19:56 2018-03-21 19:56 atsakymas pateikiamas alpha_989 kovo 21 d., 18 val., 20:56, 2018-03-21 19:56

Tai tikriausiai akivaizdu profesionalams, bet aš norėjau jį pasiimti, nes per beviltišką paiešką nematau, kad jis buvo iškeltas.

Įdėjau kai kuriuos failus ir padariau git iš naujo, - šiek tiek bijo, ir tada pastebėjau, kad mano būsena rodo, kad visi mano failai vis dar ruošiami, ir visi jų trynimai nėra įdiegti.

Šiame etape galite išspręsti šiuos pakopinius pakeitimus, jei nenorite juos ištrinti. Vėliau jums tereikia turėti drąsą dar kartą atlikti „git reset --hard“, kuris nuves jus atgal į jūsų atliktus ir ką tik padarytus pakeitimus.

Vėlgi, tai tikriausiai nėra nauja, bet tikiuosi, kad tai padėjo man, ir aš neradau nieko, kas pasiūlė, kad tai galėtų padėti kitam.

0
12 дек. atsakymas ddoty 12 dec. 2018-12-12 16:43 '18, 4:43 val. 2018-12-12 16:43

Kiti klausimai apie žymes arba Ask a Question