Vezérlőpult
18. push, pull, fetch · Távoli tárolók: GitHub

4. témakör · Távoli tárolók: GitHub · 18. fejezet

push, pull, fetch

A csapatmunka három alapművelete: a push feltölti a commitjaidat, a fetch letölti mások munkáját anélkül, hogy a tiédhez nyúlna, a pull pedig letölti és be is építi. Megtanulod, mi a különbség köztük, hogyan olvasd a Your branch is ahead / behind üzeneteket, mi az upstream, és milyen napi ritmusban érdemes szinkronizálni.

CLI + DesktopKét gép, egy GitHubBesorolóSzimulátor15 kvízkérdés

Tanulási célok

1Három parancs, négy hely

🐙 GitHubtávoli repó: main
origin/mainhelyi jegyzet a GitHubról
maina helyi ágad
munkakönyvtára fájljaid
git push
git fetch
git pull = fetch + merge (vagy rebase)
ParancsIrányMit változtat meg?
git pushgéped → GitHuba GitHubon lévő ágat (és a helyi origin/main-t)
git fetchGitHub → gépedcsak az origin/… követő ágakat; a te ágadhoz és a fájljaidhoz nem nyúl
git pullGitHub → gépedaz origin/…-t, a helyi ágadat és a munkakönyvtárat is
ℹ️ A COMMIT NEM PUSH, A PULL NEM CLONE

A git commit csak a saját gépeden menti a változást, a GitHubra a git push teszi fel. A git clone egy új helyi repót hoz létre (egyszer), a git pull egy meglévőt frissít (rendszeresen).

2git push: feltöltés

PS> git push                         # a mostani ágat a követett távoli ágba
To https://github.com/anna-kovacs/csapatprojekt.git
   b81f0d4..e41b7c2  main -> main
PS> git push -u origin feature/kviz  # új ág első feltöltése + követés beállítása
remote: Create a pull request for 'feature/kviz' on GitHub by visiting: …
 * [new branch]      feature/kviz -> feature/kviz
branch 'feature/kviz' set up to track 'origin/feature/kviz'.

3git fetch: letöltés, beépítés nélkül

A git fetch a legbiztonságosabb szinkronizálás: letölti az újdonságokat, frissíti az origin/… ágakat, de a te ágadat és a fájljaidat nem változtatja meg. Utána megnézheted, mi jött, és te döntöd el, mikor építed be.

PS> git fetch
From https://github.com/anna-kovacs/csapatprojekt
   e41b7c2..9c0d1e2  main       -> origin/main
PS> git status
On branch main
Your branch is behind 'origin/main' by 1 commit, and can be fast-forwarded.
PS> git log --oneline main..origin/main   # ami a GitHubon van, de nálam még nincs
9c0d1e2 (origin/main) fix: pontszámítás (Péter)
PS> git diff main origin/main            # és pontosan mi változott
git status üzeneteJelentéseTeendő
up to date with 'origin/main'a legutóbbi fetch szerint egyezik—
ahead of 'origin/main' by 2 commits2 commitod még nincs fentgit push
behind 'origin/main' by 1 commit1 commit fent van, nálad még nincsgit pull
have diverged … 1 and 2 different commitsmindkét oldalon van újgit pull (merge vagy rebase), majd push
⚠️ AZ „UP TO DATE” CSAK A LEGUTÓBBI FETCH-RE VONATKOZIK

A git status nem kérdezi meg a GitHubot, csak az origin/main jegyzetét nézi. Ha rég nem futtattál fetch-et, lehet, hogy azóta mások feltöltöttek. Friss képhez előbb git fetch. A git fetch --prune a GitHubon már törölt ágak követő ágait is eltakarítja.

4git pull: letöltés és beépítés

A git pull két lépés egyben: git fetch, majd a követett ág beépítése a tiédbe. Hogy a beépítés hogyan történik, az a helyzettől függ:

