Programi

Git - orodje za nadzor različic

Git je zmogljivo orodje za nadzor različic (ONR) oziroma orodje namenjeno sledenju spremembam (ONSS) brez skupnega odjemnega mesta. Odsotnost skupnega odjemnega mesta ima nekaj prednosti pred klasičnimi orodji z enakim namenom, ki uporabljajo središčni (imenovan tudi skupni) strežnik. Ker se Git uporablja vedno pogostejše, se je smiselno naučiti njegove rabe ter razumeti, kako Git sledi spremembam in kako izkoristiti njegove prednosti.

Največkrat se orodja Git poslužujejo razvijalci programske opreme, saj je orodje v desetih letih postalo vodilen sistem za sledenje spremembam oziroma za nadzor različic. Takšna orodja nam beležijo zgodovino, nam omogočajo vpogled nazaj, razveljavitev sprememb ter obnovitev datotek. Poleg tega omogočajo še sočasno delo večji skupini ljudi na istem projektu s čimmanj zapleti. K njegovemu slovesu sta veliko pripomogli strani Github in Bitbucket, vendar orodje Git lahko deluje povsem neodvisno od omenjenih strani. Za uporabo orodja Git ni potrebno imeti uporabniškega imena na strani Github ali njemu podobni strani.

V prvem delu si bomo pogledali, kakšna orodja za nadzor različic obstjajo, vendar lahko to preskočite in preidete na drugi del, ki je namenjen orodju Git in delu z njim.

Pregled orodij

Orodje za nadzor različic ni nekaj novega, saj so že pred 35 in več leti nastala, celo odprtokodna, orodja s tem namenom. Primera sta Source Code Control System (SCCS) in Revision Control System (RCS).

Z nastankom računalniških mrež so se pojavila orodja s skupnim strežnikom: Concurrent Versions System (CVS) in Apache Subversion (SVN), in orodja brez skupnega odjemnega mesta: GNU Bazaar (BZR), Mercurial in Git.

Orodje Git kot ONR brez skupnega odjemnega mesta (DVCS)

Uradna spletna stran orodja Git se nahaja na naslovu https://git-scm.com/, kjer se nahajajo tudi podrobna navodila za njegovo uporabo.

Prednosti orodja Git in podobnih orodij brez skupnega odjemnega mesta so naslednje.

Pričetek z Git (namestitev, vzpostavitev)

Namestitev orodja se razlikuje od operacijskega sistema, vendar je namestitev po prenosu namestitvene datoteke v večini primerov končana po nekaj korakih. V skoraj vseh sistemih, ki uporabljajo Linux jedro, je mogoče Git namestiti kot programski paket iz programskega skladišča.

apt-get install -y git

Lokalne nastavitve

Po namestitvi je potrebo orodje seznaniti z njegovim uporabnikom, torej vami. Povedati mu morate, kako vam je ime in kakšen je vaš naslov spletne pošte. Te podatke potrebuje za beleženje zgodovine, vendar jih lahko kasneje spremenite oziroma jih prilagodite za vsako lokalno skladišče. Če boste orodje uporabili zase, vas nič ne omejuje pred vpisom popolnoma poljubnega imena in naslova. V nasprotnem primeru, na primer pri delu v skupini, pa morate poskrbeti, da boste izbrali ime, pod katerim vas sodelavci poznajo oziroma iz katerega znajo vas razbrati.

Orodje seznanite z vašim imenom kot git config --global user.name "Johann Hauptmann" in vašim naslovom elektronske pošte git config --global user.email "johann.hauptmann@beispiel.at". Ta podatka sta nujna in se bosta samodejno uporabila pri vseh uveljavitvah, če jih ne prilagodite znotraj lokalnega skladišča. Ta dva podatka se hranita v datoteki .gitconfig, ki se nahaja v uporabnikovi domači mapi.

Pojmi

Orodje uporablja naslednje pojme.

Stanja

Vsaka datoteka, kateri se sledi, je lahko v enem izmed treh stanjih (stage).

Zaradi tega obstajajo tri drevesa: delovno, sprejeto in potrjeno (HEAD).

Z razliko od orodja Mercurial, spremenjena datoteka ob potrditvi ne bo potrjena.

Osnovna opravila

K osnovnim opravilom štejemo naloge, ki vključujejo uporabo naslednjih ukazov: init, checkout, add, status, commit, log, diff, update, move oziroma rename, delete, lock, revert, tag, branch in merge.

Pred začetkom prikaza uporabe moramo ustvariti lokalno skladišče.

Stvaritev lokalnega skladišča – git init

Prvi korak pri vzpostavitvi orodja za nadzor različic je stvaritev lokalnega skladišča, kar dosežemo z ukazom git init v željeni mapi, kjer se nahajajo datoteke in mape, katerim želimo slediti. Za tem se bo v mapi ustvarila (skrita) podmapa .git, ki predstavlja lokalno skladišče.

Spodnji primer kaže izpis v ukazni vrstici potem, ko smo pognali ukaz v mapi /home/jh/git_tut/.

~/git_tut$ git init
Initialized empty Git repository in /home/jh/git_tut/.git/

Dodajanje datotek v lokalno skladišče – git add

Ko imamo v mapi že nekaj datotek, katerim bi radi sledili, moramo orodju to povedati. To storimo tako, da za vsako datoteko (na primer za datoteko torta.txt) izvršimo git add torta.txt oziroma uporabimo zvezdico git add torta.*, če je datotek več. V končni fazi lahko dodamo kar vse datoteke, ki jih imamo v mapi. To storimo z git add .. Na koncu je pika, saj ta označuje trenutno mapo. Če nam ukaz javi napako, potem je ta povezana z neobstojem lokalnega skladišča.

