4. témakör · Távoli tárolók: GitHub · 18. fejezet
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.
git push, a git fetch és a git pull, és melyik mit változtat meg.git status előny/lemaradás üzeneteit, és a git log main..origin/main-nel megnézed, mi jön.-u, git branch -vv.pull.rebase.| Parancs | Irány | Mit változtat meg? |
|---|---|---|
git push | géped → GitHub | a GitHubon lévő ágat (és a helyi origin/main-t) |
git fetch | GitHub → géped | csak az origin/… követő ágakat; a te ágadhoz és a fájljaidhoz nem nyúl |
git pull | GitHub → géped | az origin/…-t, a helyi ágadat és a munkakönyvtárat is |
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).
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'.
-u-val (--set-upstream) kell feltölteni. Enélkül a Git megmondja a teendőt: has no upstream branch … use git push --set-upstream origin ….git push origin v1.1.0 vagy git push --tags (15. fejezet).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 üzenete | Jelentése | Teendő |
|---|---|---|
| up to date with 'origin/main' | a legutóbbi fetch szerint egyezik | — |
| ahead of 'origin/main' by 2 commits | 2 commitod még nincs fent | git push |
| behind 'origin/main' by 1 commit | 1 commit fent van, nálad még nincs | git pull |
| have diverged … 1 and 2 different commits | mindkét oldalon van új | git pull (merge vagy rebase), majd push |
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.
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:
| Helyzet | Mi 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ás | a 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
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).
Melyik parancs kell a helyzethez?
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ál | git clone … → main ↔ origin/main |
első feltöltéskor -u-val | git push -u origin feature/kviz |
| távoli ágra váltáskor | git switch fotok (ha létezik origin/fotok) |
| utólag, kézzel | git branch -u origin/main (--set-upstream-to) |
| automatikusan minden új ágnál | git config --global push.autoSetupRemote true (utána elég a git push) |
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!
git switch main, git pull. A mások munkájára építs, ne egy napokkal ezelőtti állapotra.git push. Ami fent van, az biztonságban van (a géped elromolhat), és a társaid is látják.git pull, az esetleges ütközés feloldása (13. fejezet), aztán újra git push.git status — ne maradjon feltöltetlen commit (ahead) vagy nem commitolt munka.push -u).git.autofetch beállítással a VS Code is magától lekérdezi a GitHubot.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!
⭐ alap · ⭐⭐ haladó · ⭐⭐⭐ kihívás
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.
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.
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!
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.
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!
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.
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.)
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 |
|---|---|
git push | a helyi commitok feltöltése a távoli repóba |
git fetch | letöltés: csak a távoli követő ágak (origin/…) frissülnek |
git pull | fetch + 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-upstream | a követés beállítása az első feltöltéskor |
| ahead / behind | há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.rebase | beállítás: szétváláskor merge (false) vagy rebase (true) |
git fetch --prune | a távol már törölt ágak követő ágainak eltávolítása |
| Fetch / Pull / Push origin | a GitHub Desktop szinkronizáló gombja; a VS Code-ban a Sync |
git push: feltöltés; új ágnál -u. A commit csak helyben ment, a push viszi fel.git fetch: biztonságos letöltés, csak az origin/… frissül; utána git log main..origin/main, git diff.git pull = fetch + beépítés: fast-forward, vagy szétváláskor merge / rebase (pull.rebase).git status az utolsó fetch alapján mutat előnyt (push kell) és lemaradást (pull kell). Követés: git branch -vv.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.