summaryrefslogtreecommitdiff
path: root/1.md
blob: 664f788a83cceab8f159101052a0604ef1dd3dd8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
---
title: GIT — EITB 2022
subtitle: Sarrera eta erabilera basikoa
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/1.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.

# Sarrera: Bertsio kontrol sistemak

## Bertsio kontrolerako sistemak

`Document_v3_FINAL.pdf`

---

![Bertsio kontrol sistema zentralizatuak](img/zentralizatuak.png){ height=180px }

---

![Bertsio kontrol sistema banatuak](img/banatuak.png){ height=300px }


# Git: Hasiera

## Kontestua

- 2005-ean argitaratu zen
- Linux garapenerako garatu zen
    - Milioika garatzaile
    - *Codebase* handiak kudeatzeko
- Sistema banatua (*distributed*) da
- *Snapshot*etan oinarrituta
- Operazio gehienak lokalak dira eta normalean ez ditu datuak ezabatzen
- Integridade kontrola egiten du SHA-1 erabiliz
- Hiru egoera:  
  `FITXATEGIA — STAGING AREA — REPOSITORIOA`

## Instalazioa

Debian oinarritutako distribuzioetan:

```
apt-get install git
```

Beste distribuzioetan antzeko komandoren batekin egin daiteke.


## Konfigurazio sistema

- Sistema mailakoa: `/etc/gitconfig`
- Konfigurazio generala: `~/.config/git/config` edo `~/.gitconfig`
- Konfigurazio lokala. Repositorio bakoitzeko: `$REPOSITORIOA/.git/config`

Kaskada moduan dabil, konfigurazio lokalak generala zapaltzen du.
Nondik datorren ikusteko:

```
git config --list --show-origin
```

## Konfigurazioa kudeatzea

Komandoek konfigurazio fitxategia irakurri edo idazten dute. Eskuz egin
daiteke.

Komando orokorra:

```
git config [--global] atala.klabea [balioa]
```

- `balioa` gehitzen ez bada konfigurazioa irakurtzen da idatzi beharrean.
- `--global` konfigurazio globala kudeatzeko erabiltzen da.

Benetan konplexuagoa da, laguntza begiratu.


## Hasierako konfigurazioa

Identitatea definitu. Beharrezkoa da commiten egilea nor den jakiteko.

```
git config --global user.name "John Doe"
git config --global user.email johndoe@example.com
```

Editorea aukeratzeko.

```
git config --global core.editor vim
```



## Laguntza lortzeko

- `git help`
- `man`


# Git basikoa

## Repositorio bat lortzen

Bi aukera:

- Repositorio berri bat hasi: `git init`. Oraingo direktorioan `.git`
  direktorioa eratuko du, bertan Git-en datuak gordeko dira.

- Repositorio bat klonatu: `git clone <URL>`. Oraingo direktorioan emandako
  repositorioa kopiatuko du, bere `.git` direktorioa barne. Protokolo
  ezberdinetan egin daiteke komunikazioa.

## Fitxategien egoerak

![Fitxategien egoera ezberdinak](img/lifecycle.png){ height=180px }

## Repositorioaren egoera ikusteko

- `git status`
- Fitxategi batzuei jaramonik ez egiteko: `.gitignore` fitxategi bat gehitu.
  *Glob pattern*ak erabiltzen ditu.

## Egoeraz aldatzeko

- Fitxategi berriak gehitzeko: `git add`
- Aldaketak *staging area*ra bidaltzeko: `git add`

## Aldaketak ikusteko

- `git diff`
- `git diff --cached|--staged`
- `git difftool` (konfiguratuta badago)

## Aldaketak idazteko

- `git commit`

Mezu bat idaztea eskatzen du: `$EDITOR` edo `git config --global core.editor`
programa exekutatuz.

## Fitxategiak ezabatzeko

- `git rm`
- `git rm --cached`

## Izenak aldatzeko

- `git mv`

Edo bestela fitxategia eskuz lekuz aldatu eta gero `git rm` + `git add` egin.



