summaryrefslogtreecommitdiff
path: root/1.md
blob: 652f157716bebca37ec8d094b02a626eee59ae71 (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
---
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 komplexua 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 aurreratua: Adarrak