Hoe werkt Git Reset eigenlijk? Zachte, harde en gemengde resets uitgelegd

0
276

git reset is een krachtig commando dat de geschiedenis van je Git-repository kan wijzigen en fouten die je hebt gemaakt kan herstellen. Hoewel de naam het eng maakt om te gebruiken, is het eigenlijk vrij eenvoudig, dus laten we het hebben over hoe het werkt.

Wat is de Git HEAD?

Voordat we begrijpen hoe resets werken, moeten we het hebben over de Git HEAD.

“HEAD” is gewoon een alias voor je huidige werkende commit. Je kunt het zien als een kop van een platenspeler, waarbij de positie ervan bepaalt welke gegevens worden gebruikt. Als je momenteel de master-branch gebruikt, zal de HEAD op zijn laatst in die branch worden vastgelegd.

Ondanks dat het een alias is voor een commit, verwijst de HEAD meestal niet rechtstreeks naar een commit. Het wijst naar een branch en gebruikt automatisch de laatste commit. Het kan ook direct naar een commit wijzen, die bekend staat als “detached HEAD,” hoewel dat niet uitmaakt voor git reset.

Hoe werkt Git Reset?

Git's commit geschiedenis wordt opgeslagen als een boom van commits en is bedoeld om voor het grootste deel onveranderlijk te zijn. Soms is het echter nodig om deze geschiedenis aan te passen, en dat is waar git reset in het spel komt.

Advertentie

Elke commit linkt naar de commit ervoor en kan vertakken in verschillende ledematen die uiteindelijk weer worden samengevoegd in de hoofdtak. In beide gevallen wijst de HEAD meestal naar de laatste commit in de branch waar je aan werkt.

Dus wat gebeurt er als je een commit doet die je wilt terugdraaien?

Nou, als je git reset uitvoert, wordt de HEAD in feite teruggezet en blijven alle commits ervoor hangen. Dit herschrijft de gewoonlijk onveranderlijke Git-geschiedenis om de commits voor de HEAD kwijt te raken.

Dit kan om veel redenen erg handig zijn. Misschien heb je een commit gedaan, daarna wat extra wijzigingen aangebracht en wilde je het hele ding als één commit pushen. Je zou terug kunnen gaan naar de vorige commit, en dan opnieuw correct committen.

Of misschien heb je per ongeluk een commit gedaan die enkele wijzigingen bevatte die je niet wilde bijhouden. Dit kan heel moeilijk zijn om erachter te komen als je niet weet hoe git reset werkt, maar door de HEAD te resetten en dan alleen de juiste wijzigingen te ensceneren, wordt dit bereikt. Merk op dat dit anders is dan git revert, dat commits ongedaan maakt.

GERELATEERD: Hoe teruggekeerde commits in een Git-repository te herstellen

< p>Er zijn drie verschillende soorten resets in Git, en ze verschillen allemaal op basis van hoe ze omgaan met de commits die blijven hangen. Ze herschrijven allemaal de Git-geschiedenis, en ze verplaatsen allemaal de HEAD terug, maar ze gaan anders om met de wijzigingen:

  • git reset –soft, die je bestanden bewaart en alle wijzigingen automatisch terugzet .
  • git reset –hard, die alle wijzigingen volledig vernietigt en uit de lokale map verwijdert. Gebruik dit alleen als je weet wat je doet.
  • git reset –mixed, wat de standaard is, en houdt alle bestanden hetzelfde, maar zet de wijzigingen uit. Dit is de meest flexibele optie, maar ondanks de naam wijzigt het geen bestanden.

Advertentie

Het verschil tussen zacht en gemengd is of de veranderingen geënsceneerd zijn of niet. Staged is in feite een tussenzone tussen de lokale map en Git-geschiedenis. git add stages-bestanden, en git commit schrijft ze naar de geschiedenis. In beide gevallen wordt de lokale map niet beïnvloed, het verandert alleen de status van Git's tracking van die wijzigingen.

In principe zijn zachte en gemengde resets grotendeels hetzelfde en kunt u de wijzigingen behouden , en harde resets zullen je lokale directory volledig terugzetten naar waar het was op het moment van de commit.

Git Reset gebruiken

Als je eenmaal begrijpt wat er aan de hand is, is het gebruik van git reset ongelooflijk eenvoudig. Om te resetten heb je een verwijzing nodig naar de commit waar je naar terug wilt gaan. Je kunt dit krijgen door reflog:

git reflog

Kopieer de zevencijferige code aan de rechterkant. Als je net vastzit in vim, druk dan op Q, en voer misschien git config –global core.editor “nano” uit.

Vervolgens kun je teruggaan naar de doel-commit:

git reset –gemengd a560612

Of je kunt commits targeten op basis van hun positie ten opzichte van de HEAD. Het volgende commando richt zich op de commit net voor de HEAD, wat een handige afkorting is als je de laatste commit moet resetten:

git reset –mixed HEAD~

Als je een Git-client zoals Fork gebruikt , resetten is net zo eenvoudig als rechtsklikken op de doel-commit en het selecteren van “Reset”:

Moet u ooit een harde reset uitvoeren?

Je zou eigenlijk alleen zachte of gemengde resets moeten gebruiken, maar als je je repository zo verprutst hebt dat je hem volledig moet resetten, kun je de volgende reeks opdrachten gebruiken om hem weer helemaal normaal te maken.< /p> git fetch origin git checkout master git reset –hard origin/master git clean -d –force Advertisement

Natuurlijk kun je altijd de klassieker “delete your repository trekken en opnieuw- kloon van Github,” maar deze manier is in ieder geval Git goedgekeurd, en reset slechts een enkele branch.