## Commit historia ikusteko

- `git log`

Oso komando konplexua da. Aukera asko ditu.

- `-<N>` azkeneko `<N>` commitak aurkezten ditu. `<N>` zenbaki bat izan behar
  da.
- `-p/--patch` commit-en *patch*-a ateratzen du.
- `--stat` estatistikak aurkezteko.
- `--pretty` formatua aldatzeko, modu asko dauzka.
- `--graph` grafiko modua.

Konbinatu daitezke:

`git log --graph --pretty=oneline --decorate --all`

## Commit historia iragazteko

`git log`-en irteera limitatu daiteke, eskaerak eginez:

- `--since` noiztik ikusi nahi diren. Adibidez: `--since=2weeks`.
- `--author` autorez iragazi.
- `--grep` commit mezuan *keyword*ak bilatzeko.
- `-S/-G/...` *pikeaxe function* deiturikoak, aldaketetan testua bilatzen dute.
- `git log -- fitxategia` fitxategi horretan gertatutako aldaketak bakarrik
  atera.
- `--no-merges` merge commitak deskartatu.

Laguntza ikusi: `git help log`


## Aldaketak desegiteko

- `git commit --amend` azkeneko commita berridazten du.
    - Mezua aldatu
    - Fitxategiak edo aldaketak gehitu
    - ...

- `git reset` aldaketak *staging area*tik kentzeko. KONTUZ `--hard`-ekin
- `git checkout` aldaketak desegiteko eta commiteatutako egoera
  berreskuratzeko. KONTUZ
- `git restore` komando berria da (>2.23.0) `reset` eta `checkout`-ek egiten
  dituzten gauzak egiten dituena, baina intuitiboagoa da.

## Remoteak

Repositorioaren kopiak dira. Remoteak eguneratu daitezke repositorio lokaletik
aldaketak igotzen (*push*) edo repositorio lokala eguneratu daiteke remotean
dauden aldaketak ekartzen (*fetch & pull*).

Remoteak beste makinetan egon daitezke, sarearen bidez sarbidea emanda, edota
makina berdinean, fitxategi sistemaren beste leku batetan.

## Remote-en kudeaketa

- `git remote`

`.git/config` fitxategian daude idatzita. Hortik ere kudeatu daitezke.


- `git clone` -k remotea automatikoki gehitzen du konfiguraziora, `origin`
  izenarekin.
- `git remote -v`
- `git remote add <izena> <URLa>`
- `git remote show <remotearen_izena>`
- `git remote rename <izena> <izen_berria>`
- `git remote remove <izena>`


## Remotearekin informazioa elkarbanatu

- `git fetch [<remote>]`-ek remotearen informazioa deskargatzen du,
  repositorioa zapaldu gabe.

- `git pull` informazioa deskargatu eta `merge`atzen du adarrak ondo
  konfiguratuta badaude:  
  ```
  git pull = git fetch + git merge
  ```

- `git push [<remote> <branch>]` datuak eta commitak igotzen ditu. Norbaitek
  commitak erdian gehitu baditu ez du uzten (aurrerago azalduko da).

## Tag-ak

Commitei jarri ahal zaizkien izenak dira, normalean *release*ak errezago
identifikatzeko. Horrela, tag-en izenak erabiltzen dira *commit-id*-ak balira
moduan baina guk erabakitako izenekin. Adibidez, `v1.0`.

- `git tag -l` tagak bistaratzeko

Bi tag mota dago:

- **Lightweight**: Puntero bat dira. Adar finko baten modukoak
- **Annotated**: Git-en datu basean objetu oso bat dira: Mezu bat daukate,
  autorea, sinatu daitezke...

## Annotated tags

- `git tag -a <tagaren_izena> [<commit>]`

`git show` -k erakusten ditu.

## Lightweight tags

- `git tag <tagaren_izena> [<commit>]`

`git show`-k ez ditu erakusten, azpitik dagoen commita erakusten du.


## Tag-ak partekatzeko

- `git push [<remote>] <taga>`
- `git push [<remote>] --tags` guztiak bidaltzeko

