From 84bae99d3abe4dac20b0bcd4066f24ac79da7938 Mon Sep 17 00:00:00 2001 From: Ekaitz Zarraga Date: Thu, 26 May 2022 18:36:29 +0200 Subject: Bigarren blokea: git aurreratua - Hasi --- 2.md | 213 +++++++++++++++++++++++++++++++++++++++++++ img/centralized_workflow.png | Bin 0 -> 14521 bytes img/double-dot.png | Bin 0 -> 6717 bytes 3 files changed, 213 insertions(+) create mode 100644 2.md create mode 100644 img/centralized_workflow.png create mode 100644 img/double-dot.png diff --git a/2.md b/2.md new file mode 100644 index 0000000..dc8ad0f --- /dev/null +++ b/2.md @@ -0,0 +1,213 @@ +--- +title: GIT — EITB 2022 +subtitle: Erabilera aurreratua +license: CC-BY-SA 4.0 +author: Ekaitz Zarraga - ElenQ Technology +links-as-notes: true +lang: basque +polyglossia-lang: + name: basque +how-to: pandoc -f markdown+smart -t beamer % -o pdf/2.pdf --pdf-engine=xelatex --template=./template.tex +... + +## Lizentzia + +- CC-BY-SA 4.0 +- Dokumentu honen edukiak eta irudiak [**Pro Git (Scott Chacon, Ben + Straub)**](https://git-scm.com/book/en/v2) liburutik atera dira. + +# Git zerbitzarian + +## Git zerbitzarian: sarrera + +Lankideen artean kodea partekatzeko zerbitzari bat izatea ideia ona da: beti +dago eskuragarri, kudeaketa sinplifikatzen du, etab. + +Zerbitzarietan *bare repository*-ak erabiltzen dira. Hauek ez dute *working +directory*-rik. `.git` direktorioan dagoena bakarrik dute. + +- `git init --bare` *bare repository* bat eratzeko. + +## Protokoloak + +Protokolo ezberdinak erabili daitezke repositorioen arteko komunikazioa +egiteko: + +- **Local**: beste fitxategi batean dagoen repositorioa. `git clone + /path/to/file`-en bitartez klonatu daiteke. +- **HTTP**: *smart* edo *dumb* moduak ditu. *Smart*-ek baimenak kudeatu ditzake. + *Dumb*-ek fitxategiak eman baino ez du egiten. +- **SSH**: Askotan erabiltzen da. Erabiltzaile bat behar du. + `git clone ssh://[@]/.git` erabiliz. SCP-ren modu + laburra erabili daiteke: `[@]:.git`. +- **Git**: SSH-ren antzekoa da baina autentikazio barik. + +## Protokoloak — Adibide bat + +Nire [zerbitzaria](https://git.elenq.tech/): + +- Web bitartez proiektuak aztertu daitezke. `cgit` erabiltzen du. Beste aukera + batzuk daude: `gitweb` adibidez, Git-ekin datorrena. +- Proiektu publikoak Git-en bitartez zerbitzatzen dira edonork kopiatu ahal + izateko. +- Idazteko baimena SSH-ren bitartez zerbitzatzen da, baimena kontrolatu ahal + izateko. + +*Liburuan azaltzen da gauza hauek nola muntatu.* + + +# Git workflowak + +## Workflow zentralizatua + +Git-en izaera banatuak *workflow* ezberdin asko ahalbidetzen ditu baina gaur +egun *workflow zentralizatua* erabiltzen da gehien, Web zerbitzu integratuen +arrakastagatik (Github, Gitlab, Gitea...) non tiketak eta kodea kudeatzeko +aukera dagoen. + +![Bezero guztiak zerbitzariarekin sinkronizatzen dira](img/centralized_workflow.png){ height=140px } + +## Email-en bitartez + +Software libre proiektu asko oraindik emailean oinarritzen dira aldaketak +proposatzeko. + +- `git format-patch ` aukeratutako commitak patch + fitxategietan idazteko +- `git send-email ` patch-ak emailez bidaltzeko + (konfigurazioa behar du) +- `git am ` jasotako patch-ak proiektuan commiteatzeko +- `git apply ` jasotako patch-ak aldaketa moduan aplikatzeko + + +# Git tresna aurreratuak + +## Commit selektoreak + +Giten komando askok commit askotan aplikatu daitezke. Gitek commit selektore +ezberdinak aplikatzea ahalbidetzen du commitak aukeratzeko. + +- `git show ` aukeratutako objektuak erakusteko + + +## Commit selektoreak — I + +- **SHA-1 hasha**: commit identifikadorea bera erabili daiteke selektore moduan. + Oso luzeak direnez, hasierako karaktereak bakarrik erabili daitezke anbiguoak + ez badira. `git log --abbrev-commit` commit id-aren laburpena egiten du. + +- **Adarren burua**: adarraren izena erabiltzean, adarraren buruaren commita + aukeratzen da: `git show `. Adarraren buruaren commit id-a + ateratzeko: `git rev-parse `. + +- **Reflog-a**: Reflog-a repositorioaren egoera gordetzen du historiko baten + modura. Reflog-aren sarreren izenak erabili daitezke commit selektore moduan. + Gainera denbora erabili daiteke: `HEAD@{yesterday}`. + + - `git reflog` reflog-aren sarrerak erakusteko + +## Commit selektoreak — II + +- **Gurasoak**: aukeratutako commiten gurasoak eta aitzindariak lortu daitezke: + + - Txapela (`^`) erabiliz aukeratutako commitaren gurasoak lortu daitezke. + Adibidez: `git show HEAD^`. Merge commitetan (guraso asko dituztenak) + gurasoen artean aukeratzeko `^` eta gero gurasoaren zenbakia jarri + daiteke guraso konkretua lortzeko. + - Tildea (`~`) erabiliz aitzindariak lortu daitezke. Zenbaki bat gehituta + aurreko aitzindaria lortu daiteke. Adibidez `git show HEAD~2`: aurreko + commitaren aurrekoa lortu. + +## Commit selektoreak — III + +- **Commit tartea**: bi commiten arteko tartea lortzeko: `..` + Adarrekin ere egin daiteke, adar batetik besteraren burura ailegatzeko behar + diren commitak lortzeko: + ![](img/double-dot.png){width=350px} + - `git log master..experiment` => D C + - `git log experiment..master` => F E + +## Commit selektoreak — IV + +- **Puntu tripleak**: bi adarretatik ailegatu ahal diren commitak, baina + amankomunean ez daudenak: + ![](img/double-dot.png){width=350px} + - `git log master...experiment` => F E D C + - Zein adarretik datozen ikusteko `--left-right`: + ``` + git log master...experiment --left-right + < F + < E + > D + > C + ``` + +## Commit selektoreak — V + +- **Puntu multipleak**: eskaera konplexuagoak egiteko `^` (aurretik) edo + `--not` erabili daiteke, adar horren commitak baztertzeko: + - Hurrengo komandoak baliokideak dira: + ``` + git log refA..refB + git log ^refA refB + git log refB --not refA + ``` + - Hurrengo komandoek `refA`tik eta `refB`tik lortu daitezkeen commitak + hartzen dituzte, `refC`tik lortu daitezkeenak baztertuz: + ``` + git log refA refB ^refC + git log refA refB --not refC + ``` + +## Staging interaktiboa + +- `git add --interactive | -i` stage-a modu interaktiboan kudeatzeko +- `git add --patch | -p` gehituko diren aldaketak modu interaktiboan + aukeratzeko. Blokez bloke + +*Komando askotan erabili daitezken aukerak dira hauek. +Oso erabilgarriak dira.* + +## Stash-a + +Aldaketak gordetzeko zaku bat da *stash*a. Trakeatu gabeko aldaketak bertan +sartu daitezke repositoria aldatu/berriztu/mergeatu eta gero aldaketak berriro +adar berdinean edo beste batean ateratzeko. + +- `git stash [push]` direktorioa garbitu eta aldaketak *stash*era sartzeko +- `git stash list` *stash*aren sarrerak ikusteko +- `git stash apply []` aukeratutako *stash* sarrera (defektuz + azkena) aplikatzen dio *working directory*ari. +- `git stash drop []` aukeratutako *stash* sarrera ezabatzeko +- `git stash pop` = `git stash apply` + `git stash drop` + +*Push* eta *pop* izenak erabiltzen dira *stash*a LIFO ilara edo stack baten +moduan kudeatzen delako. *Gainetik gehitu eta gainetik atera* + +## Stash-a — Aukera interesgarriak + +- `git stash apply --index` egitean *staging area*ra bidaltzen dira *stash*ean + *staging area*an zeuden fitxategiak. Defektuz ez dira *stage*era bidaltzen. +- `git stash --keep-index` indexatutako (*stage*a) fitxategiak ez dira + *stash*era gehitzen, eta *stage*ean mantentzen dira. +- `git stash --include-untracked|-u` trackeatuta ez dauden fitxategiak ere + *stash*eatzeratzeko. +- `git stash --all|-a` baztertutako fitxategiak (`.gitignore`) ere *stash*era + gehitzeko +- `git stash --patch|-p` *stash*eratzeratzeko aldaketak modu interaktiboan + aukeratzeko +- `git stash branch ` aldaketak *stash*era bidali, adar berri bat + sortu eta bertan *stash*a aplikatu. Dena ondo badoa *stash*a garbitzen du + bukatzerakoan. + +## Direktorioa garbitzeko + +- `git stash --all` egitea direktorio osoa garbitzen du, hau da, trackeatuta ez + dauden fitxategiak eta aldaketak *stash*earatzen ditu. +- `git clean` egiten antzeko efektu bat lortu daiteke *stash*a erabili gabe, + zuzenean aldaketak eta fitxategiak ezabatuz. + - `-f` (*force*) beharrezkoa da (defektuz, aukera bat dago desaktibatzeko) + nahi gabe ez egiteko + +> KONTUZ: `git clean --dry-run|-n` erabili badaezpada, zer egingo duen ikusteko +> benetan exekutatu baino lehen. diff --git a/img/centralized_workflow.png b/img/centralized_workflow.png new file mode 100644 index 0000000..d5d660f Binary files /dev/null and b/img/centralized_workflow.png differ diff --git a/img/double-dot.png b/img/double-dot.png new file mode 100644 index 0000000..53175c1 Binary files /dev/null and b/img/double-dot.png differ -- cgit v1.2.3