Povedzme, že som v úložisku Git. Odstránim súbor a odovzdám túto zmenu. Pokračujem v práci a urobím ďalšie revízie. Potom zistím, že ten súbor potrebujem obnoviť.
Viem, že môžem súbor vymazať pomocou príkazu git checkout HEAD^ foo.bar
, ale v skutočnosti neviem, kedy bol tento súbor vymazaný.
Dúfam'e, že nebudem musieť ručne prechádzať svoje protokoly, kontrolovať celý projekt pre daný SHA a potom ručne kopírovať tento súbor do svojej pôvodnej kontroly projektu.
Nájsť poslednú revíziu, ktorá ovplyvnila zadanú cestu. Keďže súbor nie je v revízii HEAD, táto revízia ho musela odstrániť.
git rev-list -n 1 HEAD -- <file_path>
Potom skontrolujte verziu pri predchádzajúcej revízii pomocou symbolu caret (^
):
git checkout <deleting_commit>^ -- <file_path>
Alebo v jednom príkaze, ak $file
je príslušný súbor.
git checkout $(git rev-list -n 1 HEAD -- "$file")^ -- "$file"
Ak používate zsh a máte zapnutú voľbu EXTENDED_GLOB, symbol caret nebude fungovať. Namiesto neho môžete použiť ~1
.
git checkout $(git rev-list -n 1 HEAD -- "$file")~1 -- "$file"
git log --diff-filter=D --summary
získate všetky revízie, v ktorých boli odstránené súbory, a odstránené súbory;git checkout $commit~1 path/to/file.ext
na obnovenie odstráneného súboru.Kde $commit
je hodnota revízie, ktorú ste'našli v kroku 1, napr. e4cf499627
.
Ak ste blázon, použite git-bisect
. Tu'je, čo treba urobiť:
git bisect start
git bisect bad
git bisect good <some commit where you know the file existed>
Teraz je'čas spustiť automatizovaný test. Príkaz shellu '[ -e foo.bar ]'
vráti 0, ak foo.bar
existuje, a 1 v opačnom prípade. Príkaz "run" príkazu git-bisect
použije binárne vyhľadávanie na automatické nájdenie prvej revízie, v ktorej test zlyhal. Začne v polovici zadaného rozsahu (od dobrého po zlý) a na základe výsledku zadaného testu ho rozdelí na polovicu.
git bisect run '[ -e foo.bar ]'
Teraz ste'na revízii, ktorá ju odstránila. Odtiaľto môžete skočiť späť do budúcnosti a použiť git-revert
na zrušenie zmeny,
git bisect reset
git revert <the offending commit>
alebo sa môžete vrátiť o jednu revíziu späť a ručne skontrolovať poškodenie:
git checkout HEAD^
cp foo.bar /tmp
git bisect reset
cp /tmp/foo.bar .