Git
Chapters ▾ 2nd Edition

2.4 Grunder i Git - Ångra saker

Ångra saker

Det finns tillfällen då du kanske vill ångra något. Här kommer vi att titta på några få grundläggande verktyg för att ångra ändringar du gjort. Var försiktig, för att du kan inte alltid ångra något som du ångrat. Detta är ett av några få områden i Git där du faktiskt kan förlora något om du gör det fel.

En av de vanligaste sakerna man vill ångra är ifall du sparar en version för tidigt och kanske glömmer att lägga till filer, alternativt om du skriver fel i ditt versionsmeddelande. Om du vill göra om versionen, göra ytterligare ändringar, preparera dem och skapa en ny version igen, så kan du använda valet --amend:

$ git commit --amend

Kommandot tar din preparationsyta och använder den för versionen. Om du inte gjort några ändringar sedan din förra version (till exempel om du kör kommandot direkt efter att du skdapat en version) kommer ögonblicksbilden att se identisk ut, och allt du kan ändra är ditt versionsmeddelande.

Samma editor som du använde när du gjorde din förra version öppnas, men den innehåller då ditt förra versionsmeddelande. Du kan ändra meddelandet som alltid, men det skriver över din tidigare sparade version.

Som exempel, om du sparar en version och sedan inser att du glömde lägga till ändringar i en fil du ville ha med i versionen så kan du göra något liknande detta:

$ git commit -m 'initial commit'
$ git add forgotten_file
$ git commit --amend

I slutändan får du en enda version — den andra versionen ersätter resultatet av den första.

Notera

Det är viktigt att förstå att när du gör ett tillägg till din senaste version, så ersätter du egentligen din gamla version med en helt ny, förbättrad version som knuffar undan den gamla versionen och lägger den nya versionen i dess ställe. I praktiken är det som att den föregående versionen aldrig fanns, och den kommer inte heller att visas i din versionshistorik.

Det uppenbara värdet i att göra tillägg på detta sätt är att göra mindre förbättringar till din senaste version utan att kladda ner din versionshistorik med meddelanden som “Hoppsan, glömde lägga till en fil” eller “Skit också, tryckfelsnisse i senaste versionen”.

Ångra en preparerad fil

Kommande två avsnitt demonstrerar hur man arbetar med prepareringsytan och ändringar i arbetskatalogen. Det trevliga är att kommandot du använder för att avgöra statusen på de två ytorna även påminner om hur man gör ändringar ogjorda till dem. Till exempel, säg att du har ändrat två filer och vill spara dem som två separata ändringar, men du har av misstag skrivit git add * och markerat båda att ingå i din nästa version. Hur kan du markera en av dem som oförbredd? Kommandot git status påminner dig:

$ git add *
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    renamed:    README.md -> README
    modified:   CONTRIBUTING.md

Under texten “Changes to be committed” (Ändringar att spara) står det git reset HEAD <file>... för att markera filen som oförberedd. Låt oss använda det rådet och flagga filen CONTRIBUTING.md som oförberedd:

$ git reset HEAD CONTRIBUTING.md
Unstaged changes after reset:
M	CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    renamed:    README.md -> README

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   CONTRIBUTING.md

Kommandot är lite märkligt, men fungerar. Filen CONTRIBUTING.md är modifierad men återigen inte förberedd för nästa version.

Notera

Det är sant att git reset kan vara ett farligt kommando, speciellt om du använder flaggan --hard. Dock, i scenariot ovan, så berörs inte filen i arbetskatalogen, så det är relativt säkert.

För nu är denna magiska användning allt du behvöver veta om kommandot git reset. Vi kommer att gå in i mer detalj kring vad reset gör och hur man använder det för att göra mycket intressanta saker i Reset Demystified.

Återställa en modifierad fil

Vad gör du om du inser att du inte vill behålla ändringarna i CONTRIBUTING.md? Hur kan man återställa den — återställa till så den såg ut i din senast sparade version (eller klonade, eller hur du nu fick in den i din arbetskatalog)? Som tur är ger git status oss en fingervisning om detta också. I förra exempelutskriften så såg det ut såhär:

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   CONTRIBUTING.md

Den talar uttryckligen om hur du kastar bort ändringarna som du gjort. Låt oss pröva:

$ git checkout -- CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    renamed:    README.md -> README

Du kan se att ändringarna nu är borta.

Viktigt

Det är viktigt att förstå att git checkout -- <file> är ett farligt kommando. Alla lokala ändringar i filen försvinner — Git bara kopierar den senaste versionen av filen och ersätter den gamla. Använd aldrig detta kommandot förutom om du är helt säker på att du inte vill ha dessa osparade lokala ändringarna.

Om du vill behålla ändringarna i filen men bara vill få dem ur vägen för nu, så kommer vi att gå igenom gömman och förgreningar i Git Branching; dessa är generellt sätt bättre vägar att ta.

Kom ihåg att allt som är sparat i en version (commit) i Git nästan alltid kan återskapas. Även versioner som var på grenar som tagits bort, eller versioner som skrivits över med flaggan --amend kan återskapas (se Data Recovery för återställning av data). Dock, det som du förlorar som aldrig sparats i en version kommer sannolikt aldrig mer se dagens ljus.

scroll-to-top