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.
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.
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 -- <file_path>
Apoi checkout versiunea de la comite înainte, folosind cursorul (^
) simbol:
git checkout <deleting_commit>^ -- <file_path>
Sau într-o singură comandă, dacă `$de fișier este fișierul în cauză.
git checkout $(git rev-list -n 1 HEAD -- "$file")^ -- "$file"
Dacă utilizați zsh și au EXTENDED_GLOB opțiune este activată, cursorul simbol câștigat't de lucru. Puteți utiliza ~1
în loc.
git checkout $(git rev-list -n 1 HEAD -- "$file")~1 -- "$file"
Unde $comite
este valoarea obliga'am găsit-o la pasul 1, de exemplu, e4cf499627
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
Dacă ești nebun, utilizarea git-bisectoarea
. Aici's ce sa fac:
git bisect start
git bisect bad
git bisect good <some commit where you know the file existed>
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 <the offending commit>
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 .
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\""
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
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 <file_path>
Și presto, dosarul s-a întors.
Am'am această soluție.
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 nimiccomite bfe68bd117e1091c96d2976c99b3bcc8310bebe7 Autor: Alexandru Orlov [email protected] 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 [email protected] 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.
git undelete path/to/file.ext
git config --global alias.undelete '!sh -c "git checkout $(git rev-lista -n 1 CAP - $1)^ -- $1" -'
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
Î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 <rev>^ -- 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.
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 <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
(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.
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 git
cli` 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.
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>"
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
Î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 -- <file_path>)~1 -- $(git diff --name-status $(git rev-list -n 1 HEAD -- <file_path>)~1 head | grep '^D' | cut -f 2)
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 <SHA1_deletion>~1 <SHA1_deletion> | xargs git checkout <SHA1_deletion>~1 --
Partea dinainte a țevii listează toate fișierele care au fost șterse în
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