[[oktatas:programozás:verziókontroll:git|< Git]] ====== Git gyorskezdés ====== * **Szerző:** Sallai András * Copyright (c) 2018, Sallai András * Szerkesztve: 2018, 2020, 2023 * Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|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. #include int main() { printf("Helló Világ\n"); } ===== 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 . A **git add .** veszélyes lehet, mivel olyan fájlokat és könyvtárakat is stage állapotba tesz, amit lehet, hogy nem szeretnénk. A parancs előtt használjuk mindig **git status -u** parancsot, vagy egyenként tegyük az állományokat stage állapotba. Amit nem szeretnénk követni, legyen feljegyezve a **.gitignore** fájlban. 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: #include int main() { printf("Helló Világ\n"); printf("Újabb sor\n"); } 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 ..." to update what will be committed) (use "git checkout -- ..." 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 Date: Sun Sep 9 08:52:02 2018 +0200 Egy újabb sor commit aa761c8cade74cdcd4650ebd7ad95fd6c3fd9622 Author: Nagy János 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 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 + +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 [...] -- [...]' 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 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. #include int main() { printf("Helló Világ\n"); } 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. #include 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