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.
Note
|
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 |
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.
Note
|
Det är sant att |
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 ch07-git-tools.asc.
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.
Important
|
Det är viktigt att förstå att |
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 ch03-git-branching.asc; 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 ch10-git-internals.asc 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.