Ako môžem vrátiť všetky lokálne zmeny v projekte spravovanom systémom Git do predchádzajúceho stavu?

Mám projekt, v ktorom som spustil git init. Po niekoľkých revíziách som urobil git status, ktorý mi povedal, že všetko je aktuálne a že neboli žiadne lokálne zmeny.

Potom som urobil niekoľko po sebe idúcich zmien a uvedomil som si, že chcem všetko zahodiť a vrátiť sa do pôvodného stavu. Urobí to za mňa tento príkaz?

git reset --hard HEAD
Riešenie

Ak chcete vrátiť zmeny vykonané v pracovnej kópii, urobte toto:

git checkout .

Ak chcete vrátiť zmeny vykonané v indexe (t. j. tie, ktoré ste pridali), urobte toto. Varning this will reset all of your unpushed commits to master!:

git reset

Ak chcete vrátiť zmenu, ktorú ste odovzdali, urobte toto:

git revert  

Ak chcete odstrániť nesledované súbory (napr. nové súbory, vygenerované súbory):

git clean -f

Alebo nesledované adresáre (napr. nové alebo automaticky generované adresáre):

git clean -fd
Komentáre (19)

Poznámka: Možno budete chcieť spustiť aj

git clean -fd

ako

git reset --hard

neodstráni nesledované súbory, zatiaľ čo git-clean odstráni všetky súbory zo sledovaného koreňového adresára, ktoré nie sú pod sledovaním git. UPOZORNENIE - BUĎTE OPATRNÍ! Je užitočné najprv spustiť skúšobnú prevádzku s programom git-clean, aby ste zistili, čo odstráni.

Je to užitočné najmä vtedy, keď sa zobrazí chybové hlásenie

~"performing this command will cause an un-tracked file to be overwritten"

K čomu môže dôjsť pri viacerých činnostiach, jednou z nich je aktualizácia pracovnej kópie, keď ste vy aj váš priateľ pridali nový súbor s rovnakým názvom, ale on'ho odovzdal do kontroly zdrojov ako prvý a vy sa nestaráte o to, aby ste vymazali svoju nesledovanú kópiu.

V takejto situácii vám vykonanie suchého spustenia pomôže zobraziť aj zoznam súborov, ktoré by sa prepísali.

Komentáre (4)

Pozrite sa na git-reflog. Vypíše všetky stavy, ktoré si pamätá (predvolene 30 dní), a vy si môžete jednoducho vybrať ten, ktorý chcete. Naprí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
Komentáre (4)