2. témakör · Helyi munka: az első commitok · 8. fejezet
A commitok a projekt naplóját adják, most megtanulod olvasni ezt a naplót. Megnézzük, mit jelent a commitok
azonosítója, a hash, hogyan szűröd a git log kimenetét, hogyan hivatkozol egy régebbi
commitra, és hogyan mutatja meg a git show és a git diff, hogy
pontosan mi változott.
git log kimenetét (--oneline, --stat, -p, --author, fájlra).HEAD-del és HEAD~2-féle relatív alakkal.git show, a git diff és a git blame segítségével kideríted, mi, mikor és miért változott, és el tudod olvasni a diff kimenetét.Minden commitnak van egy azonosítója, a hash (más néven SHA vagy commit-ID). Ez egy 40 hexadecimális jegyből (0–9, a–f) álló szám, például:
a3f1c07d92e4b1c6f0a8e57b3d21c9f4e6a0b8d2
A Git a SHA-1 nevű hash-függvénnyel számolja ki a commit teljes tartalmából: a fájlok pillanatképéből, a szülő-commit hash-éből, a szerzőből, az időpontból és az üzenetből. Ezért:
a3f1c07).
A Git legalább 4 jegyet fogad el, ha az egyértelmű.Írj a „fájlba”! A Git ugyanezt a hash-t adná rá (git hash-object etlap.txt). Figyeld, hány jegy
változik meg egyetlen karakter módosításakor.
—A SHA-1-et ma már nem tartják elég erősnek titkosítási célra, ezért a Git fejlesztői fokozatosan áttérnek a hosszabb SHA-256-ra (64 jegy). A mindennapi használatban a GitHub és a legtöbb repó ma is 40 jegyű SHA-1 hash-t mutat.
Minden commit tárolja a szülője, vagyis az előző commit hash-ét. A commitok így egy láncot alkotnak, amelyben mindegyik visszafelé mutat. Mivel a szülő hash-e része a commit tartalmának, a hash a teljes addigi történettől függ.
Írd át valamelyik commit üzenetét, és figyeld a hash-eket!
Egy régi commit módosítása valójában új commitokat hoz létre, új hash-sel, és minden utána következő commit is új hash-t kap. Ha a régit már feltöltötted, és a társaid is letöltötték, az ő gépükön más történet lesz, mint a tiéden. Ezért egy már megosztott commitot nem írunk át, hanem egy új, javító commitot készítünk (10. fejezet).
A git log a legfrissebbtől visszafelé listázza az aktuális ág commitjait:
user.name és a user.email beállításból)Ha a kimenet nem fér ki, a Git egy lapozóban (pager) mutatja. A sor végén : látszik,
a program vár. Szóköz: következő oldal, ↑/↓: soronként, /: keresés,
q: kilépés. Sok kezdő itt „beragad”: a q a megoldás.
| Parancs | Mit mutat? |
|---|---|
git log --oneline | commitonként egy sor: rövid hash és tárgysor |
git log -n 3 · git log -3 | csak a legutóbbi 3 commit |
git log --stat | melyik fájl hány sorban változott |
git log -p | minden commit teljes változása (diffje) |
git log -- etlap.html | csak az adott fájlt érintő commitok (a -- után fájlnév jön) |
git log --author="Tóth" | csak az adott szerző commitjai (a név egy része is elég) |
git log --grep="fix" | azok a commitok, amelyek üzenetében szerepel a szöveg |
git log --since="2 weeks ago" | időszakra szűr (--until a vége) |
git log --oneline --graph --all | az összes ág rajzzal: az ágaknál (11–12. fejezet) nagyon hasznos |
A kapcsolók kombinálhatók. Egy fájl részletes története például: git log -p -- etlap.html.
A Csésze Kávézó weboldalának öt commitja. Válaszd ki a kapcsolókat, és nézd, hogyan változik a kimenet.
A parancsoknak (git show, git diff, később a git revert,
git reset …) meg kell mondani, melyik commitról van szó. Erre többféle hivatkozás van:
| Hivatkozás | Jelentés |
|---|---|
a3f1c07d92e4… · a3f1c07 | a teljes vagy a rövid hash (legalább 4 jegy, egyértelmű legyen) |
HEAD | ahol most állsz: az aktuális ág legutolsó commitja |
main | egy ág neve: az ág legutolsó commitja |
HEAD~1 · HEAD~2 · HEAD~n | n lépéssel korábbi commit (szülő, nagyszülő, …) |
HEAD^ · HEAD^^ | ugyanaz, mint a HEAD~1 és a HEAD~2 |
main~3 · a3f1c07~1 | a ~ bármilyen hivatkozás után állhat |
A Windows régi cmd.exe-jében a ^ különleges karakter, ezért a HEAD^ ott
nem úgy működik, ahogy várnád. PowerShellben és Git Bashben nincs vele gond. A HEAD~1 alak mindenhol biztonságos.
Írj be egy hivatkozást (pl. HEAD~2, main^, c8b4), vagy
oldd meg a feladványokat: kattints arra a commitra, amelyre a hivatkozás mutat!
A git show egyetlen commitot mutat meg: a fejlécét (mint a git log), és alatta a
teljes változását. Hivatkozás nélkül a HEAD-et, vagyis a legutolsó commitot mutatja.
PS> git show a3f1c07 commit a3f1c07d92e4b1c6f0a8e57b3d21c9f4e6a0b8d2 Author: Szabó Lili <szabo.lili@pelda.hu> Date: Wed Sep 16 15:30:00 2026 +0200 fix: cappuccino árának javítása diff --git a/etlap.html b/etlap.html index 5e1d2c4..9f07ab3 100644 --- a/etlap.html +++ b/etlap.html @@ -1,6 +1,6 @@ <h1>Étlap</h1> <ul> <li>Espresso – 590 Ft</li> - <li>Cappuccino – 890 Ft</li> + <li>Cappuccino – 950 Ft</li> <li>Kakaó – 790 Ft</li> </ul>
| Parancs | Mit mutat? |
|---|---|
git show | a legutolsó commitot (HEAD) a változásaival |
git show HEAD~2 | a két lépéssel korábbi commitot |
git show a3f1c07 --stat | csak az összesítést: melyik fájl hány sorban változott |
git show HEAD~2:etlap.html | egy fájl akkori teljes tartalmát (a : után a repó gyökerétől számított útvonal) |
Egy fájl régi változatát a git show HEAD~3:style.css | Set-Content regi-style.css paranccsal
elmentheted anélkül, hogy bármit visszaállítanál. A visszaállítás módjait a 10. fejezetben tanuljuk.
A git diff két állapot közötti különbséget mutatja soronként. A kérdés mindig az, melyik
két állapotot hasonlítja össze. Ismerős a 6. fejezet három területe:
| Parancs | Mit hasonlít össze? | Mikor hasznos? |
|---|---|---|
git diff | munkakönyvtár ↔ előkészítési terület | mit módosítottam, amit még nem adtam hozzá? |
git diff --staged(régebbi neve: --cached) | előkészítési terület ↔ utolsó commit | mi kerül a következő commitba? Commit előtt érdemes megnézni! |
git diff HEAD | munkakönyvtár ↔ utolsó commit | minden változás az utolsó commit óta |
git diff HEAD~3 HEADvagy HEAD~3..HEAD | két commit | mi változott a kettő között? |
git diff -- style.css | (bármelyik fenti, egy fájlra szűkítve) | csak egy fájl érdekel |
git diff --stat | (bármelyik fenti, összesítve) | áttekintés: melyik fájl hány sorban változott |
Ha a git diff semmit nem ír ki, két eset lehet: vagy nincs változás, vagy már minden változást
előkészítettél, ekkor a git diff --staged mutatja őket. Az új, még követetlen fájlokat a
git diff egyáltalán nem mutatja, azokról a git status szól.
Válaszd ki, melyik parancs válaszol a kérdésre!
A diff kimenete (unified diff formátum) elsőre ijesztő, de néhány szabállyal könnyen olvasható:
/dev/null (a „semmi”), és minden sor +. Törölt fájlnál fordítva.Bal oldalt a régi, jobb oldalt az új változat. Módosíts, törölj, szúrj be sorokat!
A git blame fájl a fájl minden sora mellé kiírja, melyik commit, ki és mikor írta
utoljára. Ha egy sor furcsa, innen tudod meg, melyik commitban került oda, és a git show-val
elolvashatod a commit üzenetét: miért változott.
PS> git blame etlap.html 7c21e9ab (Kovács Anna 2026-09-11 13:40:00 +0200 1) <h1>Étlap</h1> 7c21e9ab (Kovács Anna 2026-09-11 13:40:00 +0200 2) <ul> 7c21e9ab (Kovács Anna 2026-09-11 13:40:00 +0200 3) <li>Espresso – 590 Ft</li> a3f1c07d (Szabó Lili 2026-09-16 15:30:00 +0200 4) <li>Cappuccino – 950 Ft</li> 7c21e9ab (Kovács Anna 2026-09-11 13:40:00 +0200 5) <li>Kakaó – 790 Ft</li> 7c21e9ab (Kovács Anna 2026-09-11 13:40:00 +0200 6) </ul>
A „blame” szó jelentése „hibáztatni”, de a parancs valódi célja a kontextus: kitől kérdezhetsz, és melyik commit üzenete magyarázza el a sort. A GitHubon egy fájl megnyitásakor a Blame gomb ugyanezt mutatja, a VS Code-ban a GitLens bővítmény a sor mellé írja.
git diff HEAD-nek felel meg).github.com/felhasznalo/repo/commit/a3f1c07. Rövid hash-sel is működik.A kavezo repóban öt commit van három szerzőtől, és az étlapon van egy még nem commitolt módosítás.
Nyomozz a történetben! A szimulátor alatt a commitlánc látszik a HEAD~n hivatkozásokkal.
⭐ alap · ⭐⭐ haladó · ⭐⭐⭐ kihívás
A saját repódban futtasd a git log, a git log --oneline és a
git log --stat parancsot! Keresd meg a legelső commit hash-ét, és írd ki a
git show <rövid hash> paranccsal.
Módosíts egy követett fájlt, de ne add hozzá! Nézd meg a git diff kimenetét. Ezután
git add, és futtasd újra a git diff-et és a
git diff --staged-et. Írd le, mikor melyik mutat valamit, és miért.
Egy repóban 6 commit van. Melyik commitra mutat a HEAD~5? És a HEAD~6? Próbáld
ki a Célkeresőben vagy a saját repódban, és magyarázd meg a hibaüzenetet!
Nyisd meg a repódat a GitHub Desktopban! A History fülön keresd meg ugyanazt a commitot, amelyet a 8.1-ben a
parancssorban néztél. Egyezik a hash? Másold ki a Copy SHA menüponttal, és illeszd be egy
git show parancsba.
Egy nyilvános GitHub-repóban (pl. a github/gitignore) nyiss meg egy fájlt, és nézd meg a
History és a Blame nézetét! Melyik sort módosították utoljára, ki, és milyen üzenettel?
Készíts egy fájlt hello tartalommal (egy sortöréssel a végén), és számold ki a hash-ét a
git hash-object fájlnév paranccsal! Hasonlítsd össze a Hash-laborban kapott értékkel.
Ha eltér, mi lehet az oka? (Tipp: sorvége, kódolás.)
Egy csapatprojektben derítsd ki parancssorból: ki commitolt a legtöbbet (git shortlog -sn),
melyik fájl változott a legtöbbször (git log --name-only --oneline), és mi volt az utolsó
hibajavítás (git log --grep="fix" -1 -p). Írj róla rövid jelentést.
Az egyválasztós kérdéseknél kattints a válaszra. A többválasztósaknál jelöld be az összes helyeset, majd nyomd meg az Ellenőrzés gombot.
| Fogalom | Jelentés |
|---|---|
| commit-hash (SHA) | a commit 40 jegyű hexadecimális azonosítója, a tartalmából számolva (SHA-1) |
| rövid hash | a hash első jegyei (általában 7), ha egyértelműek |
| szülő-commit | az előző commit; a hash-ét minden commit tárolja, így láncot alkotnak |
HEAD | ahol most állsz: az aktuális ág legutolsó commitja |
HEAD~n · HEAD^ | n lépéssel korábbi commit · a szülő (= HEAD~1) |
git log | a commitok listája a legfrissebbtől visszafelé |
git show | egy commit fejléce és teljes változása; rev:fájl alakban egy régi fájlváltozat |
git diff | két állapot soronkénti különbsége (alapból munkakönyvtár ↔ index) |
git diff --staged | az előkészített változások: index ↔ utolsó commit |
| diff / patch | a különbség leírása: - törölt, + új sor |
| hunk | a diff egy összefüggő változott blokkja, @@ -régi +új @@ fejléccel |
git blame | soronként mutatja, melyik commit, ki és mikor írta |
| lapozó (pager) | a hosszú kimenet nézegetője; q: kilépés |
git log + --oneline, -n, --stat, -p,
--author, --grep, -- fájl. Hosszú kimenetből q-val lépsz ki.HEAD, ágnév, HEAD~n, HEAD^.git show: egy commit változása · git diff: munkakönyvtár ↔ index ·
git diff --staged: index ↔ HEAD · git diff a b: két commit · git blame: ki írta a sort.A következő fejezetben megtanuljuk, hogyan tartsuk távol a repótól azokat a fájlokat, amelyeknek nincs benne helyük:
.gitignore.