Felhasználói eszközök

Eszközök a webhelyen


oktatas:programozas:verziokontroll:git:git_gyorskezdes

< Git

Git gyorskezdés

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

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.

main.c
#include <stdio.h>
 
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

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 egy 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:

main.c
#include <stdio.h>
 
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 <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. No 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.

main.c
#include <stdio.h>
 
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.
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
oktatas/programozas/verziokontroll/git/git_gyorskezdes.txt · Utolsó módosítás: 2020/11/01 12:59 szerkesztette: admin