Snelle tip gebruik maken van de kracht van Git Stash

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:

  • Rennen git reset --hard om uw niet-gecommiteerde wijzigingen te verwijderen.
  • Noteer uw onvolledige werk als een nieuwe commit.

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.

voorwaarden

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.

1. Wijzigingen blokkeren

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.

2. Stashed Changes opnieuw toepassen

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.

3. Conflicten oplossen

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.

4. De voorraadstack

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.

Conclusie

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.