Mám projekt, ve kterém jsem spustil git init
.
Po několika revizích jsem provedl git status
, který mi řekl, že je vše aktuální a že nedošlo k žádným lokálním změnám.
Pak jsem provedl několik po sobě jdoucích změn a uvědomil si, že chci všechno zahodit a vrátit se do původního stavu. Udělá to za mě tento příkaz?
git reset --hard HEAD
Pokud chcete vrátit změny provedené v pracovní kopii, proveďte tuto akci:
git checkout .
Pokud chcete vrátit změny provedené v indexu (tj. ty, které jste přidali), proveďte toto. Upozornění: Tímto krokem vynulujete všechny své nepředané revize na master!:
git reset
Pokud chcete vrátit změnu, kterou jste odevzdali, proveďte toto:
git revert <commit 1> <commit 2>
Pokud chcete odstranit nesledované soubory (např. nové soubory, vygenerované soubory):
git clean -f
Nebo nesledované adresáře (např. nové nebo automaticky generované adresáře):
git clean -fd
Poznámka: Možná budete chtít také spustit
git clean -fd
jako
git reset --hard
neodstraní nesledované soubory, zatímco git-clean odstraní všechny soubory ze sledovaného kořenového adresáře, které nejsou pod git trackingem. VAROVÁNÍ - BUĎTE OPATRNÍ! Je užitečné nejprve provést zkušební spuštění nástroje git-clean, abyste zjistili, co odstraní.
To je také obzvláště užitečné, když se zobrazí chybové hlášení
~"performing this command will cause an un-tracked file to be overwritten"
K tomu může dojít při několika činnostech, z nichž jednou je aktualizace pracovní kopie, když jste oba s kamarádem přidali nový soubor stejného jména, ale on ho odevzdal do správy zdrojů jako první a vy se nestaráte o to, abyste smazali svou nesledovanou kopii.
V této situaci vám také pomůže provedení suchého běhu, který vám ukáže seznam souborů, které by byly přepsány.
Podívejte se na git-reflog. Vypíše všechny stavy, které si pamatuje (výchozí je 30 dní), a vy si můžete jednoduše vybrat ten, který chcete. Například:
$ git init > /dev/null
$ touch a
$ git add .
$ git commit -m"Add file a" > /dev/null
$ echo 'foo' >> a
$ git commit -a -m"Append foo to a" > /dev/null
$ for i in b c d e; do echo $i >>a; git commit -a -m"Append $i to a" ;done > /dev/null
$ git reset --hard HEAD^^ > /dev/null
$ cat a
foo
b
c
$ git reflog
145c322 HEAD@{0}: HEAD^^: updating HEAD
ae7c2b3 HEAD@{1}: commit: Append e to a
fdf2c5e HEAD@{2}: commit: Append d to a
145c322 HEAD@{3}: commit: Append c to a
363e22a HEAD@{4}: commit: Append b to a
fa26c43 HEAD@{5}: commit: Append foo to a
0a392a5 HEAD@{6}: commit (initial): Add file a
$ git reset --hard HEAD@{2}
HEAD is now at fdf2c5e Append d to a
$ cat a
foo
b
c
d