Vyhľadanie a obnovenie odstráneného súboru v úložisku Git

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ý.

  1. Aký by bol najrýchlejší spôsob, ako nájsť revíziu, ktorá vymazala daný názov súboru?
  2. Aký by bol najjednoduchší spôsob, ako dostať tento súbor späť do mojej pracovnej kópie?

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.

Riešenie

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 -- 
Komentáre (20)
  1. Pomocou príkazu 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;
  2. Použite 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.

Komentáre (11)

Ak ste blázon, použite git-bisect. Tu'je, čo treba urobiť:

git bisect start
git bisect bad
git bisect good 

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 

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 .
Komentáre (4)