Hoe gebruik ik ‘git reset –hard HEAD’ om terug te keren naar een eerdere commit?

Ik weet dat Git wijzigingen bijhoudt die ik in mijn toepassing aanbreng, en het houdt ze vast totdat ik de wijzigingen vastleg, maar hier zit ik vast:

Als ik wil terugkeren naar een eerdere commit, gebruik ik:

git reset --hard HEAD

En Git keert 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 gewijzigd op mijn harde schijf…

Wat doe ik goed/fout?


Antwoord 1, autoriteit 100%

Ten eerste is het 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.

Aanvankelijk zeg je het volgende:

Dus ik weet dat Git wijzigingen bijhoudt die ik in mijn toepassing aanbreng, en het houdt ze vast totdat ik de wijzigingen vastleg, maar hier zit ik vast:

Dat is onjuist. Git registreert alleen de status van de bestanden wanneer je ze stage (met git add) of wanneer je een commit aanmaakt. Als je eenmaal een commit hebt gemaakt die je projectbestanden in een bepaalde staat heeft, zijn ze erg veilig, maar tot die tijd is Git niet echt bezig met het “volgen van wijzigingen” aan je bestanden. (bijvoorbeeld, zelfs als je git add doet om een ​​nieuwe versie van het bestand te stagen, overschrijft dat de eerder gefaseerde versie van dat bestand in het staging-gebied.)

In uw vraag stelt u vervolgens het volgende:

Als ik wil terugkeren naar een eerdere 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:

  • Maak je huidige branch (meestal master) terug naar <SOME-COMMIT>.
  • Maak vervolgens de bestanden in uw werkstructuur en de index (“staging area”) hetzelfde als de versies die zijn vastgelegd in <SOME-COMMIT>.

HEAD verwijst naar je huidige branch (of huidige commit), dus het enige dat git reset --hard HEAD zal doen, is alle niet-gecommitteerde wijzigingen die je hebt weggooien.

Dus, stel dat de goede commit waar je naar terug wilt gaan f414f31 is. (Je kunt dat vinden via git log of een willekeurige geschiedenisbrowser.) Je hebt dan een paar verschillende opties, afhankelijk van wat je precies wilt doen:

  • Verander in plaats daarvan je huidige branch om naar de oudere commit te wijzen. Je zou dat kunnen doen met git reset --hard f414f31. Dit herschrijft echter de geschiedenis van je branch, dus je moet het vermijden als je deze branch met iemand hebt gedeeld. Ook zullen de commits die je deed na f414f31 niet langer in de geschiedenis van je master branch staan.
  • Maak een nieuwe commit die exact dezelfde status van het project vertegenwoordigt als f414f31, maar voeg dat gewoon toe aan de geschiedenis, zodat je geen geschiedenis verliest. U kunt dat doen met behulp van de stappen die worden voorgesteld in dit antwoord – zoiets als:

    git reset --hard f414f31
    git reset --soft HEAD@{1}
    git commit -m "Reverting to the state of the project at f414f31"
    

Antwoord 2, autoriteit 21%

WAARSCHUWING: git clean -f verwijdert niet-getrackte bestanden, wat betekent dat ze voorgoed verdwenen zijn omdat ze niet in de repository zijn opgeslagen. Zorg ervoor dat je echt alle niet-getrackte bestanden wilt verwijderen voordat je dit doet.


Probeer dit en zie git clean -f.

git reset --hard verwijdert geen niet-getrackte bestanden, terwijl git-clean alle bestanden uit de bijgehouden hoofdmap verwijdert die niet onder Git-tracking staan.

Als alternatief, zoals @Paul Betts zei, kun je dit doen (let op – dat verwijdert ook alle genegeerde bestanden)

  • git clean -df
  • git clean -xdf LET OP! Hiermee worden ook genegeerde bestanden verwijderd

Uitleg van vlaggen:

-d verwijdert recursief alle bestanden in mappen

-f

Als de Git-configuratievariabele clean.requireForce niet is ingesteld op
false, git clean weigert bestanden of mappen te verwijderen tenzij
gegeven -f of -i. Git weigert niet-getrackte geneste git . te wijzigen
repositories (mappen met een .git-submap) tenzij een tweede -f
wordt gegeven.

-x Gebruik geen standaard negeerregels maar die gespecificeerd door -e. Dit kan worden gebruikt om een ​​schone build te starten.

Bron: Man-pagina’s

LEAVE A REPLY

Please enter your comment!
Please enter your name here

six + 11 =

Other episodes