Git

Készítette: Hugyák Tamás

E-mail: [email protected]


v3.0.0 - 2019.05.02.

Az előadás célja

A Git alapvető használatának elsajátítása.

Miről lesz szó?

  1. Bevezető
  2. A Git architektúrája
  3. A Git részei és működése
  4. Egyebek
  5. Kifejezések
  6. Git parancsok
  7. Segédlet

Bevezető

Mi is az a Git?

  • open-source
  • verziókezelő rendszer
  • gyors
  • stabil
  • együttműködésen alapul

GIT IS A FILE SYSTEM

„Git thinks of its data more like a set of snapshots of a mini filesystem.”

Miért éppen Git?

Distributed software development

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.

Distributed software development

Faster commands

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.

Stability

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.

Isolated environment

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.

Efficient merging

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.

A Git architektúrája

Kliens-szerver architektúra

  • kliens: más néven repository (tároló), feladata a saját gépen a projekt verziókezelésének biztosítása és megvalósítása
  • szerver: más néven remote, feladata távoli szerver gépen a repository tárolása és elérése, s a kommunikáció biztosítása
    (az alapértelmezett remote neve: origin)
server-client architecture

A Git részei és működése

A fájlok 4 állapota

  1. unstaged, untracked: a Git nem követi nyomon a fájl módosításait (nincs verziókezelve)
  2. modified: a fájl módosítva lett, de még nem lett commit-olva a local database-be
  3. staged: a fájl cache-elve lett, snapshot készült róla (commit-ra jelölve)
  4. committed: az adatok biztonságosan eltárolva a lokális adatbázisban
branch

A repository (kliens) részei

  • working directory
  • staging area, cache, index
  • git directory, local database, history
  • branch
repository

working directory

Minden, ami:

  • könyvtár, fájl
  • fájl szerkesztése
  • kód fordítása
  • egyéb műveletek

Illusztrácó

Working directory

staging area

Egyéb elnevezések:

  • index
  • cache
  • stage
  • staged files
  • directory cache

staging area

Á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.

staging area

Working directory

SHA-1 hash

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.

local database

Objects

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).

  • blob: fájl tartalma
  • tree: könyvtár, mely egyéb blob-okat vagy tree-ket tartalmazhat
  • commit: pillanatképek sokasága, mely az adott időpillanatban a tree-k állapotát mutatja. Egy olyan objektum, mely egy pointert tárol a tartalomról készült pillanatképre, amelyet stage állapotba helyeztek.

Objektumok

Commit, tree, blob

Git adatmodell

Commit, tree, blob

Commit, tree, blob

Commit, tree, blob

Commit

Commit

branch

branch-ek

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.

Fajtái

  • local branch-ek
  • remote branch-ek

Egy példa...

Itt vagyunk most

branch

testing nevezetű branch létrehozása


$ git branch testing

branch

Még a master branch-en vagyunk

A HEAD az adott branch-ben a legutolsó commitra való hivatkozás.

branch

Átváltás a testing branch-re


$ git checkout testing

branch

Fájl szerkesztése, majd a módosítások eltárolása


$ vim test.rb

$ git commit -a -m 'made a change'

branch

Visszaváltás a master branch-re


$ git checkout master

branch

Néhány változtatás a fájlon


$ vim test.rb

$ git commit -a -m 'made other changes'

branch

merge


Kettő vagy több fejlesztési szál, történet egybefűzése.

Példa

hotfix branch létrehozása, átváltás rá és fájl szerkesztése

  • $ git checkout -b hotfix
  • Switched to a new branch 'hotfix'
  • $ vim index.html
  • $ git commit -a -m 'fixed the broken email'
branch

visszaváltás master branch-re és hotfix branch merge-lése

  • $ git checkout master
  • $ git merge hotfix
  • Updating f42c576..3a0874c
  • Fast-forward
  • README | 1 -
  • 1 file changed, 1 deletion(-)
branch

átváltás iss53 branch-re és fejlesztés

  • $ git checkout iss53
  • $ vim index.html
  • $ git commit -a -m 'finished the new footer [issue 53]'
branch

master branch-be a másik ág merge-ölése

  • $ git checkout master
  • $ git merge iss53

branch

végül a branch törlése

  • $ git branch -d iss53

branch

origin és local master branch


branch

origin és local master branch folyt.


branch

Egyebek

A kommunikáció

A szerver (remote) és a kliens (local repo) között lehetséges:

  • HTTPS protokoll (felhasználónév + jelszó)
  • SSH protokoll (privát-publikus kulcspáros)

A repository-k fajtái

1. Elhelyezkedés szerint:

  • remote repo
  • local repo


2. Hozzáférhetőség szerint:

  • private repo
  • public repo

Példa branch-ek kialakítására

branch

http://semver.org/

branch

Kifejezések

.gitignore

Olyan fájl, melyben azokat a fájlokat és könyvtárakat sorolják fel, melyeket a Git ne kövessen, indexeljen.

repository

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.

working directory

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

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.

git vs svn

Distributed software development

commit-olás

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.

clear & dirty

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

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.

remote

Az adott repository-nak külső szerveren lévő klónja.

head

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.

detached head

Egy HEAD-et detached tulajdonsággal illetik, ha az aktuális commit, amelyre mutat, egyik lokális branch-nek sem a legutolsó commit-ja.

Git parancsok

Első lépések

Git telepítése

http://git-scm.com/downloads

Saját adatok beállítása

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 vim

clone

Létező tároló klónozása az aktuális mappába, a repo nevével azonos könyvtárba.

példa


  • $ git clone https://github.com/hakimel/reveal.js.git
  • $ git clone ssh://[email protected]/hakimel/reveal.js.git

status

A working directory állapotának megtekintése.

add/stage

Fájltartalom hozzáadása a staging area-hoz.

commit

Módosítások, snapshot-ok eltárolása a repository-ban.

push

Local adatbázis módosításának feltöltése a remote repo-ba.

pull

(fetch + merge)

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.

branch

Branch-ek listázása, létrehozása és törlése a fejlesztés megkönnyítése érdekében.

checkout

Átváltás egy másik branch-re vagy egy commit-ra.

merge

Kettő vagy több fejlesztői történet (history) összefűzése egybe. Branch-ek összefésülése.

tag

Commit ellátása névvel vagy címkével.

stash

A working directory módosításainak ideiglenes elmentése, s a legutóbbi commit-nak megfelelő tiszta working directory kiírása.

log

Commit napló, a korábbi commit-okról szolgáltat információt.

diff

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.)

Segédlet

Ingyenes Git szolgáltatók

Git GUI-k

Git cheatsheet

http://ndpsoftware.com/git-cheatsheet.html

Tutorials

Felhasznált irodalom

Videók

Köszönöm a figyelmet!