[[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