Přeskočit na hlavní obsah

Resetování repozitáře

Někdy se stane, že uděláte „špatný" commit - například jste do něj dali něco omylem, nebo jste commit udělali moc brzy. V takové situaci může pomoci příkaz git reset.

Jak odstranit všechny lokální změny?

Použijte příkaz git checkout -- .

Velmi zjednodušeně:

  • git reset posune ukazatel HEAD na jiný commit v historii.
  • Podle režimu (--soft, --mixed, --hard) se navíc změní i to, co je ve staging area a ve vaší pracovní složce.
Riziko ztráty dat

git reset je silný nástroj a zejména --hard může nenávratně smazat neuložené změny.

Hard

git reset --hard je nejtvrdší varianta resetu.

  • Posune HEAD na vybraný commit.
  • Přepíše staging area (index) podle tohoto commitu.
  • Přepíše i pracovní složku podle tohoto commitu.
  • Všechny neuložené změny (které nejsou v commitu) se ztratí.
Co to vlastně udělá?

Vratí celý projekt do stavu, ve kterém byl v daném commitu, a všechno ostatní odstraní.

Kdy má smysl hard reset použít

  • Udělali jste několik commitů jen na zkoušku, nikdy jste je neposlali na server (git push) a chcete se vrátit do původního stavu.
  • Máte v pracovním adresáři nepořádek, zkoušeli jste různé věci a rozhodnete se: > „Nechci nic z toho, vrať mě zpět."

Vždy si ale zkontrolujte, že tyto commity nejsou sdílené s ostatními.

Příklad: vrácení posledního commitu
git log --oneline
a3b4c5d (HEAD -> main) Přidání formuláře pro registraci
9f8e7d6 Úprava CSS stylů
1a2b3c4 První verze stránky
git reset --hard HEAD~1
git log --oneline
9f8e7d6 (HEAD -> main) Úprava CSS stylů
1a2b3c4 První verze stránky

Soft

git reset --soft je mnohem šetrnější.

  • Posune HEAD na vybraný commit.
  • Staging area i pracovní složka zůstanou tak, jak byly.
  • Změny z „odstraněných" commitů se vrátí jako připravené k commitu (staged).
Co to vlastně udělá?

Vymaže poslední commit(y), ale nechá všechny změny, aby je šlo znovu commitnout.

Kdy má smysl soft reset použít

  • Potřebujete přepsat commit message.
  • Chcete sloučit více commitů do jednoho.
  • Uvědomíte si, že commit obsahuje víc, než by měl.
Příklad: přepsání posledního commitu
git reset --soft HEAD~1
git commit -m "Oprava chování tlačítka"
[main b7c8d9e] Oprava chování tlačítka odeslat
2 files changed, 10 insertions(+), 3 deletions(-)
Příklad: sloučení dvou commitů do jednoho
git reset --soft HEAD~2
git commit -m "Přidání stránky s kontakty"
[main e4f5a6b] Přidání stránky s kontakty
2 files changed, 45 insertions(+)
create mode 100644 index.html