(Teksti julkaistu alunperin 27.4.2017 Kultaisen Tomaatin ("GT") wappukalenterissa. Osa vuoden kestävää Git- ja Vim-opastusta vivahteella Otaniemen murretta. Ei välttämättä avaudu tavan tallaajalle ilman sisäpiiritietoutta kontekstista rivien väleissä.) Vappuna saattaapi olla mieli jossain muualla kuin näppiksellä. Tämänkertaisessa tekniikkatekstissä pyritään suhteuttamaan muutama ohjelm'loitsijan lempityökalujen ominaisuus työväen juhlan aikaiseen simanhuuruiseen olotilaan.
Tippaleivän sokerikuorrutteesta tai hillomunkin synteettisestä mansikasta voi päästä niin kovaan vauhtiin, että siinä humistessa hukkuu matkalle yhtä sun toista. Ei hätää! git fsck: "Verifies the connectivity and validity of the objects in the database." Erityisesti vipu --unreachable löytää kaikenlaiset kadonneet asiat, joita git gc ei ole ehtinyt vielä heittää menemään. Jos siis vaikka committaa asioita X olematta missään branchissa ("detached head state", vrt. phuksit ja zombit) ja sitten checkouttaa muualle, niin ilman jatkotoimenpiteitä asiat X katoavat. Ripeillä jatkotoimenpiteillä voi hyödyntää sitä, että Git ei keräile roskia pois mitenkään välittömästi vaan jättää ne lojumaan, ihan kuin teekkari jättää omaisuutensa eteisen lattialle kotiin rojahtaessaan. Tämä on hyödyllistä, sillä yhden roska saattaa olla saman aarre joskus myöhemmin.
Tämä fsck-taikatemppu ei aina näytä kaikkea "hukkunutta" dataa, koska reflogissa olevat kamat lasketaan löytyviksi. git reflog onkin kuin eteisen lattia ja aamun hämärät flashbackit eiliselle ("mistä lähtien kenkäni ovat olleet mustia??"), jotka kannattaakin merkitä muistiin (elleivät ole esim. brancheissa mukana jo) mikäli niitä aikoo kaivata myöhemmin. Aiemmin mainittu nimettömästä commitista muualle vaihtaminen jättää commitin reflogiin, joka on kuin lineaarinen undo-polku järjestettynä siten, missä järjestyksessä ne suoritti kellonajan mukaan, ei niinkään esim. minkään branchin järjestyksessä. Kunhan asiat on commitattu, niitä on hyvin hankala hukata. Git is love, git is life.
Reflogista tai git fsck:sta (jälkimmäinen on nimetty fsck-työkalun mukaan, jolla korjataan tiedostojärjestelmän eheyttä) saa pantua asiat talteen vaikka komennolla git branch branchinnimi commitpointti missä commitpointti on vaikka jokin hukattu ja löytynyt sha1-tunnus, ja branchinnimi kuten post-it-lappu jääkaapissa juhlakenkien sijainnista. (Reflogissa voi pompata taaksepäin N askelta checkouttaamalla HEAD@{N}, eikä hashien copypasteilua tarvita; tämäkin kelpaa commitpointti-kohtaan.)
Kävellään aasinsiltaa toiseen työkaluun. Liki kaikissa tekstieditoreissa on moniasteinen undo-toiminto, jolla voi kumota töhöilyjään ja aloittaa jostain välitilasta, tai miksei alustakin. Useimmiten kuitenkin historia on lineaarinen ja katkeileva ja siis tämän kanssa sopii olla erityisen varovainen, tai maito on ns. maassa ja syöpynyt vielä päällysteen läpikin siten, ettei sitä voi imeyttää servettiin toisin kuin pöydälle kaatunutta kahviaveccia sitseillä. Vimissä sopii olla holtittomampi.
Tavallisestihan N undon jälkeen tiedostoa uudelleen editoitaessa nämä N muutosta katoavat kuin Gitin commitit branchia resetoidessa eikä takaisin pääse vaikka redoa miten hakkaisi. Kuten Gitissä, Vimissäkin homma haarautuu: N aikaisempaa datan tilaa eivät katoa, vaan editointitilanteessa syntyy rinnakkaistodellisuus eikä vanha kuole minnekään. Tätä ominaisuutta tarvitsee harvoin, mutta silloin kun tarvitsee, niin voi sulkea hetkeksi silmänsä ja hengähtää syvään kuin vappumunkkia nuuhkaistessa. Seuraa oivallisuutta.
Undo-historian jossain aikaisemmassa vaiheessa tehty muutos siis luo historiaan haaran, ja seuraavat undo-redo-komennot (u ja Ctrl-R, btw.) kääntyvät risteyskohdasta tähän haaraan. Tavalliset editorit siis hukkaavat risteyksestä lähtevän vanhan haaran. Näyttääkö jo Gitiltä? (Nikke päättelee.) Gitin historia on itseasiassa graafi kun Vimin muokkaushistoria on puu. Vimissä voi myös ikäänkuin git checkoutata bufferin tilojen välillä, muttei lainkaan yhtä monipuolisesti (monimutkaisesti) kuin Gitissä. Undo-puu on oletuksena näkymätön konsepti, jossa voi liikkua eteen- ja taaksepäin samoin kuin undo/redo-toiminnoillakin jotka liikkuvat yhtä haaraa pitkin. Undo/redo liikkuvat tuoreimman haaran läpi; puussa navigointi liikkuu puun linearisoidun tilan välillä aikajärjestyksessä joko muokkaustilasta ("commitista") toiseen yksitellen (g- ja g+), tai aikamatkustaen (tyyliin :earlier 42m tai :later 1337s). Puun solmut järjestetään tapahtuma-ajan mukaan ja niistä päätellään (Nikke päättelee) lineaarinen järjestys. Vertaa git reflog tai ajattele aikamatkustamista matkaajan näkökulmasta vs. kussakin rinnakkaistodellisuudessa sivustakatsojan mielestä.
Kuten Gitissä, Vimissäkin tekniikka on yleensä konepellin alla (tai no pelti puuttuu, kaikki näkyvissä), eikä tekniikan käyttö ole aina yhtä ergonomista kuin auringonotto Ulliksella (vaikka tulisi räntää). Onneksi undo branchingin päälle on tehty mukava käyttöliittymä, nimittäin gundo.vim. Toisten tekemiä Vim-skriptejä ("ei kai kundi ala VIHJAILLA että käytettäis PLUGAREITA !" No ei olla tosiaan vielä käsitelty tässä juttusarjassa plugareita, mutta kuitenkin) voi asentaa monilla tavoilla, mikä tässä sivuutetaan, mutta vimcasts.orgin episodi vimin tästä aiheesta kannattaa tuijottaa läpi. Gundo tarjoaa visuaalisen puurakenteen lineaarisesta aikahistoriasta sekä muutoksien esikatselun diffeinä (vrt. gitk). Joka tapauksessa tälläinen haarautuva undo-toiminnallisuus saisi löytyä jokaisesta softasta, jossa undo ylipäätään tarjotaan. IRL ei tarjoa undoa lainkaan, joten sopii suorittaa niitä ei-digitaalisia toimintoja harkiten.
Lisälukemista:
- git manual: fsck
- git ready: restoring lost commits
- git manual: reflog
- git ready: reflog, your safety net
- git glossary: "reachable" (ja "unreachable object")
- vim manual: undo and redo
- vim manual: undo tree
- Gundo.vim Githubissa
- vimcasts: undo branching and Gundo.vim
- rendaa2.txt
- Nikke Knatterton
1 kommentti
- cce 29.04.2017 14:43gundo on ihan paras
Oma kommenttisi
Mielipide tämän sivun asiasta? Kirjoita toki. Älä raapusta kuitenkaan ihan asiattomia juttuja.
Jos on yksityisempää asiaa, tarkkaa kysyttävää tai aihetta pidemmälle keskustelulle, käytä yhteydenottolomaketta kommentoinnin sijaan.
Hölmöt kommentit saatetaan moderoida pois jälkikäteen.