Găsi și de a restabili un fișier șters într-un depozit Git

Spune I'm într-un depozit Git. Am șterge un fișier și să se angajeze că se schimbe. Am continua să lucreze și să facă unele mai comite. Apoi, am nevoie pentru a restabili acest fișier.

Știu că pot checkout-un fișier folosind git checkout CAP^ foo.bar`, dar eu nu't într-adevăr știu când fișierul a fost șters.

  1. Ce ar fi cel mai rapid mod de a găsi comite că elimină un anumit fisier?
  2. Ce ar fi cel mai simplu mod de a obține înapoi în copia de lucru?

Am'm sperând că don't trebuie să manual răsfoiește-mi busteni, de verificare a întregului proiect pentru un anumit SHA și apoi copiați manual acel fișier în proiectul original checkout.

Comentarii la întrebare (7)
Soluția

Găsi ultimul commit, care a afectat dat drumul. Deoarece fișierul nu't în CAP comis-o, asta se angajeze trebuie să le fi șters.


git rev-list -n 1 HEAD -- 
Comentarii (20)
  1. Folosesc git log-dif-filtru=D --rezumat` pentru a obține toate se angajează, care au șters fișiere și fișierele șterse;
  2. Folosesc git checkout $comite~1 path/to/file.ext` pentru a restabili fișierul șters.

Unde $comite este valoarea obliga'am găsit-o la pasul 1, de exemplu, e4cf499627

Comentarii (11)

Pentru a restabili toate aceste fișiere șterse într-un dosar introduceți următoarea comandă.

git ls-files -d | xargs git checkout --
Comentarii (7)

Am venit la această întrebare în căutarea de a restabili un fișier tocmai am șters-o, dar nu m't comis încă schimbarea. Doar în cazul în care vă aflați în această situație, tot ce trebuie să faceți este următoarea:

git checkout CAP-path/to/file.ext

Comentarii (0)

Dacă ești nebun, utilizarea git-bisectoarea. Aici's ce sa fac:

git bisect start
git bisect bad
git bisect good 

Acum's timp pentru a rula automat de testare. Shell comanda '[ -e foo.bar ]' se va întoarce 0 dacă foo.bar există, și 1 în caz contrar. "run" comanda git-bisectoarea va folosi binar de căutare pentru a găsi automat primul comite în cazul în care testul eșuează. Acesta începe la jumătatea interval dat (de la bine la rău) și taie-l în jumătate pe baza rezultatelor de încercare specificate.

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

Acum're la comiterea care a șters-o. De aici, puteți sări înapoi în viitor și de a folosi git-revert pentru a anula modificarea,

git bisect reset
git revert 

sau ai putea merge înapoi cu o comite și manual inspecta pagubele:

git checkout HEAD^
cp foo.bar /tmp
git bisect reset
cp /tmp/foo.bar .
Comentarii (4)

Noul meu favorit alias, bazat pe bonyiii's răspunde (upvoted), și propriul meu răspuns despre "Trece un argument pentru un Git comanda alias":

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'

Am pierdut un fișier șters din greșeală câteva angajează în urmă? Rapid:

git restore my_deleted_file

Criza a fost evitată.


Robert Dailey propune în comentarii următoarele alias:

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

Și jegan adauga în comentarii:

Pentru stabilirea alias din linia de comandă, am folosit aceasta comanda:

git config --global alias.restore "\!git checkout \$(git rev-list -n 1 HEAD -- \"\$1\")^ -- \"\$1\"" 
Comentarii (12)

Dacă știți numele fișierului, acesta este un mod simplu, cu comenzi de bază:

Lista toate se angajează pentru acel fișier.

git log -- path/to/file

Ultimul commit (cel mai de sus) este cea care a eliminat fișierul. Deci, aveți nevoie pentru a restabili al doilea la ultimul commit.

git checkout {second to last commit} -- path/to/file
Comentarii (5)

Pentru a restabili o șterse și angajat fișier:

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

Acesta a fost testat pe Git versiune 1.7.5.4.

Comentarii (3)

Dacă ai făcut schimbări și șters un fișier, dar nu a comis-o, și acum te-ai despărțit, cu modificările

git checkout -- .

dar fișierele șterse nu sa mai întors, pur și simplu face următoarea comandă:


git checkout 
Comentarii (0)

Am'am această soluție.

  1. Ia id-ul a comis-în cazul în care fișierul a fost șters, folosind una dintre modalitățile de mai jos.
  • git log --grep=*cuvânt*
  • git log-Sabie
  • git log | grep --context=5 *cuvânt*
  • git log-stat | grep --context=5 *cuvânt* # recomandat, dacă aveți cu greu amintesc nimic
  1. Ar trebui să obțineți ceva de genul:

comite bfe68bd117e1091c96d2976c99b3bcc8310bebe7 Autor: Alexandru Orlov alexander.orlov@loxal.net Data: Joi, 12 Mai, ora 23:44:27 2011 +0200

înlocuit depreciat GWT clasa

  • gwtI18nKeySync.sh un depășite (?, înlocuit cu un Maven obiectiv) I18n generație script

comite 3ea4e3af253ac6fd1691ff6bb89c964f54802302 Autor: Alexandru Orlov alexander.orlov@loxal.net Data: Joi, 12 Mai, 22:10:22 2011 +0200

3. Acum, folosind comite id bfe68bd117e1091c96d2976c99b3bcc8310bebe7 face:

git checkout bfe68bd117e1091c96d2976c99b3bcc8310bebe7^1 yourDeletedFile.java

Ca a comis id referințe comite în cazul în care fișierul a fost șters deja aveți nevoie pentru a face referire comite înainte de bfe68b care te poate face prin adăugarea ^1. Acest lucru înseamnă: dă-mi comite înainte de bfe68b.

Comentarii (2)
git checkout /path/to/deleted.file
Comentarii (2)

git undelete path/to/file.ext

  1. A pune acest lucru în ta `.bash_profile (sau alte fișiere relevante care se încarcă atunci când deschideți o linie de comandă):

