Stel je voor dat je aan een functie werkt in een Git-gestuurd softwareproject. U zit midden in het maken van enkele wijzigingen wanneer u een verzoek ontvangt om een kritieke bug te repareren. Om het probleem op te lossen, hebt u een nieuwe vestiging en een schone werkmap nodig. Als het gaat om standaard Git-commando's, heb je twee opties:
git reset --hard
om uw niet-gecommiteerde wijzigingen te verwijderen.De eerste optie verliest al je werk, terwijl de laatste optie resulteert in een gedeeltelijke commit die niet zinvol is. Geen van deze scenario's is zo wenselijk.
Dit is waar de git stash
commando komt om de hoek kijken. Net zoals git reset --hard
, het geeft je een schone werkmap, maar het slaat ook je onvolledige veranderingen intern op. Nadat je de kritieke bug hebt opgelost, kun je deze wijzigingen opnieuw toepassen en verdergaan waar je was gebleven. Je kunt denken aan git stash
als een "pauzeknop" voor uw lopende werk.
Deze tutorial veronderstelt dat je Git hebt geïnstalleerd en dat je bekend bent met de standaardworkflow. Je moet comfortabel zijn om veranderingen te transformeren, commits te creëren en met branches te werken. Je hebt ook een Git-repository nodig om op te experimenteren.
Voordat je kunt rennen git stash
, je moet een aantal niet-gecommiteerde wijzigingen in je Git-repository hebben. Bijvoorbeeld als u een bestand bewerkt met de naam foo.py
, jouw git status
uitvoer ziet er als volgt uit:
Op branchemaster Veranderingen niet geënsceneerd voor commit: (gebruik "git add... "om bij te werken wat wordt vastgelegd) (gebruik" git checkout " -- ... "om wijzigingen in de werkmap ongedaan te maken) gewijzigd: foo.py
Om deze wijzigingen op te slaan, voert u eenvoudig uit git stash
zonder enige argumenten.
git stash
Hiermee worden zowel uw gefaseerde als niet-gestaggede wijzigingen doorgevoerd, intern vastgelegd en vervolgens de werkmap gewist. Dit geeft je de mogelijkheid om over te schakelen naar een nieuwe branch en andere functies te ontwikkelen zonder je zorgen te maken dat je gedeeltelijke commit iets verprutst.
Wanneer u klaar bent om terug te gaan naar uw onvolledige werk, voert u de volgende opdracht uit om de opgeslagen wijzigingen opnieuw toe te passen:
git stash pop
De meest recent opgeslagen wijzigingenset wordt opnieuw weergegeven in uw werkdirectory en u kunt doorgaan waar u was gebleven. Dat is alles wat er is.
Net als de git fuseren
commando, git stash pop
kan resulteren in conflicten als dezelfde delen van de broncode zijn gewijzigd sinds u het hebt uitgevoerd git stash
. Wanneer dit gebeurt, ziet u het volgende bericht na het uitvoeren git stash pop
:
Foo.py CONFLICT (inhoud) automatisch samenvoegen: conflict samenvoegen in foo.py
U vindt ook het betreffende bestand onder de Onverharde paden
sectie in de git status
uitvoer, evenals de betreffende regels in het bronbestand.
<<<<<<< Updated upstream print("Recently committed changes"); ======= print("Incomplete work"); >>>>>>> Verborgen wijzigingen
U moet het conflict in het bronbestand handmatig oplossen, maar u wilt het gewoonlijk niet meteen vastleggen zoals u zou doen na a git fuseren
conflict. Meestal werk je verder aan je onvoltooide functie tot je een zinvolle commit hebt voorbereid. Vervolgens kunt u het gewoon toevoegen aan de index en het zoals gebruikelijk vastleggen. Met andere woorden, je kunt behandelen git stash pop
conflicten, net als andere ongecommiteerde wijzigingen.
Voor de meeste scenario's zijn de bovenstaande opdrachten alles wat u nodig hebt als het gaat om een "pauzeknop". Maar als u begrijpt hoe vastzittende veranderingen worden weergegeven, opent u de deur voor geavanceerder gebruik.
Tot nu toe hebben we het alleen gehad over het opslaan van een enkele wijzigingenset. Echter, elke keer dat je rent git stash
, niet-gecommiteerde wijzigingen worden opgeslagen op een stapel. Dit betekent dat u meerdere wijzigingenset tegelijkertijd kunt opslaan.
Dit is handig in de vroege stadia van ontwikkeling als je niet zeker weet welke richting je wilt nemen. In plaats van je wijzigingen te verliezen met git reset --hard
, je kunt je werk-in-uitvoering snapshots op de stapel bewaren voor het geval je een van deze later opnieuw wilt toepassen.
U kunt de voorraadstack inspecteren met de lijst
parameter.
git stash lijst
Als u eerder had geëxecuteerd git stash
drie keer zou dit iets als het volgende weergeven:
stash @ 0: WIP op nieuwe functie: 5cedccc Probeer iets gekke stash @ 1: WIP op nieuwe functie: 9f44b34 Neem een andere richting stash @ 2: WIP op nieuwe functie: 5acd291 Begin nieuwe functie
De git stash pop
opdracht past altijd de meest recente momentopname opnieuw toe, die bovenaan de voorraadstapel. Maar het is ook mogelijk om te kiezen en kiezen welke vastgezette snapshot u opnieuw wilt toepassen met de van toepassing zijn
commando. Als u bijvoorbeeld de tweede reeks wijzigingen opnieuw wilt toepassen, gebruikt u de volgende opdracht:
git stash pas stash toe @ 1
Net als git stash pop
, de wijzigingen zullen opnieuw verschijnen in je werkdirectory en je kunt doorgaan met werken aan de onvolledige functie. Merk op dat hierdoor de snapshot niet automatisch uit de voorraadstapel wordt verwijderd. In plaats daarvan moet u het handmatig verwijderen met de laten vallen
commando.
git stash drop stash @ 1
Nogmaals, werken met de voorraadstack is meer een voordeel voor de meeste Git-gebruikers. De git stash
en git stash pop
commando's zouden voor de meeste van je behoeften moeten volstaan, hoewel git stash lijst
kan ook nuttig zijn als u bent vergeten waar uw laatste stash-operatie plaatsvond.
Het maken van zinvolle snapshots vormt de kern van elke Git-workflow. Doelgerichte, ingekapselde commits maken het veel eenvoudiger om door uw projectgeschiedenis te navigeren, te achterhalen waar bugs zijn geïntroduceerd en wijzigingen terug te zetten.
Hoewel niet bepaald een dagelijks commando, git stash
kan een zeer handige tool zijn voor het creëren van zinvolle commits. Hiermee kunt u onvolledig werk opslaan zonder dat u gedeeltelijke snapshots naar uw permanente projectgeschiedenis hoeft vast te leggen. Houd hier rekening mee wanneer u de volgende keer wilt dat u kunt pauzeren waar u mee bezig was en er later op terugkomt.