## Tag-ak ezabatzeko

- `git tag -d <taga>`
- `git push [<remote>] --delete <taga>`

## Aliasak

Gitek komandu berriak eratzea ahalbidetzen du aliasen bitartez. Beste
konfigurazio balioak bezala idazten eta irakurtzen dira:

- `git config --global alias.co checkout`
- `git co` => `git checkout`

Nik asko erabiltzen dut:

```
git config --global alias.lg log --graph \
  --decorate --all --oneline
```


# Git basikoa: Adarrak

## Adarrak (*branch*)

Adarrek repositorioaren garapenean beste bide bat hartzea ahalbidetzen dute,
bertan bide nagusian aldaketarik eragin gabe lan egiteko.

Git adarrak erabiltzeko diseinatuta dago eta haien erabilera sustatzen du.
Beraz, **oso garrantzitsuak** dira.

Beste bertsio kontrol sistema batzuetan adarrak erabiltzea prozesu astuna da,
errekurtso asko behar dituena. Git-en oso prozesu sinplea da eta ez du ia
errekurtsorik behar. Git-en bitartez kudeatzen diren proiektuetan ez da arraroa
ehundaka adar ikustea.

## Git barrutik

- Fitxategiak *Staging Area*ra bidaltzean, Git-ek haien argazkiak gordetzen
  ditu *blob* objetu moduan eta haien checksuma kalkulatzen du (SHA-1)
- Commita egiterakoan direktorio bakoitzaren checksuma kalkulatzen du eta
  *tree* objetu bat gordetzen du direktorio bakoitzeko. *Tree* objetuak, *blob*
  objetuetara apuntatzen duten punteroak dituzte. Gainera commitek beste datuak
  gordetzen dituzte: autorea, mezua, data...
- Commit berri bat gehitzean bere commit gurasoei apuntatzen du: punterorik ez
  dauka lehengo commita bada, puntero bakarra dauka commit normaletan eta
  puntero asko ditu *merge* commiten kasuan.

Adarrak commitetara apuntatzen duten puntero mugikorrak dira.

## Git barrutik

![Git repositorio baten barne datuak](img/commit-and-tree.png)

## Git barrutik

![Git repositorio baten commit estruktura](img/commits-and-parents.png)

## Adarrak eratzeko

- `git branch <branchname>`

Defektuz `master` deitutako adar bat dago. Izena konfiguragarria da, baina
gutxienez adar bat egon behar da beti, bertan commitak gehitzen direlako.

Git-ek oraingo adarrera apuntatzen duen erreferentzia bat gordetzen du: `HEAD`
deiturikoa.

## Adarraz aldatzeko

- `git checkout <branchname>`
- `git checkout -b <branchname>` adarra eratu eta aldatzeko

Bertsio berrietan, `checkout` komanduak gauza gehiegi egiten dituenez, komando
espezifiko bat eratu zen adarrekin lan egiteko:

- `git switch <branchname>`
- `git switch -c <branchname>` adarra eratu eta aldatzeko
- `git switch -` aurreko adarrera bueltatzeko

## Adarrak eta aldaketak — I

![`git branch testing`](img/head-to-master.png)

## Adarrak eta aldaketak — II

![`git checkout testing`](img/head-to-testing.png)

## Adarrak eta aldaketak — III

![`git commit ...`](img/advance-testing.png)

## Adarrak eta aldaketak — IV

![`git checkout master`](img/checkout-master.png)

## Adarrak eta aldaketak — V

![`git commit ...`](img/advance-master.png)

## Adarrak eta aldaketak — VI

Giten interfazetik ikusita:

```
$ git log --oneline --decorate --graph --all
* c2b9e (HEAD, master) Made other changes
| * 87ab2 (testing) Made a change
|/
* f30ab Add feature #32
* 34ac2 Fix bug #1328
* 98ca9 initial commit
```

> KONTUZ: Ez bada `--all` egiten ez dira defektuz adar guztiak bistaratzen `git
> log`-en bitartez.