Kirill synes git er 'grusom og stygg'. Men løsningen skal være ganske enkel

- Hvis man forstår Git, så kan man også temme git, skriver Kirill Miazine.

Kirill Miazine er advokat, ikke utvikler, men koder på fritida og bruker mange av verktøyene og metodene også på jobb. Her sammen med sin "advokatt". 📸: Privat
Kirill Miazine er advokat, ikke utvikler, men koder på fritida og bruker mange av verktøyene og metodene også på jobb. Her sammen med sin "advokatt". 📸: Privat Vis mer

Git (med «G»)» og git (med «g») har på en måte vunnet. Jeg vil si dessverre, fordi git er en ganske grusom greie.

Ja, jeg mener at git (som et sett av kommandolinjeverktøy som lar en bruker forholde seg til et repository i Git-format) er grusom.

Men den er også kraftig.

"Magiske git-kommandoer"

Det finnes andre verktøy som gjør en bruker i stand til å lagre og hente data ut av Git-repositories, men git er nok mest vanlig og gir flest muligheter.

XKCD oppsummerer brukeropplevelsen med git på en meget treffende måte:

📸: CC BY-NC 2.5 / xkcd.com/1597
📸: CC BY-NC 2.5 / xkcd.com/1597 Vis mer

Tanken er altså an en bruker som har et behov for å holde noe av sin informasjon i et versjonskontrollsystem, og kanskje samarbeide litt med andre, enkelt kan sette opp et Git-repository, og så bruke et sett av magiske git-kommandoer til å holde greia under kontroll.

Alle spørsmål om behovet for og nytten av såkalt index (også kjent som stage area og cache) besvares med at det er kjempebra og brukeren bare må lære seg å sette pris på den.

Aldri venn med git

Jeg fikk selv aldri sansen for git, og selv om jeg gjorde flere forsøk på å vise toleranse overfor adferden til git, var den aldri fin mot meg. Jeg endte opp med å bruke Mercurial, før jeg i 2020 gikk over til Fossil .

Etter hvert som git er blitt eldre, har det begynt å se litt bedre og ikke minst konsistent ut.

Likevel er git fremdeles en rotete blanding av kompilerte programmer og diverse scripts skrevet i shell og Perl. Jeg setter pris på konsistens, og derfor ble jeg aldri venn med git.

Jeg nevnte at det finnes andre verktøy for å forholde seg til Git-repositories, og et annet slikt er Game of Trees.

«Personlig hadde jeg stor nytte av å forstå Gits datamodell.»

Gits datamodell

Selv om git er grusom og stygg, og tilsynelatende krever mye brukeren, er datamodellen til Git enkel og elegant. Linus Torvalds sa at det er datastrukturene som teller, og at det er derfor git er såpass vellykket.

Denne holdningen kan forklare hvorfor Git og git kan oppfattes såpass forskjellig.

Personlig hadde jeg stor nytte av å forstå Gits datamodell. Den er meget enkel, for Git er jo bare et slags filsystem som lar en lagre et litte sett av objekter, og deretter hente ut de samme objektene ut fra det innholdet objektene har. Objektene har forskjellige typer, og det dannes datastrukturer ved at objektene henviser til hverandre. I tillegg kan man lagre noen referanser til objektene i et vanlig filsystem.

Hvis man forstår Git, så kan man også temme git, men det kan bare ta litt tid å finne riktig kommando og riktige kommandoargumenter.

Ta deg en leserunde

Jeg er overbevist om at enhver bruker av git som ikke ennå har tatt turen innom hvordan Git-repository er bygget opp, og hva forskjellige git-kommandoer egentlig gjør, bør ta seg en liten leserunde.

Referansedokumentasjonen på git-scm.com/docs er svært dekkende, men kan være litt krevende å lese. Opplever man dette, er Pro Git-boka bra, og dennes kapittel 10 tar for seg de underliggende detaljene i Gits datamodell, f.eks. om forskjellige typer objekter.

Med denne forståelsen er det relativt lett å vite hva man ønsker skal skje i repository, og så prøve å finne egnet sett av git-kommandoer for å få det til å skje.

«A hobgoblin entered the room and ate the novice alive.»

Master Git

Jeg kom en gang over et blogginnlegg kalt Git Koans, der var det en fin illustrasjon av noen åpenbare tilfeller av inkonsistens:

"A novice was learning at the feet of Master Git. At the end of the lesson he looked through his notes and said, "Master, I have a few questions. May I ask them?"

Master Git nodded.

"How can I view a list of all tags?"

"git tag", replied Master Git.

"How can I view a list of all remotes?"

"git remote -v", replied Master Git.

"How can I view a list of all branches?"

"git branch -a", replied Master Git.

"And how can I view the current branch?"

"git rev-parse --abbrev-ref HEAD", replied Master Git.

"How can I delete a remote?"

"git remote rm", replied Master Git.

"And how can I delete a branch?"

"git branch -d", replied Master Git.

The novice thought for a few moments, then asked: "Surely some of these could be made more consistent, so as to be easier to remember in the heat of coding?"

Master Git snapped his fingers. A hobgoblin entered the room and ate the novice alive. In the afterlife, the novice was enlightened."