Če datoteki že sledimo, vendar smo jo vmes spremenili, ima ta spremenjeno stanje. Dokler te datotek ne bomo ponovno dodali in jih s tem dodali na drevo sprejetih datotek, se te spremembe ne bodo uveljavile pri potrditvi različice.

Če smo datoteko dodali po pomoti, lahko z git reset datoteka.ime povrnemo njeno stanje.

Pregled sprememb – git status

Da bi videli, katerim datotekam bomo sledili, katere datoteke smo spremenili in katere datoteke smo potrdili za vključitev v naslednjo potrditev, uporabimo ukaz git status, ki bo te datoteke izpisal.

~/git_tut$ git status
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached ..." to unstage)

	new file:   torta.txt

Uveljavitev sprememb oziroma potrditev različice v lokalnem skladišču – git commit

Ko smo datoteke dodali v skladišče in bi radi ustvarili različico, uporabimo ukaz git commit, ki nam odpre okno, kamor vnesemo opis spremembe. Opis lahko navedemo tudi ob uporabi stikala -m kot kaže naslednji primer. Opis naj opiše spremembo, ki so jih bile deležne datoteke, največkrat opisujejo, kaj se je naredilo in čemu se je naredilo. Primer slabega opisa je: „Datoteka je bila spremenjena.“

~/git_tut$ git commit -m "Prvi slasten recept"
[master (root-commit) 024ae13] Prvi slasten recept
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 torta.txt

Če orodja Git nismo seznanili z nami, bo ta javil napako in predlagal, kaj naj storimo.

Če smo se pri opisu zmotili in bi ga radi popravili dodamo stikalo --amend. Odprlo se nam bo privzeti urejevalnik besedila, v katerem lahko spremenimo opis.

git commit --amend

Pogled sprememb datotek – git diff

Orodje nam omogoča pregled sprememb med različicami. Če smo v mapi spremenili nekaj datotek, katerim že sledimo, vendar datotek še nismo ponovno dodali in različice še nismo potrdili, lahko z ukazom git diff izpišemo vse spremembe na vseh datotekah. Če nas zanima le ena datoteka, lahko njeno ime navedemo kot prvi parameter.

Če smo datoteko torta.txt sprmenili, nam git diff torta.txt pove spremembe z znaki +, ki označuje novo vrstico, in -, ki označuje izbrisano vrstico. Spremembe že obstoječe vrstice prinesejo tako + kot tudi - v izpisu.

~/git_tut$ git diff torta.txt
git diff
diff --git a/torta.txt b/torta.txt
index e69de29..c33f4bb 100644
--- a/torta.txt
+++ b/torta.txt
@@ -0,0 +1 @@
+Potrebujemo moko tip 500.

Če smo spremenjeno datoteko dodali (sprejeli), vendar različice še nismo potrdili, lahko z ukazom git diff HEAD pogledamo spremembe, ki čakajo na potrditev.

Ustvarjanje vej – git branch

Ko imamo ustvarjeno skladišče in želimo narediti nekaj sprememb je zelo priporočljivo ustvariti novo vejo. Veja je zaporedje potrditev, ki ustvarjajo zgodovino sprememb. V skladišču vedno obstaja glavna veja, pogosto poimenovana master. Novo vejo ustarimo z ukazom branch, kateri sledi ime nove veje, ki naj predstavlja jedrnati opis spremembe.

$ git branch moja_sprememba

Namen vej je ohranjanje delujoče različice v glavni veji, medtem ko nam delo v veji nudi svobodo. Ko je veja ustvarjena, je potrebno nanjo še preklopiti.

$ git checkout moja_sprememba

Oboje je možno narediti v enem koraku kot git checkout -b moja_sprememba.

Združevanje datotek iz vej – git merge

Ko smo zadovoljni s spremembami, ki so nastale znotraj veje, in bi jih radi udejanili tudi na glavni veji, se mo moramo najprej prestaviti na glavno vejo in nato sprožiti postopek zlivanaj z ukazom merge, kjer navedemo tudi ime veje, ki jo želimo zliti.

$ git checkout master
$ git merge moja_sprememba

Ko je vej združena oziroma zlita z glavno vejo in je ne potrebujemo več, jo lahko izbrišemo z ukazom git branch -d moja_sprememba.

Več osnovnih opravil

Sem sodi uporaba naslednjih ukazov: clone, push in pull.

Poustvarjanje oddalnega skladišča – git clone

Čeprav orodje Git ni odvisno od odjemnega mesta, obstajajo odjemna mesta zgolj zaradi lažjega deljenja sprememb in datotek med sodelavci na projektu ali programu. Skladišče, ki se nahaja na odjemem mestu, se prenese na računalnik ozrioma postane lokalno skladišče z uporabo ukaza clone.

$ git clone git@:/git-repository.git

Z zgornjim ukazom se uporabnik prijavi na odjemno mesto na naslovu githost.com preko protokola SSH z uporabno javnega ključa za preverjanje pristnosti. Orodje Git poleg SSH podpira tudi prenos preko HTTPS in Git protokola. Za tem bo ustavil lokalno skladišče z imenom git-repository.

Praktičen primer uporabe orodja Git

[v nastanku]