git restore to nowsza, zdroworozsądkowa komenda Gita (dostępna od wersji 2.23), która służy do jednej rzeczy: przywracania plików do wcześniejszego stanu. Albo cofasz zmiany w drzewie roboczym (te niezacommitowane bazgroły, których żałujesz), albo wyciągasz plik z poczekalni (staging area), albo robisz oba naraz. Powstała po to, by rozbić przeciążone git checkout na dwie czytelne komendy — i tej połowy od pilnowania plików dotyczy właśnie git restore.
Składnia i najważniejsze opcje
Podstawowa forma: git restore [opcje] <ścieżka>
--worktree(-W) — przywraca pliki w drzewie roboczym; to zachowanie domyślne, gdy nie podasz nic innego.--staged(-S) — przywraca indeks (poczekalnię), czyli wycofuje pliki ze stage’a. Źródłem jest wtedy domyślnieHEAD.--source=(-s) — bierze czystą kopię z konkretnego commita, gałęzi lub tagu zamiast z indeksu/HEAD.--staged --worktree— przywraca jedno i drugie naraz; wtedy--sourcejest wymagane.--patch(-p) — tryb interaktywny: wybierasz fragment po fragmencie, co cofnąć.--— separator oddzielający opcje od ścieżek (ratuje, gdy plik nazywa się jak flaga).
Przykłady użycia
git restore plik.txt— kasuje niezacommitowane zmiany wplik.txti wraca do wersji z indeksu.git restore .— to samo, ale dla wszystkich plików w bieżącym katalogu i niżej.git restore --staged plik.txt— wyciąga plik z poczekalni (odwrotnośćgit add), nie ruszając jego treści.git restore --source=HEAD~2 config.yml— przywracaconfig.ymlw stanie sprzed dwóch commitów.git restore --staged --worktree -s HEAD app.js— twardy reset jednego pliku: indeks i drzewo robocze do stanu zHEAD.
Częste błędy i pułapki
To jest destrukcyjne. git restore plik nadpisuje zmiany w drzewie roboczym bez ostrzeżenia i bez kosza — jeśli plik nie był nigdy zacommitowany ani dodany do indeksu, ratunku nie ma. Najpierw rób git status, potem przywracaj.
Pamiętaj o różnicy: samo --staged rusza tylko indeks, samo (domyślne) --worktree tylko pliki na dysku. Częsta pomyłka juniorów to oczekiwanie, że unstage cofnie też edycje — nie cofnie. Druga pułapka: --staged --worktree bez --source rzuci błędem, bo Git nie wie, skąd brać czystą kopię.
Komenda działa identycznie na Linuksie, macOS i Windows — różnic między systemami nie ma, liczy się tylko wersja Gita (minimum 2.23).
Powiązane komendy: git checkout (stary sposób), git switch (przełączanie gałęzi), git reset (cofanie commitów i indeksu), git stash, git status.