GIT

Allikas: Kuutõrvaja
                                        Roheline.jpg Toores. Ehk seda pala võib täiendada.

Sissejuhatus

GIT on vabavaraline versioonihaldustrakvara, mis loodi algselt Linus Torvaldsi poolt Linuxi kerneli arenduse tarbeks.

giti eelis on eelkõige hierarhiline arendus, näiteks linuxi kernel kus siis erineva tasemega üle maailma kommitivad ja siis kõvemad vaatavad nõrgemate koodi üle ja nii liiguvad patchid järjest ülespoole välja kuni lõpuks jõuavad järgmisse linuxi versiooni. Seega on ta sobilikum suurte opensource projektide jaoks kus erinevad commit levelid. Väikestes asutustes kus peamiselt lisatakse trunci tasuks kaaluda pigem subversioni kasutamist.

GITi omadused

  • Jagatud versioonihaldus
  • Revisioon – SHA1 kontrollsumma
  • Snapshotid, mitte Erinevused
  • .git kaust - täielik ajalugu
  • Kõik tegevused kohalikud (peaaegu)
  • Olemas diktaatorid ja leitlandid kes kinnitavad muudatusi

Enne paigaldamist tasub selgeks teha, et on olemas 8 erinevat võimalust kitiga enda repositooriumu jagamiseks. Täspemalt neist juttu lingil: http://www.jedi.be/blog/2009/05/06/8-ways-to-share-your-git-repository/

Antud näites kasutame SSH git-shell meetodit. Äraseletatult tähendab see seda, et süsteemi luuakse SSH kasutaja kelle kestaks (shell) on GITi enda shell mis toetab ainult giti käskusid. Tegemist on üheaegselt nii lihtsa kui turvalise meetodiga giti kasutamiseks.

Üritades giti shellis tavalisi kestakäske käivitada teatatakse vastuseks:

fatal: What do you think I am? A shell?

Paigaldamine

FreeBSD asub git portsudes devel/git

# /usr/ports/devel/git && make install clean

Süsteemi tuleb tekitada git nimeline kasutaja mille shelliks /usr/local/libexec/git-core/git-shell

Debianis tuleb paigaldada git-core pakett

# apt-get install git-core

Gentoos

# emerge --ask --verbose dev-vcs/git

Repode tekitamine ja kasutamine

Uue repo saamiseks

$ cd /srv/git/base
$ git init --bare --shared tarkvara.git

Mille tulemusel tekib

git@git.zoo.tartu.ee:base/tarkvara.git

Võtmete tegemine, masinas kus soovime kasutada giti anname käsu

$ ssh-keygen -t dsa 

See tekitab kasutaja .ssh kausta kaks faili id_dsa privaatse ja id_dsa.pub avaliku võtme

Ligipääsemiseks tuleb kopeerida id_dsa.pub masinasse kus töötab nn git server, logida sinna serverisse ja lisama oma avaliku võtme git kasutajale:

# cat id_dsa.pub >> /srv/git/.ssh/authorized_keys

Seejärel tuleb tagasi logida enda klientmasinasse ja tõmmata repo alla:

$ git remote add origin git@git.zoo.tartu.ee:base/tarkvara.git

Ja lükata oma muudatused üles:

$ git push origin master

Kuskilt teisest kohast kasutama hakkamiseks

$ git clone git@git.zoo.tartu.ee:base/tarkvara.git

Tehtud muudatused committida ja siis pushida keskserverisse:

$ git add fail1 fail2 fail3
$ git commit -m "kirjeldus"
$ git push origin master

Lihtsalt hilisemaks uuendamiseks sobib öelda

$ git pull

Ja muudatuste üleslükkamiseks

$ git commit -a
$ git push

PS. Edaspidiseks - pushida ei ole vaja peale *igat* commitimist. Parem ongi pushida harvemini, sest juba pushitud asju on oluliselt raskem tagasi võtta ja see võib teistel miskit katki teha.

Rusikareegel: commitida tihti, pushida harvemini ja mis on pushitud, on jääv. Sellisel juhul tekib segadust vähem.

Pushitu tagasivõtmiseks on revert.

Haru tekitamiseks

Näiteks vajalik paraleelse test-arendusliini jaoks.

 git checkout -b systemd_arendus

See teeb uue haru preaguse HEADi kohast ja checkoutib selle välja.

FYI: Niisama haru tegemiseks, ilma seda checkoutimata:

 git branch systemd_arendus

Haru muutmiseks

Selleks, et origin URLi muuta tuleb working directory sees anda käsk:

$ git remote set-url origin git@git.zoo.tartu.ee:arendus/projekt.git

Git jätab committide autorid meelde nende e-postiaadressi järgi, seetõttu on oluline, et git teaks, millised e-postiaadressid on sinul kasutusel commitimisel. Oma arendusmasinas anna gitile käsk:

$ git config user.email

Commitite liitmine

Mitme commiti liitmine käib käsuga rebase, nt võtab järgnev käsk viimased neli commiti

