Hur fungerar Git Reset egentligen? Mjuka, hårda och blandade återställningar förklaras

0
170

git reset är ett kraftfullt kommando som kan ändra historiken för ditt Git -arkiv och åtgärda misstag du gjort. Även om namnet gör att det verkar läskigt att använda, är det faktiskt ganska enkelt, så låt oss prata om hur det fungerar.

Vad är Git HEAD?

Innan vi förstår hur återställningar fungerar måste vi prata om Git HEAD.

“ HEAD ” är helt enkelt ett alias för ditt nuvarande arbetsåtagande. Du kan tänka på det som ett skivspelarhuvud, där positionen för det avgör vilken data som används. Om du för närvarande använder huvudgrenen kommer HEAD att vara det senaste åtagandet i den grenen.

Trots att det är ett alias för ett åtagande pekar HEAD faktiskt inte direkt på ett åtagande för det mesta. Den pekar mot en gren och använder automatiskt det senaste engagemanget. Det kan också peka på ett åtagande direkt, som kallas “ fristående HEAD, ” även om det inte spelar någon roll för git-återställning.

Hur fungerar Git Reset?

Gits engagemangshistorik lagras som ett åtagandeträd och är avsedd att vara oföränderlig för det mesta. Ibland är det emellertid nödvändigt att ändra denna historik, och det är där git -återställning spelar in.

Annonsering

Varje åtagande länkar till åtagandet före det och kan förgrena sig ut i olika lemmar som så småningom kommer att slås samman igen i huvudgrenen. I båda fallen pekar huvudet vanligtvis på det senaste åtagandet i vilken gren du än arbetar med.

Så vad händer när du gör ett åtagande som du vill återställa?

Tja, kör git -återställning flyttar i huvudsak HEADEN tillbaka och låter alla åtaganden framför det hänga. Detta skriver om den vanligtvis oföränderliga Git-historien för att bli av med åtagandena framför HEAD.

Detta kan vara ganska användbart av många skäl. Kanske gjorde du ett åtagande, gjorde sedan några ytterligare ändringar och ville driva det hela som ett åtagande. Du kan återställa till föregående åtagande och sedan göra om rätt.

Eller så har du av misstag gjort en åtagande som inkluderade några ändringar som du inte ville spåra. Detta kan vara mycket svårt att räkna ut om du inte vet hur git -återställning fungerar, men om du återställer HEAD och sedan bara gör rätt ändringar kommer du att uppnå detta. Observera att detta är annorlunda än git revert, vilket omvandlar åtaganden.

RELATERAT: Hur man återställer återställda åtaganden i ett Git -arkiv

Det finns tre olika typer av återställningar i Git, och de skiljer sig alla beroende på hur de hanterar de åtaganden som blir kvar. De skriver alla om Git -historiken, och de flyttar alla HEADEN tillbaka, men de hanterar förändringarna annorlunda:

  • git reset –soft, som kommer att behålla dina filer och återställa alla ändringar automatiskt .
  • git reset –hard, vilket kommer att förstöra alla ändringar och ta bort dem från den lokala katalogen. Använd det här bara om du vet vad du gör.
  • git reset –mixed, vilket är standard, och håller alla filer densamma men avstannar ändringarna. Detta är det mest flexibla alternativet, men trots namnet ändrar det inte filer.

Annonsering

Skillnaden mellan mjuk och blandad är om ändringarna är iscensatta eller inte. Iscensatt är i grunden en mellanzon mellan den lokala katalogen och Git-historien. git lägg till etappfiler och git commit skriver dem till historiken. I båda fallen påverkas den lokala katalogen inte, det ändrar bara tillståndet för Gits spårning av dessa ändringar.

I grund och botten är mjuka och blandade återställningar i stort sett desamma och gör att du kan behålla ändringarna, och hårda återställningar kommer helt att ställa tillbaka din lokala katalog till den den var vid den tiden av åtagandet.

Använda Git Reset

När du väl förstår vad som händer är det faktiskt otroligt enkelt att använda git reset. För att återställa behöver du en referens till åtagandet du vill flytta tillbaka till. Du kan få detta genom att köra reflog:

git reflog

Kopiera den sjusiffriga koden till höger. Om du bara fastnade i vim trycker du på Q och kanske kör git config –global core.editor “nano”.

Sedan kan du återställa till målåtagandet:

git reset –blandat a560612

Eller så kan du rikta in åtaganden baserat på deras position i förhållande till HEAD. Följande kommando är inriktat på åtagandet precis före HEAD, vilket är användbart stenografi om du behöver återställa den senaste begäran:

git reset –mixed HEAD ~

Om du använder en Git -klient som Fork , återställning är lika enkelt som att högerklicka på målåtagandet och välja “ Återställ &#8221 ;:

Ska du någonsin återställa?

Du borde egentligen bara använda mjuka eller blandade återställningar, men om du förstörde ditt förråd så illa att du måste återställa det helt, du kan använda följande kommandosekvens för att helt återställa det till det normala.

git hämta ursprung git checkout master git reset –hard origin/master git clean -d –force Advertisement

Naturligtvis kan du alltid dra den klassiska “ ta bort ditt arkiv och klona om från Github, ” men detta sätt är åtminstone Git -godkänt och återställer bara en enda gren.