git config --global alias.undelete '!sh -c "git checkout $(git rev-lista -n 1 CAP - $1)^ -- $1" -'

  1. Apoi, utilizați:

git undelete path/to/file.ext

Acest alias verifică mai întâi pentru a găsi ultimul comite în cazul în care acest dosar a existat, apoi face un git checkout de faptul că, calea de fișier de la ultimul commit în cazul în care acest dosar a existat. source

Comentarii (1)

În multe cazuri, poate fi util să se folosească coreutils (grep, sed, etc.) în legătură cu Git. Știu deja aceste instrumente destul de bine, dar Git cu atât mai puțin. Dacă am vrut să fac o căutare pentru un fișier șters, aș face următoarele:

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

Când am găsi revizuirea/comite:

git checkout ^ -- path/to/refound/deleted_file.c

Doar ca altii au declarat înainte de mine.

Fișierul va fi restaurat la starea pe care o avea înainte de îndepărtare. Amintiți-vă să re-angajeze la arborele de lucru, dacă doriți să păstrați-l în jurul.

Comentarii (0)

Așa că am avut de a restabili o grămadă de fișiere șterse de pe un anumit comis-o și am reușit cu două comenzi:

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

(Notă trailing space pe fiecare sfârșit de comandă.)

Fișierele au fost adăugate .gitignore fișier și apoi șters cu git rm, am nevoie pentru a restaura fișierele, dar apoi unstage ei. Am avut sute de fișiere pentru a restabili, tastarea lucruri manual pentru fiecare fișier ca și în alte exemple fost de gând să fie prea lent.

Comentarii (0)

De fapt, această întrebare este direct despre Git, dar pentru cineva ca mine, funcționează cu instrumente GUI ca WebStormVCS, altele decât știind despre gitcli` comenzi.

Faceți clic dreapta pe calea care conține fișierul șters, apoi du-te la Git, și faceți apoi clic pe Show Istorie.

VCS instrumente arată toate reviziile tren și eu pot vedea toate comite și schimbări de fiecare dintre ele.

Apoi am selectați se angajează ca prietenul meu a șterge `PostAd.js dosarul lui. acum vedea mai jos:

Și acum, pot să-mi văd dorința de fișier șters. Am doar dublu-clic pe numele fișierului și se recuperează.

Știu că răspunsul meu este nu Git de comenzi, dar este rapid, de încredere și ușor pentru începători și profesioniști dezvoltatori. Webstorm VCS instrumente sunt minunat și perfect pentru a lucra cu Git și nu't nevoie de nici un alt plugin sau instrumente.

Comentarii (2)

Am avut aceeași întrebare. Fără să știe, mi-a creat o marionetă comite.

Lista marionetă comite

`git fsck-a pierdut-găsit

Inspecta fiecare marionetă comite

git reset-hard <comite id>

Fișierele mele reapărut când m-am mutat la marionetă a comis-o.

`git de stare pentru un motiv:

"CAP detașat de la <comite de identitate în cazul în care este detașat>"

Comentarii (0)
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

Restabili fișier șters:

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
Comentarii (2)

În cazul nostru ne-am șters din greșeală fișiere într-un comite și unele comite mai târziu ne-am dat seama de greșeala noastră și a vrut pentru a obține înapoi toate fișierele care au fost șterse, dar nu cele care au fost modificate.

Bazat pe Charles Bailey's excelentă aici răspunsul meu este unul de linie:


git co $(git rev-list -n 1 HEAD -- 
Comentarii (0)

Dacă știi comite care a eliminat fișierul(e), executați această comandă în cazul în care <SHA1_deletion> se comite care a eliminat fișierul:

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

Partea dinainte a țevii listează toate fișierele care au fost șterse în commit; toate sunt plateste de cel anterior se angajează să le restaura.

Comentarii (0)

Găsi comite care a eliminat fișierul dvs.:

git log --diff-filter=D --oneline -- path/to/file | cut -f -d ' '

Eșantionul de ieșire:

4711174

Ca de Git 2.23 acolo este de fapt un "restore" de comandă. Este încă experimental dar, în scopul de a restabili ceva ce a eliminat într-un comite (4711174 în acest caz), puteți apoi tastați:

git restore --source=4711174^ path/to/file

Notă ^ după comiterea id-ul ca ne-o dorim pentru a restabili ceva din comită înainte cel care a eliminat fișierul.

La `--sursa argumentului spune "restore" comandă în cazul în care să caute fișierul(e) pentru a restabili și poate fi orice comite și chiar index.

A se vedea: git-restaurare doc pentru git 2.23.0

Comentarii (0)