Hur man tar bort dina förändringar med tillhörande namn och hittar det efteråt
Utvecklare måste ofta multitaska. Du kanske arbetar med en ny funktion och det kan finnas en begäran om att åtgärda ett fel. Eller så kan du vara huvudutvecklare för flera projekt.
När du byter mellan uppgifter vill du ibland inte begå oavslutat arbete. I dessa fall kan git stash-kommandot vara till stor hjälp. Det låter dig stapla dina ändringar och senare komma tillbaka till det oavslutade arbetet utan att lägga till onödiga åtaganden i dina git-förråd.
Ett arbetsflöde för Git Stash
Låt oss initiera en git-masterfilial och begå en fil ReadMe.Text.
$ mkdir my_project$ cd my_project /
$ git init
$ touch ReadMe.Text
$ git add -A
$ git commit -m "Initialisera"
Låt oss nu lägga till en annan fil som heter a.txt till huvudgrenen.
$ touch a.Text$ git add -A
$ git commit -m "Lagt till en.Text"
Om du kontrollerar historiken ser du:
$ git log - onlined79f7aa Tillagt a.Text
9434d7e Initiera
Låt oss nu skapa en feature1-gren och lägga till en b.txt-fil:
$ git filialfunktion1$ git kassafunktion 1
$ touch b.Text
$ git add -A
$ git commit -m "Lagt till b.Text"
Öppna din b.txt-fil i en redigerare och lägg i raden:
Jag håller på att ändra detta till ..Och spara filen. Om du kontrollerar din git-status ser du följande:
$ git-statusOm filialfunktion 1
Ändringar som inte genomförs för att begå:
(använd "git add
(använd "git checkout --
modifierad: b.Text
inga ändringar har lagts till förpliktelsen (använd "git add" och / eller "git commit -a")
Antag att du i det här skedet får en begäran om att uppdatera a.txt-fil på huvudgrenen. Men du är inte klar med b.txt-fil. Om du försöker kolla in huvudgrenen får du följande fel:
$ git checkout masterfel: Dina lokala ändringar av följande filer skrivs över i kassan:
b.Text
Snälla, gör dina ändringar eller stash dem innan du kan byta gren.
Avbryter
Men du vill inte begå det oavslutade arbetet i b.Text. Du kan använda git stash i den här situationen:
$ git stashSparad arbetskatalog och indextillstånd WIP på funktion1: 2cfe39b Tillagd b.Text
HEAD är nu på 2cfe39b Lagt till b.Text
Om du markerar b.txt, den ska vara tom:
$ katt b.Text$
Om du kontrollerar stash ser du:
$ git stash-listastash @ 0: WIP på funktion1: 2cfe39b tillagd b.Text
Om du försöker kolla in huvudgrenen bör du kunna göra det nu:
$ git checkout masterBytt till filial "master"
Antag att du gör de nödvändiga ändringarna på mastern och sedan går tillbaka till feature1-grenen:
$ git kassafunktion 1Din b.txt är fortfarande tom:
$ katt b.Text$
Men om du får ändringarna från stash med följande kommando:
$ git stash gällerOm filialfunktion 1
Ändringar som inte genomförs för att begå:
(använd "git add
(använd "git checkout --
modifierad: b.Text
inga ändringar har lagts till förpliktelsen (använd "git add" och / eller "git commit -a")
Kommandot stash Apply tog de stashed ändringarna och applicerade det på b.txt-fil
Du kan slutföra ditt arbete i b.txt min ändring av raden
Till
Fortsätt nu och gör dina ändringar:
$ git add -A$ git commit -m "Ändrad b.Text"
Att applicera en stash rensar inte automatiskt den från stashen. Du måste städa upp det manuellt:
$ git stash dropTappade ref / stash @ 0 (0a66a16b32633e8d564d08e38254c491c1b1d3be)
Varför Git Stash med namn?
Git stash är en stack. Så du kan fortsätta stapla dina ändringar.
Antag att du lägger till "X" till b.txt, stash det, lägg till ett "Y" till b.txt, stash det och lägg till ett “Z” i b.txt och stash den. Om du kontrollerar stashhistoriken ser du ungefär så här:
$ git stash-lista[e-postskyddad] 0: WIP på funktion1: 2d6f515 Ändrad b.Text
[e-postskyddad] 1: WIP på funktion1: 2d6f515 Ändrad b.Text
[e-postskyddad] 2: WIP på funktion1: 2d6f515 Modifierad b.Text
Du har inget sätt att veta vilken stash som har vilken förändring. När du stashar kan du använda spara alternativet för att lägga till kommentarer. Du kan använda kommentarerna för att bifoga ett namn till din stash och göra dem igenkännliga:
$ git stash spara "X"Sparad arbetskatalog och indexstatus På funktion1: X
HEAD är nu på 2d6f515 Modified b.Text
För att lägga till "X", "Y" och "Z" modifiering kan du få följande i din stash med spara alternativet för varje stash:
$ git stash-listastash @ 0: På funktion1: Z
stash @ 1: På funktion1: Y
stash @ 2: På funktion1: X
Nu har du ett namn för varje ändring du stashed. Tyvärr kan du inte använda namnet för att hämta stash. Du måste använda stash-numret. Antag att du vill få din "Y" -ändring. Du ser att [e-postskyddad] 1 är Y. Så du kan tillämpa ändringen på din nuvarande gren:
$ git stash applicera stash @ 1Och din b.txt ska ha ändringarna från [e-postskyddad] 1.
Du kan använda samma metod för att släppa en stash. Antag att du inser att du inte behöver X-stash längre. Du kan bara använda följande kommando för att ta bort det stash:
$ git stash drop stash @ 2Och stash borde vara borta:
$ git stash-listastash @ 0: På funktion1: Z
stash @ 1: På funktion1: Y
Kom ihåg att om du använder tillämpnings- och släppalternativen utan några parametrar kommer den att använda toppen av stapeln ([e-postskyddad 0)).
Slutsats
Kommandot git stash är ett kraftfullt sätt att hantera din arbetsyta. Att behärska detta kommando hjälper dig att arbeta mer effektivt.
Ytterligare studier:
- https: // git-scm.com / book / sv / v1 / Git-Tools-Stashing
Referenser:
Stack Overflow: hur-namn-och-hämta-a-stash-by-name-in-git