Tänk dig att du arbetar med en funktion i ett Git-kontrollerat mjukvaruprojekt. Du är rätt i mitten av att göra några ändringar när du får en förfrågan om att fixa en kritisk bugg. För att börja lösa problemet behöver du en ny filial och en ren arbetsmapp. När det gäller grundläggande Git-kommandon har du två alternativ:
git reset - hard
för att ta bort dina icke-godkända ändringar.Det tidigare alternativet förlorar allt ditt arbete medan den senare resulterar i ett partiellt åtagande som inte är meningsfullt. Ingen av dessa scenarier är allt som är önskvärt.
Det är här git stash
kommando kommer in i spel. Tycka om git reset - hard
, Det ger dig en ren arbetsmapp, men det registrerar också dina ofullständiga förändringar internt. Efter att du har fastställt den kritiska felet kan du tillämpa dessa ändringar och hämta upp var du slutade. Du kan tänka dig git stash
som en pausknapp för ditt pågående arbete.
Denna handledning förutsätter att du har installerat Git och att du är bekant med det grundläggande arbetsflödet. Du borde vara bekväma stegvisa förändringar, skapa förpliktelser och arbeta med grenar. Du behöver också ett Git-arkiv för att experimentera på.
Innan du kan springa git stash
, Du måste ha några obestämda ändringar i ditt Git-arkiv. Om du till exempel redigerar en fil som heter foo.py
, din git status
utsignalen skulle se ut så här:
På grenmästare Ändringar inte iscensatte för commit: (använd "git add... "för att uppdatera vad som kommer att begås) (använd" git checkout -- ... "för att avbryta ändringar i arbetsboken) modifierad: foo.py
För att stash dessa ändringar, kör bara git stash
utan några argument.
git stash
Detta tar både dina iscensatte och ostegrade ändringar, registrerar dem internt och rensar sedan arbetsmappen. Det här ger dig möjlighet att byta till en ny filial och utveckla andra funktioner utan att oroa dig för att du deltar i partiell delning.
När du är redo att komma tillbaka till ditt ofullständiga arbete, kör följande kommando för att återanvända de stashed ändringarna:
git stash pop
Den senaste stashed-ändringen kommer att visas i din arbetsmapp och du kan fortsätta exakt var du slutade. Det är allt som finns där.
Mycket som git-sammanslagning
kommando, git stash pop
kan leda till konflikter om samma delar av källkoden har ändrats sedan du körde git stash
. När detta händer ser du följande meddelande efter körning git stash pop
:
Automatisk sammanslagning foo.py CONFLICT (innehåll): Sammanfoga konflikt i foo.py
Du hittar också den drabbade filen som anges under Unmerged paths
avsnitt i git status
utdata, liksom de drabbade raderna i källfilen.
<<<<<<< Updated upstream print("Recently committed changes"); ======= print("Incomplete work"); >>>>>>> Stashed förändringar
Du måste manuellt lösa konflikten i källfilen, men du brukar inte begå den omedelbart som om du skulle efter en git-sammanslagning
konflikt. För det mesta fortsätter du att arbeta med din oavslutade funktion tills du har förberett ett meningsfullt engagemang. Då kan du helt enkelt lägga till det i indexet och begå det som vanligt. Med andra ord kan du behandla git stash pop
konflikter precis som alla andra obestämda förändringar.
För de flesta scenarier är ovanstående kommandon allt du behöver när det gäller en pausknapp. Men förstå hur stashed förändringar är representerade öppnar dörren för mer avancerad användning.
Hittills har vi bara pratat om att stashing en enda förändring. Men varje gång du kör git stash
, Obligatoriska ändringar lagras på en stapel. Det betyder att du kan stash flera ändringsprogram samtidigt.
Detta är användbart i de tidiga utvecklingsstadierna när du inte är säker på vilken riktning du vill ta. I stället för att förlora dina ändringar med git reset - hard
, du kan hålla dina pågående ögonblicksbilder på stash-stacken om du vill tillämpa en av dem senare.
Du kan inspektera stash-stacken med lista
parameter.
git stash lista
Om du tidigare hade kört git stash
tre gånger, skulle detta ge något som följande:
stash @ 0: WIP på ny funktion: 5cedccc Prova något galet stash @ 1: WIP på ny funktion: 9f44b34 Ta en annan riktning stash @ 2: WIP på ny funktion: 5acd291 Börja ny funktion
De git stash pop
kommandot tillämpar alltid den senaste ögonblicksbilden, den som är överst på stash-stacken. Men det är också möjligt att välja och välja vilken stashed ögonblicksbild som du vill använda igen med tillämpa
kommando. Om du till exempel vill tillämpa den andra uppsättningen av ändringar, skulle du använda följande kommando:
git stash tillämpa stash @ 1
Precis som git stash pop
, ändringarna kommer att visas igen i din arbetsregister och du kan fortsätta arbeta med den ofullständiga funktionen. Observera att detta inte automatiskt tar bort ögonblicksbilden från stash-stacken. Istället måste du manuellt radera det med släppa
kommando.
git stash drop stash @ 1
Återigen är arbetet med stash-stacken mer av ett kantfall för de flesta Git-användare. De git stash
och git stash pop
Kommandon bör räcka för de flesta av dina behov, även om git stash lista
kan också vara användbar om du glömde var din sista stash-operation ägde rum.
Att begå meningsfulla ögonblicksbilder ligger i hjärtat av alla Git-arbetsflöden. Formålliga, inkapslade fördrag gör det mycket lättare att navigera i projekthistoriken, ta reda på var fel har introducerats och återställa förändringar.
Medan inte exakt en daglig kommando, git stash
kan vara ett mycket bekvämt verktyg för att skapa meningsfulla förpliktelser. Det låter dig lagra ofullständigt arbete samtidigt som du undviker behovet av att begå partiella snapshots till din permanenta projekthistorik. Kom ihåg nästa gång du önskar att du kan pausa vad du än jobbat på och komma tillbaka till det senare.