git restore

Przywraca pliki w drzewie roboczym lub wycofuje je z poczekalni.

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ślnie HEAD.
  • --source= (-s) — bierze czystą kopię z konkretnego commita, gałęzi lub tagu zamiast z indeksu/HEAD.
  • --staged --worktree — przywraca jedno i drugie naraz; wtedy --source jest 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 w plik.txt i 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 — przywraca config.yml w stanie sprzed dwóch commitów.
  • git restore --staged --worktree -s HEAD app.js — twardy reset jednego pliku: indeks i drzewo robocze do stanu z HEAD.

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.