Åtgärda enkla misstag
Ibland går saker fel. Du kanske glömmer att lägga till en ny fil, eller så kanske du lägger till en fil av misstag. Du kanske har gjort ett stavfel i din senaste incheckning eller så har du checkat in något som du inte hade för avsikt att göra. Det är lätt hänt att en fil tas bort av misstag.
Med Git kan du tryggt göra ändringar eftersom det alltid finns ett sätt att komma tillbaka till ett tidigare tillstånd. Du kan till och med ändra incheckningshistoriken i Git så länge du endast ändrar incheckningar som inte har delats.
Ändra en incheckning: --amend-flagga
I föregående övning uppdaterade du filen index.html för att ändra sökvägen till formatmallen. Du bör ha lagt till följande instruktion:
<link rel="stylesheet" href="CSS/site.css">
Anta att du upptäcker att du gjorde ett fel när du angav -instruktionen. I stället för att ange mappsökvägen som CSS
anger CS
du :
<link rel="stylesheet" href="CS/site.css">
När du uppdaterar sidan i webbläsaren ser du att CSS-formatmallen inte tillämpas. När du har undersökt det inser du att du angav sökvägsvärdena felaktigt.
Därför uppdaterar du index.html med rätt sökväg till formatmallen. Nu kan du bara checka in den korrigerade versionen av index.html, men i stället föredrar du att placera den i samma incheckning som originalet. Med --amend
alternativet kan git commit
du ändra historik (och hur ofta får man chansen att ändra historik?).
git commit --amend --no-edit
Alternativet --no-edit
instruerar Git att genomföra ändringen utan att ändra incheckningsmeddelandet. Du kan också använda --amend
för att redigera ett incheckningsmeddelande, för att lägga till filer som av misstag utelämnats från incheckningen eller för att ta bort filer som har lagts till av misstag.
Kommentar
Möjligheten att ändra historiken är en av de mest kraftfulla funktionerna i Git. Precis som med de flesta elverktyg måste du använda det noggrant. I synnerhet är det en dålig idé att ändra eventuella incheckningar som har delats med en annan utvecklare, eller som har publicerats på en delad lagringsplats, till exempel GitHub.
Återställa en borttagen fil: git-utcheckning
Anta att du har gjort en ändring i en källkodsfil som bröt hela projektet, så du vill återgå till den tidigare versionen av filen. Eller kanske tog du oavsiktligen bort en fil helt och hållet. Git gör det enkelt att hämta en tidigare version, även om den aktuella versionen inte längre finns. Din bästa vän i den här situationen är git-utcheckningskommandot.
git checkout
har flera användningsområden, men i nästa övning använder vi den för att återställa en borttagen fil. git checkout
uppdaterar filer i arbetsträdet så att de matchar versionen i indexet eller i det angivna trädet.
Om du av misstag har tagit bort en fil kan du återställa den genom att ta tillbaka versionen från indexet till arbetsträdet med hjälp av det här kommandot:
git checkout -- <file_name>
Du kan också checka ut en fil från en tidigare incheckning (vanligtvis chefen för en annan gren), men standardvärdet är att hämta filen från indexet. --
i argumentlistan används för att separera incheckningen från listan över filsökvägar. Det är inte absolut nödvändigt i det här fallet, men om du hade en gren med namnet <file_name> (kanske för att det är namnet på filen som bearbetas i den grenen), --
skulle det hindra Git från att bli förvirrad.
Senare får du lära dig att du även använder checkout
för att växla grenar.
Återställa filer: git-återställning
Du kan också ta bort en fil med hjälp git rm
av . Det här kommandot tar bort filen på disken, men den har även Git-post för borttagningen av filen i indexet.
Så om du körde det här kommandot:
git rm index.html
git checkout -- index.html
Git skulle i så fall inte utan vidare återställa index.html! I stället får du ett felmeddelande som det här exemplet:
error: pathspec 'index.html' did not match any file(s) known to git.
För att återställa index.html måste vi använda en annan teknik: git reset
. Du kan använda git reset
för att avaktivering av ändringar.
Du kan återställa index.html med hjälp av följande två kommandon:
git reset HEAD index.html
git checkout -- index.html
Här ångrar git reset
mellanlagringen av filborttagningen i Git. Med det här kommandot återgår filen till indexet, men filen tas fortfarande bort på disken. Du kan sedan återställa den till disken från indexet med hjälp git checkout
av .
Här är ännu ett "Aha!"-ögonblick för nya Git-användare. Många VCSe gör filer skrivskyddade för att säkerställa att endast en person i taget kan göra ändringar. användare använder ett orelaterat checkout
kommando för att hämta en skrivbar version av filen. De använder även checkin
för en åtgärd som liknar det Git gör med en kombination av add
, commit
och push
. Detta faktum orsakar ibland förvirring när människor börjar använda Git.
Återställ en incheckning: git-återställning
Det sista viktiga kommandot du behöver känna till för att åtgärda misstag med Git är git revert
. git checkout
fungerar bara i situationer där ändringarna som ska ångras finns i indexet. När du har gjort ändringar måste du använda en annan strategi för att ångra dem. I det här fallet kan vi använda git revert
för att återställa vår tidigare incheckning. Det fungerar genom att göra en annan incheckning som avbryter den första incheckningen.
Vi kan använda git revert HEAD
för att göra en incheckning som är raka motsatsen till vår senaste incheckning, ångra den tidigare incheckningen samtidigt som all historik lämnas intakt. Delen HEAD
av kommandot säger bara till Git att vi bara vill "ångra" den senaste incheckningen.
Du kan också ta bort den senaste incheckningen git reset
med hjälp av kommandot :
git reset --hard HEAD^
Git erbjuder flera typer av återställningar. Standardvärdet är --mixed
, som återställer indexet men inte arbetsträdet. Det flyttar även HEAD om du anger en annan incheckning. Alternativet --soft
flyttas HEAD
bara, och det lämnar både indexet och arbetsträdet oförändrade. Det här alternativet lämnar alla dina ändringar som "ändringar som ska checkas in", som git status
det skulle uttryckas. En --hard
återställning ändrar både indexet och arbetsträdet så att de matchar den angivna incheckningen. Alla ändringar som du har gjort i spårade filer ignoreras.