Ibland behöver man avbryta det man håller på med för att t ex byta branch och fortsätta med annan kod. Hur gör man då med de filer man arbetar med för tillfället utan att behöva göra en git commit? Det du behöver är git stash.

Vad gör git stash?

git stash lägger undan dina filer till en temporär plats medan du t ex måste byta branch för att göra annat så länge.

Stashing takes the dirty state of your working directory — that is, your modified tracked files and staged changes — and saves it on a stack of unfinished changes that you can reapply at any time.

Exempel

Låt oss skapa ett enkelt scenario där vi har några enkla filer i branchen master:

1
2
3
4
5
6
7
8
.
├── index.php
├── css
│   └── main.css
├── js
│   └── functions.js
└── scss
    └── main.scss

Nu ska vi lägga till en cool funktion till vår webbsida och skapar därför en ny branch som vi döper till cool-new-feature.

1
2
git branch cool-new-feature
git checkout cool-new-feature

eller om man vill göra bägge kommandon i samma svep:

1
git checkout -b cool-new-feature

Vi lägger till filen js/cool-new-feature.js och länkar in den i index.php. Nu har vi en modifierad fil (index.php) samt en ny fil (js/cool-new-feature.js).

Låt oss säga att det ska göras en ändring i CSS-filen som inte kan vänta. Ändringen har inget med vår coola nya funktion att göra och eftersom vi inte vill commita den ännu vill vi göra en ny branch (baserad på master) och stoppa undan våra ‘dirty’, eller modifierade, filer så länge i en stash.

Skulle vi försöka lägga filerna i en stash nu kommer vi att få ett felmeddelande eftersom filen js/cool-new-feature.js inte ännu lagts till i index. Det gör vi genom att skriva:

1
git add js/cool-new-feature.js

Nu har vi inga oindexerade filer och kan då spara undan dem i en stash.

1
git stash save "Cool funktion, ej färdig"

Vi kan kontrollera att det sparats undan genom att skriva

1
git stash list

Varje stash får ett löpnummer för att kunna hanteras separat. Så här ser det ut efter att vår stash har lagts till:

1
stash@{0}: On cool-new-feature: Cool funktion, ej färdig

Nu kan vi byta branch till master för att genomföra ändringen och när det är klart och vi återigen är i branchen cool-new-feature kan vi hämta våra stashade filer igen.

Om vi vet att de stashade filerna ligger högst upp i stashlistan eller om det bara finns en post i listan kan vi snabbt hämta dem och radera dem från listan i ett svep:

1
git stash pop

Har du flera sparade stashes i listan kan du ta tillbaka en specifik post i listan genom att ange indexnumret enligt följande där {0} är index:

1
git stash apply stash@{0}

Enligt dokumentationen ska man skriva som ovan men i skrivande stund måste jag ange stash inom citationstecken, dvs git stash apply 'stash@{0}'.

Efter att du hämtat filerna från index 0 i stashlistan vill du förmodligen radera dem och det gör du så här:

1
git stash drop stash@{0}

Enligt dokumentationen ska man skriva som ovan men i skrivande stund måste jag ange stash inom citationstecken, dvs git stash drop 'stash@{0}'.

Kommandon

  • git stash save "Meddelande"
    Sparar alla ‘dirty state’ filer, dvs modifierade, till en stash. Nya filer som inte lagts till index måste läggas till med git add <filnamn>.
  • git stash list
    Listar alla stashes som du sparat undan.
  • git stash pop
    Tar den senaste stashen och lägger tillbaka filerna i working directory.
  • git stash apply stash@{n} Tar en specifik stash ({n} == index på stashen) och lägger tillbaka filerna i working directory.
  • git stash drop stash@{n} Raderar en specifik stash ({n} == index på stashen) från stash list.

Länkar

Git lingo

När man som svensk försöker kommunicera med andra låter man förmodligen som Swedish Chef i Mupparna.
Även om bjorne har gjort en fin parlör med översättningar av Git-kommandon, använder jag ändå svengelska när jag skriver.