HelyzetMi történik?
nálad nincs új commit (csak lemaradásod van)fast-forward: a main előrelép, nincs merge commit
mindkét oldalon van új (szétváltak)a beállítás szerint merge commit (pull.rebase false) vagy rebase (pull.rebase true)
szétváltak, és nincs beállítása Git megáll: Need to specify how to reconcile divergent branches (19. fejezet)
PS> git config --global pull.rebase false   # szétváláskor merge commit (a régi alapértelmezés)
PS> git pull --rebase                       # egyszeri rebase-es pull (14. fejezet)
PS> git pull --ff-only                      # csak akkor, ha fast-forward lehet
💡 PULL ELŐTT: TISZTA MUNKAKÖNYVTÁR

Ha nem commitolt módosításod van, és a pull ugyanazokat a fájlokat hozná, a Git megtagadja (would be overwritten by merge). Commitolj előbb, vagy tedd félre: git stash, git pull, git stash pop (14. fejezet).

push, fetch vagy pull?

Melyik parancs kell a helyzethez?

1 / 8Pontszám: 0
…

5A követés (upstream)

A helyi ág követi a távoli párját (upstream). Ettől tudja a Git, hová menjen a paraméter nélküli git push, honnan jöjjön a git pull, és mihez hasonlítsa a git status az állapotot.

PS> git branch -vv
* feature/kviz 4a7c2e1 [origin/feature/kviz: ahead 1] feat: kérdéslista
  main         9c0d1e2 [origin/main] fix: pontszámítás
  proba        31b8f09 kísérlet                  # ezt nem követi semmi
Hogyan jön létre a követés?Példa
klónozáskor a fő ágnálgit clone … → main ↔ origin/main
első feltöltéskor -u-valgit push -u origin feature/kviz
távoli ágra váltáskorgit switch fotok (ha létezik origin/fotok)
utólag, kézzelgit branch -u origin/main (--set-upstream-to)
automatikusan minden új ágnálgit config --global push.autoSetupRemote true (utána elég a git push)

6Két gép, egy GitHub

Anna és Péter ugyanazon a projekten dolgozik. Commitolj, tölts fel, tölts le mindkettejük nevében, és figyeld, hogyan mozognak a main, az origin/main és a GitHubon lévő main címkék. Próbáld ki azt is, mi történik, ha ketten egyszerre dolgoznak!

Anna · GitHub · Péter

💻 Anna gépe
🐙 GitHub
anna-kovacs/csapatprojekt
💻 Péter gépe

    

7A napi ritmus

  1. Munka előtt: git switch main, git pull. A mások munkájára építs, ne egy napokkal ezelőtti állapotra.
  2. Munka közben: kis, atomi commitok (7. fejezet), egy feature ágon (11. fejezet).
  3. Rendszeresen: git push. Ami fent van, az biztonságban van (a géped elromolhat), és a társaid is látják.
  4. Feltöltés előtt, ha a push elutasítódik: git pull, az esetleges ütközés feloldása (13. fejezet), aztán újra git push.
  5. Óra / nap végén: git status — ne maradjon feltöltetlen commit (ahead) vagy nem commitolt munka.

8A Desktopban és a VS Code-ban

Desktop GitHub Desktop
  • A felső sáv jobb oldali gombja a helyzethez igazodik: Fetch origin (lekérdezés), Pull origin ↓2 (2 commit jött), Push origin ↑1 (1 commitod nincs fent), új ágnál Publish branch (= push -u).
  • A Desktop magától is lekérdezi (fetch) időnként a GitHubot, és kiírja, mikor volt az utolsó (Last fetched …).
  • Szétvált ágaknál a pull merge commitot készít (vagy a beállításod szerinti rebase-t); ütközésnél ugyanaz az ablak jön, mint merge-nél.
IDE VS Code
  • Az állapotsorban az ág neve mellett a szinkronizálás ikon: ↓1 ↑2 jelzi a lemaradást és az előnyt; rákattintva Sync = pull, majd push.
  • A Source Control panel … menüjében külön is: Pull, Push, Fetch, Pull (Rebase).
  • A git.autofetch beállítással a VS Code is magától lekérdezi a GitHubot.

