Pieņemsim, ka esmu Git repozitorijā. Es dzēšu failu un nododu šīs izmaiņas. Es turpinu darbu un veicu vēl dažus labojumus. Tad es konstatēju, ka man šis fails jāatjauno.
Es zinu, ka varu izņemt failu, izmantojot git checkout HEAD^ foo.bar
, bet es īsti nezinu, kad šis fails tika dzēsts.
Es'es ceru, ka man nav manuāli jāpārskata mani žurnāli, jāizraksta viss projekts par konkrēto SHA un tad manuāli jākopē šis fails manā sākotnējā projekta izrakstā.
Atrod pēdējo nodošanu, kas ietekmēja norādīto ceļu. Tā kā faila nav HEAD kopijā, šī kopija to ir izdzēsusi.
git rev-list -n 1 HEAD -- <file_path>
Pēc tam pārbaudiet versiju, kas ir iepriekšējā izdarītajā kopijā, izmantojot caret (^
) simbolu:
git checkout <deleting_commit>^ -- <file_path>
Vai arī ar vienu komandu, ja $file
ir attiecīgais fails.
git checkout $(git rev-list -n 1 HEAD -- "$file")^ -- "$file"
Ja izmantojat zsh un ir iespējota opcija EXTENDED_GLOB, caret simbols nedarbosies. Tā vietā var izmantot ~1
.
git checkout $(git rev-list -n 1 HEAD -- "$file")~1 -- "$file"
git log --diff-filter=D --summary
, lai iegūtu visus pārskatus, kuros ir dzēsti faili, un dzēstos failus;git checkout $commit~1 path/to/file.ext
, lai atjaunotu izdzēsto failu.Kur $commit
ir 1. solī atrastā pasūtījuma vērtība, piemēram, e4cf499627
.
Ja esat traks, izmantojiet git-bisect
. Lūk, ko darīt:
git bisect start
git bisect bad
git bisect good <some commit where you know the file existed>
Tagad ir pienācis laiks palaist automātisko testu. Apvalka komanda '[ -e foo.bar ]'
atgriezīs 0, ja foo.bar
eksistē, un 1 pretējā gadījumā. Ar git-bisect
komandu "palaist" tiks izmantota bināra meklēšana, lai automātiski atrastu pirmo nodošanu, kurā tests neizdodas. Tā sāk pusi no norādītā diapazona (no laba līdz sliktam) un, pamatojoties uz norādītā testa rezultātu, to saīsina uz pusēm.
git bisect run '[ -e foo.bar ]'
Tagad jūs esat pie tās kopijas, kas to izdzēsa. No šejienes jūs varat pāriet atpakaļ uz nākotni un izmantot git-revert
, lai atceltu izmaiņas,
git bisect reset
git revert <the offending commit>
vai arī varat atgriezties par vienu kopiju atpakaļ un manuāli pārbaudīt bojājumus:
git checkout HEAD^
cp foo.bar /tmp
git bisect reset
cp /tmp/foo.bar .