git rebase -i origin/master~4 master

Misjärel avaneb editor, kus tuleb commiti ette, mille külge teised commitid ühendatakse kirjutada pick ja teistel muuta pick squashiks. Et selliselt tekkinud uut commitit master harusse pushida tuleb anda käsk

git push origin +master

Probleemid

Kui keegi on origin/masterit juba muutnud, peale seda, kui sa viimati sealt tõmbasid ja ise muutsid, seega kõige kergem enda muudatused minema visata:

$ git stash
Saved working directory and index state WIP on master: 7385dd4 pusimine ja uus stage
HEAD is now at 7385dd4 pusimine ja uus stage

Stashing takes the dirty state of your working directory — that is, your modified tracked files and staged changes — and saves it on a stack of unfinished changes that you can reapply at any time.

Kui seda aga ei soovi teha

$ git pull origin master

Kui öeldakse pullimisel, et tekkis konflikt (st sina ja keegi teine on täpselt sama kohta muutnud), siis peaks git nimetama ka failid ja siis nendes failides on üks või mitu konflikti kohta, mis on markeeritud nii:

<<<<<<
# Sinu kood
========
# Uus kood, mis tuli pullimis

Nüüd pead hoolega lugema ja vaatama, mis osa tuleb alles jätta ja mis kustutada või on hoopis mõistlik kombineerida kahest kokku.

Konfliktsed failid pead pärast parandamist uuesti addima ja committima.

Siis saad jälle pushida.

Üks äärmuslik võimalus on teha reset, näiteks kaotame kõik tehtud muudatused ühes failis

$ git reset
Unstaged changes after reset:
M	insert_into_server.sh

Reset teatud seisule

$ git reset --hard 9f6d568
HEAD is now at 9f6d568 Lock Savon to 0.7.9

Lihtsalt giti repos tehtud muudatuste kaotamiseks või resetimiseks.

git reset --hard HEAD

Ja seejärel tõmbame need serverist uuesti.

git pull

GIT vs SVN

Harud - SVN

svn cp svn://svn.server.ee/projekt/trunk svn://svn.server.ee/projekt/branches/3.5
svn sw svn://svn.server.ee/projekt/
svn ci -m „muudatus 3.5-s“
svn sw svn://svn.server.ee/projekt/trunk
svn merge -c 123 svn://svn.server.ee/projekt/
svn ci -m „r123 mergetud 3.5-st“

Harud - GIT

git co -b 3.5
git push origin 3.5
git ci -m „muudatus 3.5-s“
git co master
git merge 3.5
git push origin

Graafilised liidesed

Kohe käsurealt on olemas parameeter tree

$ git log --graph --oneline --all

Lõik tulemist näeb välja järgnev:

* b2d805f eemaldatud ebavajalikke ridu
* 0736f8e storage putitus ja tuuning
*   13b7936 Merge RVM into master
|\  
| * bb79038 (origin/rvm) httpd.conf ja local.start parandused seoses RVM-iga
| * 42a72c8 parandused seoses RVM-iga
| * 3b7a380 bundleri muudatus RVM-i jaoks
| *   1cc1a34 Merge branch 'master' of git.eenet.ee:base/haviserver
| |\  
| * | a05f46f uus Gemfile.lock
* | | 1a0ac6d <C3>paar ietd bugi
* | | 5a85cc0 pisut tuunitud storaget
* | | 7a63e10 pisut kohendatud asju
| |/  
|/|   
* | b1e991b sodimine meediaserveriga

Mugavamaks kasutamiseks võib sellest tekitada lausa aliase, koos sobilike parameetritega

Selleks tuleb kodukataloogis lisad a.gitconfig faili

[alias] 
 tree = log --graph --decorate --pretty=oneline --abbrev-commit

gitg is a fast GTK2 git repository browser for the GNOME desktop. It currently features:

* Loading large repositories very fast
* Show/browse repository history
* Show highlighted revision diff
* Browse file tree of a revision and export by drag and drop
* Search in the revision history on subject, author or hash
* Switch between history view of branches easily
* Commit view providing per hunk stage/unstage and commit

Gitglinux.png

git-svn

Tegemist on GITi frontendiga SVN projektidele.

$ git init --bare /projekt

Võtame svn projekti

$ git svn clone http://example.com/projekt/trunk

Lisame selle projekti

$ git remote add pulk /projekt
$ git push pulk master

Edasi võib teha /project all erinevad tööd git'iga ja lisada seal olevad muudatused tagasi SVNi

$ git svn dcommit

Lingid

Huvitav jubin nimega Gource võimaldab versioonihalduse ajalugu visualiseerida:

PS. Abiks raamat: http://progit.org/book/

GITi spikrileht

kellegi välja töötatud moodus Giti harude abil workflow püstiseadmiseks. http://nvie.com/posts/a-successful-git-branching-model/

https://github.com/sitaramc/gitolite giti server täiendavate ligipääsufunktsioonide ja võimalustega.