9Gyakorlás a szimulátorban

A csapatprojekt repóban dolgozol Péterrel. A küldetések során Péter is dolgozik a GitHubon: figyeld, mikor tölt fel valamit!

PowerShell + Git

Windows PowerShell
Küldetések 0 / 9
    A gépeden (helyi repó)
    A GitHubonanna-kovacs/csapatprojekt

    10Feladatok

    Gyakorló feladatok

    ⭐ alap · ⭐⭐ haladó · ⭐⭐⭐ kihívás

    18.1⭐CLI

    Egy saját repódban módosíts, commitolj, és nézd meg a git status-t (ahead)! Töltsd fel, és nézd meg újra. Ellenőrizd a GitHubon is.

    18.2⭐Web

    A GitHub weboldalán szerkeszd a README-t (ceruza ikon → commit). A gépeden előbb csak git fetch, majd git status és git log --oneline main..origin/main. Végül git pull.

    18.3⭐

    A „Két gép, egy GitHub” részben idézz elő olyan helyzetet, amelyben Péter push-a elutasítódik, majd oldd meg. Próbáld ki merge-dzsel és rebase-szel is, és hasonlítsd össze a GitHub gráfját!

    18.4⭐⭐CLI

    Hozz létre egy ágat, és töltsd fel -u nélkül. Olvasd el a hibaüzenetet, majd javítsd. Állítsd be a push.autoSetupRemote opciót, és próbáld ki egy újabb ággal.

    18.5⭐⭐Desktop

    Párban, ugyanazon a repón: mindketten commitoljatok, majd egyikőtök töltsön fel, a másik próbálja meg a GitHub Desktopban. Mit mutat a gomb (Push / Pull origin)? Oldjátok meg!

    18.6⭐⭐CLI

    Törölj a GitHubon egy már beolvasztott ágat. A gépeden nézd meg a git branch -r kimenetét a git fetch és a git fetch --prune után.

    18.7⭐⭐⭐

    Rajzolj egy idővonalat (vagy készítsd el a „Két gép” résszel), amelyen három ember dolgozik egy repón egy napig! Jelöld, ki mikor pull-ol és push-ol, és hol keletkezik merge commit. Hogyan lehetne kevesebb merge commit? (Tipp: pull.rebase, rövid életű ágak.)

    11Önellenőrző kvíz

    Ellenőrizd magad!

    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.

    12Fogalomtár

    FogalomJelentés
    git pusha helyi commitok feltöltése a távoli repóba
    git fetchletöltés: csak a távoli követő ágak (origin/…) frissülnek
    git pullfetch + a követett ág beépítése (fast-forward, merge vagy rebase)
    upstream (követett ág)a helyi ág távoli párja, pl. main ↔ origin/main
    -u / --set-upstreama követés beállítása az első feltöltéskor
    ahead / behindhány commitod nincs fent / hány távoli commit nincs nálad
    diverged (szétvált)mindkét oldalon van új commit; pull-lal kell egyesíteni
    pull.rebasebeállítás: szétváláskor merge (false) vagy rebase (true)
    git fetch --prunea távol már törölt ágak követő ágainak eltávolítása
    Fetch / Pull / Push origina GitHub Desktop szinkronizáló gombja; a VS Code-ban a Sync

    13Összegzés

    1. git push: feltöltés; új ágnál -u. A commit csak helyben ment, a push viszi fel.
    2. git fetch: biztonságos letöltés, csak az origin/… frissül; utána git log main..origin/main, git diff.
    3. git pull = fetch + beépítés: fast-forward, vagy szétváláskor merge / rebase (pull.rebase).
    4. A git status az utolsó fetch alapján mutat előnyt (push kell) és lemaradást (pull kell). Követés: git branch -vv.
    5. Napi ritmus: pull a munka előtt, kis commitok, gyakori push; elutasított push → pull, feloldás, push.

    A következő fejezetben a szinkronizálás nehezebb eseteit vesszük sorra: elutasított push, ütköző pull, szétvált ágak, force push.