git checkout

Przełącza gałęzie lub przywraca pliki z danego commita.

git checkout to klasyczny scyzoryk Gita: jednym poleceniem przełączasz się między gałęziami, wskakujesz na konkretny commit (tryb detached HEAD), zakładasz nową gałąź albo przywracasz pojedynczy plik do stanu z repozytorium. Przez lata pełnił tyle ról naraz, że twórcy Gita rozbili go na dwie nowsze komendy (git switch i git restore), ale git checkout wciąż działa wszędzie i to jego najczęściej spotkasz w tutorialach i cudzych skryptach.

Składnia i najważniejsze opcje

Podstawowa forma: git checkout [-b ]

  • -b — tworzy nową gałąź i od razu się na nią przełącza.
  • -B — to samo, ale jeśli gałąź już istnieje, resetuje ją do punktu startowego (nadpisuje).
  • -t / --track — przy tworzeniu gałęzi ustawia śledzenie gałęzi zdalnej (upstream).
  • --detach — celowo wchodzi w stan detached HEAD na wskazanym commicie, bez tworzenia gałęzi.
  • -f / --force — przełącza mimo niezapisanych zmian, kasując je w plikach roboczych.
  • -- — separator: wszystko po nim Git traktuje jako ścieżki, nie nazwy gałęzi.
  • - — skrót oznaczający „poprzednia gałąź”, na której byłeś.

Przykłady użycia

  • git checkout main — przełącza Cię na gałąź main.
  • git checkout -b feature/login — tworzy gałąź feature/login i od razu na nią przeskakuje.
  • git checkout - — wraca na poprzednią gałąź, idealne przy skakaniu tam i z powrotem.
  • git checkout -- config.yml — przywraca plik config.yml do ostatniej wersji z repozytorium (kasuje Twoje zmiany w nim).
  • git checkout a1b2c3d -- src/app.js — wyciąga konkretną wersję pliku z commita a1b2c3d do bieżącego drzewa roboczego.

Częste błędy i pułapki

Największa mina to git checkout -- : to nie cofnięcie z kosza, tylko nadpisanie. Niezapisane zmiany w tym pliku znikają bez ostrzeżenia i bez wpisu w git reflog. Jeśli nie jesteś pewien, najpierw zrób git stash.

Druga to detached HEAD. Gdy zrobisz git checkout i tam coś zacommitujesz, te commity nie należą do żadnej gałęzi i przy następnym przełączeniu mogą zostać „zapomniane” (do czasu garbage collection). Chcesz je zachować? Załóż gałąź: git checkout -b ratunek.

Uwaga na kolizję nazw: jeśli masz plik i gałąź o tej samej nazwie, Git zgłupieje. Wymuś interpretację przez --, np. git checkout -- nazwa dla pliku albo podaj jawnie nazwę gałęzi przed separatorem.

W nowszych Gitach (od 2.23) część tej roboty czytelniej robią git switch (gałęzie) i git restore (pliki) — warto je znać, choć checkout nigdzie się nie wybiera.

Powiązane komendy: git switch, git restore, git branch, git stash, git reset, git reflog.