GIT
Toores. Ehk seda pala võib täiendada.
Sisukord
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
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
- http://nathanj.github.com/gitguide/tour.html giti kasutamine windowsis
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.