Ik weet dat Git veranderingen bijhoudt die ik in mijn applicatie aanbreng, en het houdt ze vast totdat ik de veranderingen commit, maar hier's waar ik vast zit:
Als ik wil terugkeren naar een vorige commit, gebruik ik:
git reset --hard HEAD
En Git geeft terug:
HEAD is now at 820f417 micro
Hoe zet ik dan de bestanden op mijn harde schijf terug naar die vorige commit?
Mijn volgende stappen waren:
git add .
git commit -m "revert"
Maar geen van de bestanden is veranderd op mijn harde schijf...
Wat doe ik goed/fout?
Ten eerste, het is altijd de moeite waard om op te merken dat git reset --hard
een potentieel gevaarlijk commando is, omdat het al je niet-vastgelegde wijzigingen weggooit. Voor de veiligheid moet je altijd controleren of de uitvoer van git status
schoon is (dat wil zeggen, leeg) voordat je het gebruikt.
In het begin zegt u het volgende:
Dus ik weet dat Git veranderingen bijhoudt die ik in mijn applicatie aanbreng, en het houdt ze vast totdat ik de veranderingen commit, maar hier's waar ik'ben blijven hangen:
Dat is niet correct. Git houdt alleen de status van de bestanden bij als je ze staged (met git add
) of als je een commit aanmaakt. Als je eenmaal een commit gemaakt hebt die je project bestanden in een bepaalde staat heeft, zijn ze erg veilig, maar tot dan is Git'niet echt "het volgen van veranderingen" aan je bestanden. (bijvoorbeeld, zelfs als je git add
doet om een nieuwe versie van het bestand te stagen, overschrijft dat de eerder gestarte versie van dat bestand in het staging gebied).
In je vraag stel je vervolgens het volgende:
Als ik terug wil naar een vorige commit gebruik ik: git reset --hard HEAD En git geeft terug: HEAD is nu op 820f417 micro
Hoe zet ik dan de bestanden op mijn harde schijf terug naar die vorige commit?
Als je git reset --hard <SOME-COMMIT>
doet, dan zal Git:
master
) terug zetten naar <SOME-COMMIT>
.<SOME-COMMIT>
gecommit zijn.HEAD
wijst naar je huidige branch (of huidige commit), dus het enige dat git reset --hard HEAD
zal doen is het weggooien van alle ongecommitteerde wijzigingen die je hebt.
Dus, stel dat de goede commit waar je naar terug wilt gaan f414f31
is. (Je kunt dat vinden via git log
of elke andere geschiedenis browser.) Je hebt dan een paar verschillende opties, afhankelijk van wat je precies wilt doen:
Verander je huidige branch om in plaats daarvan naar de oudere commit te wijzen. Je zou dat kunnen doen met git reset --hard f414f31
. Maar, dit herschrijft de geschiedenis van je branch, dus je zou het moeten vermijden als je'deze branch met iemand gedeeld hebt. Ook zullen de commits die je na f414f31
gedaan hebt niet langer in de historie van je master
branch staan.
Maak een nieuwe commit aan die precies dezelfde staat van het project vertegenwoordigt als f414f31
, maar voeg dat gewoon toe aan de historie, zodat je geen historie verliest. Je kunt dat doen met de stappen voorgesteld in dit antwoord - zoiets als:
git reset --hard f414f31
git reset --soft HEAD@{1}
git commit -m "Terugkeren naar de staat van het project op f414f31"
WAARSCHUWING:
git clean -f
zal untracked bestanden verwijderen, wat betekent dat ze'voorgoed weg zijn omdat ze'niet in het archief zijn opgeslagen. Zorg ervoor dat je echt alle untracked bestanden wilt verwijderen voordat je dit doet.
Probeer dit en zie git clean -f
.
git reset --hard
zal niet-getrackte bestanden niet verwijderen, terwijl git-clean
alle bestanden uit de getrackte hoofdmap zal verwijderen die niet onder Git tracking vallen.
Als alternatief, zoals @Paul Betts zei, kun je dit doen (pas wel op - dat verwijdert ook alle genegeerde bestanden)
git clean -df
git clean -xdf
LET OP! Dit zal ook genegeerde bestanden verwijderen