Tartalomjegyzék
Git gyorskezdés
- Szerző: Sallai András
- Copyright © 2018, Sallai András
- Szerkesztve: 2018, 2020, 2023
- Licenc: CC BY-SA 4.0
- Web: https://szit.hu
Bemutatkozás a Git számára
Telepítés után mondjuk meg a git számára milyen nevet és e-mail címet szeretnénk a megjegyzésekben látni, globálisan az összes projekthez. A git természetesen használható ezek nélkül is, ekkor az operációs rendszer környezetből próbálja meg összeszedni a nevet és az e-mail címet.
git config --global user.name "Nagy János" git config --global user.email "janos@zold.and"
A projekthez természetesen beállítható külön név és e-mail cím is. A beállítások a ~/.gitconfig állományban tárolódnak.
Állítsuk be, a megjegyzéseket milyen szövegszerkesztővel szeretnék használni:
git config --global core.editor mcedit
Ha szeretnénk színes kiíratást:
git config --global color.ui true
A sortörések automatikus cseréjének tiltása:
git config --global core.autocrlf false
Egy beállítás lekérdezés:
git config user.name
Az összes beállítás lekérdezése:
git config --list
A projekt
Adott egy projekt01 könyvtár, amelyben van egy egyszerű C programunk.
A gyors kezdés
Lépjünk a projekt könyvtárába:
cd projekt01
Készítsük fel a könyvtára a verziókezelésre:
git init
Státusz lekérdezése:
git status -u
Mondjuk meg, hogy miket szeretnénk verzió-kezelni. Itt most az összes fájlt megjelöljük:
git add .
Tároljuk az állományokat egy megjegyzés mellett:
git commit -m "Indulás"
A munka végén
Ha változtatunk egy állomány tartalmán, a nagyobb munkafolyamat végén, vagy a nap végén használjuk megint a git commit parancsot.
Változtatás nano szövegszerkesztővel :
nano main.c
Ebben a példában csak egy kisebb változtatás lesz. Egy újabb printf() utasítást adok a programhoz:
Változtatás után megnézhetjük a tároló állapotát:
git status
A kimenet:
$ git status On branch master 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: main.c no changes added to commit (use "git add" and/or "git commit -a")
Esetünkben egyetlen állomány változott.
A git diff paranccsal megtekinthető a változás:
git diff
Példa a futtatásra:
$ git diff diff --git a/main.c b/main.c index 53fdce4..9584115 100644 --- a/main.c +++ b/main.c @@ -2,4 +2,5 @@ int main() { printf("Helló Világ\n"); + printf("Újabb sor\n"); }
A változások tárolása, megjegyzéssel:
git add . git commit -m "A területszámító függvény elkészült"
Változások megtekintése
A git log paranccsal ellenőrizhetjük mit tettünk eddig:
$ git log commit 72af40509c2fe9c9fd2628464f0d6241aa5d5fe3 Author: Nagy János <janos@zold.and> Date: Sun Sep 9 08:52:02 2018 +0200 Egy újabb sor commit aa761c8cade74cdcd4650ebd7ad95fd6c3fd9622 Author: Nagy János <janos@zold.and> Date: Sun Sep 9 08:34:43 2018 +0200 Indulás
Minden commit rendelkezik egy egyedi azonosítóval.
A változásokat a git show paranccsal megnézhetjük. Ehhez meg kell adni a commit azonosítóját amit a git log parancs is mutat. Nem kell az egészet beírni, minimum 4 karaktert kell megadni, illetve ezen felül, annyit, amivel egyértelműen meghatározható melyik commit-re gondoltunk.
git show aa76
$ git show aa76 commit aa761c8cade74cdcd4650ebd7ad95fd6c3fd9622 Author: Nagy János <janos@zold.and> Date: Sun Sep 9 08:34:43 2018 +0200 Indulás diff --git a/main.c b/main.c new file mode 100644 index 0000000..53fdce4 --- /dev/null +++ b/main.c @@ -0,0 +1,5 @@ +#include <stdio.h> + +int main() { + printf("Helló Világ\n"); +}
Egysoros kimenet:
git log --pretty=oneline
git log --pretty="format:%h %s %d"
git log --pretty="format:%h - %an, %ar : %s %d"
git log --pretty=format:"%h %s" --graph
Visszaállás előző állapotra
A checkout paranccsal bármelyik állapotra visszaállhatunk. Például:
git checkout aa761
A futtatásra példa:
$ git show aa761 fatal: ambiguous argument 'aa7': unknown revision or path not in the working tree. Use '--' to separate paths from revisions, like this: 'git <command> [<revision>...] -- [<file>...]' andras@tatami:~/Projektek/gyak/git/004$ andras@tatami:~/Projektek/gyak/git/004$ git checkout 72af Note: checking out '72af'. You are in 'detached HEAD' state. You can look around, make experimental changes and commit them, and you can discard any commits you make in this state without impacting any branches by performing another checkout. If you want to create a new branch to retain commits you create, you may do so (now or later) by using -b with the checkout command again. Example: git checkout -b <new-branch-name> HEAD is now at aa761... Indulás
Nézzük meg a main.c állományt. Az állományból eltűnt a második sor.
Ilyenkor a git log parancs már nem mutatja a második commitot. Ha mégis szeretnénk az összes commitot megnézni, használjuk a --all kapcsolót:
git log --all
Elágazás
Nézzük meg milyen elágazások (branch-ek) vannak:
git branch
A futtatásra példa:
$ git branch * (HEAD detached at 11e76e0) master
Alapból egyetlen branch van a master. Most hozzunk létre egy újabb branchet:
git branch elagazas-1
Majd nézzük meg milyen branchek vannak:
git branch
$ git branch elagazas-1 $ git branch * (HEAD detached at 11e76e0) elagazas-1 master
A chekout paranccsal eddig állapotokra ugrottunk. Most branch-re fogunk ugrani.
git checkout elagazas-1
Innentől kezdve az elagazas-1 ágban dolgozunk tovább. A master ágra bármikor visszaállhatunk a git checkout master paranccsal.
A checkout-tal is válthatunk egy olyan branch-re, ami még nem létezik a -b kapcsolóval:
git checkout -b elagazas-2
Ekkor automatikusan létrejön az elagazas-2.
Merge
Ha szeretnénk a master águnkba beleolvasztani az elagazas-1 branchet, akkor használjuk a merge parancsot:
git merge elagazas-1
$ git merge elagazas-1 Updating 11e76e0..ff07951 Fast-forward main | Bin 0 -> 8640 bytes main.c | 1 + 2 files changed, 1 insertion(+) create mode 100755 main
Ha nem volt változás a master ágban, a merge egyszerűen végbemegy. A merge természetesen az elagazas-1 ágban is elvégezhető.
Ha közben fejlesztettünk a master ágon ugyanabban a sorban változtattunk, akkor konfliktus keletkezik. A merege így is végrehajtódik, de a forráskódban erre vonatkozó bejegyzések keletkeznek.
$ git merge elagazas-1 Auto-merging main.c CONFLICT (content): Merge conflict in main.c Automatic merge failed; fix conflicts and then commit the result.
- main.c
#include <stdio.h> int main() { printf("Helló Világ\n"); <<<<<<< HEAD printf("Negyedik\n"); ======= printf("Harmadik lehetőség\n"); >>>>>>> elagazas-1 }
A kódot meg kell vizsgálni, és ha minden jó, egyszerűen csak el kell távolítanunk a bejegyzéseket. Ha a változtatás mindkét helyen más sorban történt akkor a merge nem okoz konfliktust.
A .gitignore
Egy projekt könyvtárban mindig vannak olyan fájlok, amiket nem szeretnénk verzió-kezelni. Ezeket egyszerűen vegyük fel a .gitignore állományba.
nano .gitignore
A fájl tartalma például:
# nem kezeljük a .a kiterjesztésű fájlokat: *.a # kivéve a lib.a fájlt: !lib.a # az aktuális könyvtárban nem kezeljük a TODO fájlt: /TODO # a build könyvtár egyetlen állományát sem kezeljük: build/ # nem kezeljük a doc/jegyzet.txt, de a doc/leiras/hardver.txt fájlt igen doc/*.txt # nem kezelünk egyetlen .pdf fájlt sem a doc/ könyvtárban doc/*.pdf