Készítette: Hugyák Tamás
E-mail: tamas.hugyak@outlook.com
v3.0.0 - 2019.05.02.
A Git alapvető használatának elsajátítása.
„A Git inkább úgy tekint adataira, mint egy mini fájlrendszer pillanatképeinek halmazára.”
Az elosztott szoftverfejlesztés alapvetően különbözik a központosított verziókezelő rendszerektől. Ahelyett, hogy a fájl információkat egyetlen központi repository-ban tárolnánk, minden egyes fejlesztő rendelkezik a tároló teljes másolatával.
A verziókezelői tevékenységek nagyon gyorsak. A központi szerverrel történő hálózati kommunikáció helyett a lokális gépen hajtódnak végre a parancsok, így a fejlesztés offline megy végbe a workflow megváltoztatása nélkül.
Mivel minden egyes fejlesztő lényegében teljes biztonsági másolattal rendelkezik a teljes projektről, ezért a szerver meghibásodásának, a tároló megsérülésének vagy bármilyen más típusú adatvesztésnek a kockázata sokkal kisebb, mint a központosított rendszerek által támasztott pont-hozzáférés.
A Git repository minden egyes példánya – akár local, akár remote – rendelkezik a projekt teljes történetével, így egy teljes, elszigetelt fejlesztői környezetet biztosít minden fejlesztő számára, hogy szabadon kísérletezzenek új funkciók fejlesztésével mindaddig, amíg egy tiszta, publikálható verziót nem képesek előállítani.
A projekt teljes története azt is jelenti, hogy eltérő history-val rendelkezhetnek az egyes fejlesztők. Egy commit létrehozása még nem jelenti a többi fejlesztővel történő szinkronizációt. A Git már egy tökéletes commit-olási, összevonási, összefésülési technikával rendelkezik a fejlesztés különböző sorainak összefűzéséhez.
Átmeneti terület a munkakönyvtár és a local database között. A fájlok módosításáról egy úgynevezett pillanatkép (snapshot) készül, mely a "staged" állapotot jelenti. A stage folyamatos változása még nem része a local adatbázisnak.
Minden pillanatkép eltárolása előtt (commit) készül egy SHA-1 checksum a fájlokról, így lehetetlen megváltoztatni bármely könyvtár vagy fájl tartalmát anélkül, hogy a Git ne tudna róla. Ez a legalapvetőbb része a verziókezelőnek. Az SHA-1 egy 40, hexadecimális karakterekből álló string, mely a fájl tartalma vagy a könyvtár struktúrája alapján generálódik.
például: 24b9da6552252987aa493b52f8696cd6d3b00373
Az adatbázisban a tárolásának alapját nem a fájlnév jelenti, hanem az SHA-1 hash érték, mely egyben a tartalomra is utal.
A legalapvetőbb adat tároló a blob. A Git csak a fájlok tartalmát tárolja. A tartalomra a 40 karakter hosszú SHA-1 hash mutat, mely garantáltan minden esetben különbző lesz (unique).
Lehetővé teszik az elágazásokat, hogy a fejlesztés ne csak egy szálon történjen. Az egyidejű, párhuzamos fejlesztések egymástól teljesen elszeparálva működnek.
$ git branch testing
A HEAD az adott branch-ben a legutolsó commitra való hivatkozás.
$ git checkout testing
$ vim test.rb
$ git commit -a -m 'made a change'
$ git checkout master
$ vim test.rb
$ git commit -a -m 'made other changes'
Kettő vagy több fejlesztési szál, történet egybefűzése.
$ git checkout -b hotfixSwitched to a new branch 'hotfix'$ vim index.html$ git commit -a -m 'fixed the broken email'
$ git checkout master$ git merge hotfixUpdating f42c576..3a0874cFast-forward README | 1 - 1 file changed, 1 deletion(-)
$ git checkout iss53$ vim index.html$ git commit -a -m 'finished the new footer [issue 53]'
$ git checkout master$ git merge iss53
$ git branch -d iss53
A szerver (remote) és a kliens (local repo) között lehetséges:
1. Elhelyezkedés szerint:
2. Hozzáférhetőség szerint:
Olyan fájl, melyben azokat a fájlokat és könyvtárakat sorolják fel, melyeket a Git ne kövessen, indexeljen.
.idea/
.DS_Store
.svn
log/*.log
tmp/**
A Git célja az adott projekt menedzselése, ill. az adatok változásának nyomon követése. Ezen információk adatstruktúrákban történő tárolását repository-nak, röviden repo-nak, avagy lokális adatbázisnak nevezik.
A working directory, working copy vagy history az adott projektről, a gyökérkönyvtárról – amelyben a fájlok, forráskódok és mappák találhatóak – egy változatot, verziót, állapotot tartalmaz.
Snapshot egy adott pillanatban, időpontban a könyvtárak, fájlok aktuális állapotát, tartalmát, verzióját jelenti. A pillanatkép tulajdonképpen nem más a fájlok esetében, mint egy teljes másolat azok tartalmáról.
Commit-olásnak nevezik azt a folyamatot, amely során a Git a megjelölt és a staging area-ben lévő fájlokról készült snapshot-okat a lokális adatbázisában (a .git könyvtárában) eltárolja, és a tartalmuk alapján egy SHA-1 hash kódot (commit id) generálva hivatkozik rájuk.
A working directory-t tisztának (clear) nevezik, ha a fájlokon végzett összes módosítás el van mentve a lokális Git adatbázisba, a repo-ba. Ilyenkor az utolsó commit óta nem történt változtatás az adatokon. A working directory-t piszkosnak (dirty) nevezik, ha a legutolsó commit óta a verziókezelt fájlokon történtek olyan változtatások, módosítások, amelyek még nem lettek stage-elve, azaz a staging area-ba helyezve.
Staged/cached jelzővel illetik azokat a fájlokat, amelyek verziókezelve vannak a Git által és a legutolsó commit óta módosítva lettek, illetve az állapotukról, verziójukról, tartalmukról snapshot készült.
Az adott repository-nak külső szerveren lévő klónja.
$ git remote -v
origin git@bitbucket.org:turmix/git-eloadas.git (fetch)
origin git@bitbucket.org:turmix/git-eloadas.git (push)
HEAD az aktuális lokális branch-ben a legutolsó commit-ra való hivatkozás.
A working directory ennek a commit-nak a teljes történetét (history) mutatja.
Egy HEAD-et detached tulajdonsággal illetik, ha az aktuális commit, amelyre mutat, egyik lokális branch-nek sem a legutolsó commit-ja.
A következő parancsok kiadása a git bash-ben vagy a terminálban:
$ git config --global user.name "Név"$ git config --global user.email "e-mail"$ git config --global color.ui true$ git config --global core.editor vimLétező tároló klónozása az aktuális mappába, a repo nevével azonos könyvtárba.
$ git clone https://github.com/hakimel/reveal.js.git$ git clone ssh://git@github.com/hakimel/reveal.js.gitA working directory állapotának megtekintése.
$ git status
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: index.html
#
Fájltartalom hozzáadása a staging area-hoz.
$ git add .
avagy
$ git stage .
Módosítások, snapshot-ok eltárolása a repository-ban.
$ git commit -m "a commit szövege"
# vagy
$ git commit # az alapértelmezett szövegszerkesztő ugrik fel
# avagy
$ git commit -am "a commit szövege" # nem kell előtte kiadni a `git add`-ot
Local adatbázis módosításának feltöltése a remote repo-ba.
$ git push -u origin master
Counting objects: 5, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 1.68 KiB | 0 bytes/s, done.
Total 3 (delta 2), reused 0 (delta 0)
To git@bitbucket.org:turmix/git-eloadas.git
8837b3f..70fd548 master -> master
Branch master set up to track remote branch master from origin.
A working directory frissítése a remote repository-ból. Az éppen aktív branch-hez új vagy változott commit-ok letöltése a remote repository-ból.
$ git pull
Password:
remote: Counting objects: 2, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 41 (delta 27), reused 0 (delta 0)
Unpacking objects: 100% (41/41), done.
From git@bitbucket.org:turmix/git-eloadas.git
1ad00c7..320bd11 master -> origin/master
Updating 1ad00c7..320bd11
Fast-forward
index.html | 8 ++
1 files changed, 20 insertions(+), 13 deletions(-)
Branch-ek listázása, létrehozása és törlése a fejlesztés megkönnyítése érdekében.
$ git branch [-a] # branch-ek kilistázása
$ git branch <branch_név> # <branch_név> nevezetű ág létrehozása
$ git branch -d <branch_név> # <branch_név> nevezetű ág törlése
Átváltás egy másik branch-re vagy egy commit-ra.
$ git checkout <branch_név> # <branch_név> nevezetű ágra átváltás
$ git checkout <SHA-1_hash> . # <SHA-1_hash> commit-ra átváltás
Kettő vagy több fejlesztői történet (history) összefűzése egybe. Branch-ek összefésülése.
$ git merge <branch_név> # <branch_név> ág befűzése az aktuális ágba
$ git diff # conflict esetén a különbséget mutatja
$ git mergetool # szövegszerkesztővel lehet kezelni conflict-ot
Commit ellátása névvel vagy címkével.
$ git tag -l # létrehozott tag-ek kilistázása
$ git tag -a v0.0.1 -m "Ez a 0.0.1.-es verzió"
# tag hozzáadása az aktuális commithoz
$ git tag -m "Ez az 1.0alpha verzió" 1.0alpha <SHA-1_hash>
# tag hozzáadása korábbi vagy későbbi commit-hoz
$ git push --tags # csak a tag-ek kiküldése a remote repository-ba
A working directory módosításainak ideiglenes elmentése, s a legutóbbi commit-nak megfelelő tiszta working directory kiírása.
$ git stash # elmenti a working directory-t és az indexet
$ git stash list # létrehozott stash-ek kilistázása
$ git stash save "címke"
# elmenti a working directory aktuális állapotát "címke" néven
$ git stash apply stash@{1} # visszaállítja a stash@{1} állapotát
Commit napló, a korábbi commit-okról szolgáltat információt.
$ git log --oneline --graph --decorate
$ git log --graph --parents --name-status --oneline
A commit-ok, branch-ek közötti módosítások kilistázása. (Snapshot-ok közötti különbségek megjelenítése.)
$ git diff <SHA-1_start_commit>..<SHA-1_end_commit>