Herstel & veiligheid

Herstel & de reflog

Git raakt zelden iets kwijt. Het lastige is het terugvinden.

Reflog

Elke verplaatsing van HEAD — en van elke branch — met wat hem veroorzaakte: checkout, reset, rebase, amend, een geforceerde fetch. Vanaf elke oude regel kun je hem uitchecken, eruit branchen of er hard naartoe resetten.

De reflogweergave

Dit is de knop "ik heb net de verkeerde branch gereset".

WIP-momentopnamen

Niet-gecommit werk is het enige dat de reflog niet kan redden, dus maakt Gitcito er momentopnamen van: de hele werkboom — gewijzigde, gestagede en niet-getrackte bestanden — gecommit via een wegwerp-index en vastgezet onder refs/gitcito/wip. Je echte index en je stashlijst blijven allebei onaangeroerd.

WIP-momentopnamen

Drie dingen maken er een:

Trigger Wanneer
Bewaking Automatisch, vlak voor een destructieve actie — verwerpen, clean, hard reset, herstellen vanaf een commit. Standaard aan; zet hem aan of uit in het momentopnamendialoog.
Timer Elke 5 / 15 / 30 minuten zolang de repository open is.
Met de hand De knop Nu een momentopname.

De bewaking is degene die ertoe doet: het moment waarop werk meestal voorgoed verloren gaat is de seconde na een verwerpen dat je niet bedoelde. Met de bewaking aan is die toestand een momentopname — open de lijst, klik op herstellen, haal weer adem.

Selecteer een momentopname om de vastgelegde bestanden te zien, de wijziging van elk bestand te bekijken, en een enkel bestand of de hele boom te herstellen. Herstellen kopieert bestanden uit de momentopname over de huidige kopieën heen — er wordt eerst een bewakingsmomentopname gemaakt, dus een herstel is zelf ook ongedaan te maken.

Grenzen die je moet kennen. Een timer- of bewakingstik die niets nieuws vindt, legt niets vast. Herstellen overschrijft bestanden en maakt ze opnieuw aan, maar verwijdert nooit een bestand dat je na de momentopname hebt aangemaakt. Genegeerde bestanden worden niet vastgelegd. Momentopnamen zijn lokale verborgen refs: nooit gepusht, veilig voor git gc, de nieuwste 50 blijven bewaard.

Begeleide bisect

Markeer commits als goed en slecht, kijk hoe het bereik smaller wordt, en land op de eerste slechte commit. Gitcito houdt bij hoeveel stappen er nog over zijn, zodat je weet of je twee vragen van het antwoord af zit of tien.

Begeleide bisect

Laat een commando beslissen

Zodra het bereik is uitgezet, geeft Laat een commando beslissen de hele zoektocht over aan git bisect run. Git checkt elke kandidaat uit, draait jouw commando en leest de exitcode:

Exitcode Betekent
0 Goed — de bug zit hier niet
125 Deze is niet te testen; sla hem over
iets anders Slecht

Een testsuite spreekt die taal al, en daarom is npm test meestal het hele antwoord. Gitcito biedt de eigen scripts van dit project aan om met één klik in te vullen, streamt de uitvoer terwijl het draait, en landt op de eerste slechte commit zonder dat jij ook maar één vraag beantwoordt.

Het commandoveld, klaar om de zoektocht aan een testsuite over te geven

Waar je op moet letten. Het commando draait op elke commit die git test, dus een commando dat deployt, publiceert of buiten de repository schrijft doet dat meerdere keren. Houd het bij iets dat alleen leest en rapporteert. Stop beëindigt de run en laat de sessie open, zodat je met de hand verder kunt markeren; Afbreken beëindigt de bisect volledig.

Een commando dat om een ongerelateerde reden faalt — een ontbrekende dependency op dat punt in de geschiedenis, bijvoorbeeld — markeert een goede commit als slecht en stuurt de zoektocht de verkeerde kant op. Met 125 afsluiten vanuit een wrapper-script is de uitweg die git daarvoor biedt.

Een achtergebleven lock-bestand

Git legt een .lock-bestand naast wat het gaat schrijven en haalt het weg zodra de schrijfactie klaar is. Een proces dat sterft terwijl het er een vasthoudt — een gecrashte editor, een terminal die tijdens git commit werd gesloten, een fetch die werd afgeschoten tijdens het opruimen van remote refs — laat de lock achter, en vanaf dan mislukt elke schrijfactie met dezelfde regel:

error: could not delete references: cannot lock ref 'refs/remotes/origin/x':
Unable to create '…/refs/remotes/origin/x.lock': File exists.

De repository is niet beschadigd. Er ligt simpelweg een bestand in de weg.

Gitcito probeert het eerst een paar keer opnieuw, want een lock in handen van een lopende git komt meestal binnen milliseconden vrij. Zo niet, dan opent de fout een dialoog in plaats van een muur tekst: elke lock die nog op schijf staat, hoe oud elk ervan is, en één knop die ze verwijdert en de mislukte actie opnieuw uitvoert.

Leeftijd is het hele argument. Een lock jonger dan 30 seconden hoort vermoedelijk bij een git die nog werkt, en Gitcito weigert die te verwijderen — het biedt aan te wachten en het opnieuw te proberen. Oudere worden aangeboden om te verwijderen, oudste eerst, en de dialoog zegt onomwonden wat je eerst moet nagaan: dat er nu geen editor, terminal of andere Git-client in deze repository bezig is. Een lock weghalen onder een levende schrijfactie is precies hoe een index scheurt.

De scan dekt de eigen git-map van de repository en de gemeenschappelijke map, dus locks van een gekoppelde worktree worden ook gevonden. Submodules worden overgeslagen — die horen bij een andere repository en ruim je op door die te openen.

Ongedaan maken / opnieuw

De meeste operaties leggen een regel op een undo-stapel, dus ⌘Z draait de laatste terug waar git dat toestaat.

Zie ook: Wat er veranderd is sinds · Stashes

Deze vertaling op GitHub verbeteren