4. témakör · Távoli tárolók: GitHub · 17. fejezet
Eddig minden a saját gépeden történt. Most összekötjük a helyi repót a GitHubon lévő távoli repóval (remote). Megtanulod, hogyan
töltesz le egy teljes projektet a történetével együtt (clone), mi az origin és az origin/main, és hogyan
teszel fel egy meglévő helyi projektet egy új GitHub-repóba, parancssorból és a GitHub Desktopból is.
origin, és kezeled őket (git remote).origin/main) és a követési (upstream) kapcsolatot.A Git elosztott verziókezelő (1. fejezet): nincs egyetlen „főgép”, minden résztvevő gépén a teljes repó ott van, a teljes történettel. A GitHubon lévő repó műszakilag ugyanilyen példány, csak megállapodás szerint ez a közös találkozási pont.
clone, fetch, pull, push, 18. fejezet).A remote egy távoli repó becenévvel ellátott címe. Így nem kell minden parancsba a teljes URL-t írni. Klónozáskor a Git automatikusan
felveszi a forrást origin néven. Ez csak egy szokásos név, nincs benne semmi különleges.
PS> git remote -v origin https://github.com/anna-kovacs/weboldal.git (fetch) origin https://github.com/anna-kovacs/weboldal.git (push)
Egy repónak több remote-ja is lehet: például egy forkolt projektnél az origin a saját másolatod, az upstream pedig az eredeti (22. fejezet).
PS> cd ~\projektek PS> git clone https://github.com/toth-peter/hazibuli.git Cloning into 'hazibuli'... remote: Enumerating objects: 12, done. … PS> cd hazibuli # a klón egy új mappába kerül: lépj bele! PS> git clone https://github.com/toth-peter/hazibuli.git buli-projekt # saját mappanévvel
git clone létrehoz egy új mappát a repó nevével. Ne egy másik repón belül futtasd (5. fejezet: beágyazott repó)!git pull (18. fejezet), nem egy újabb clone.git clone | Download ZIP | |
|---|---|---|
| Történet | a teljes történet, minden ág és címke | csak a legfrissebb állapot fájljai |
.git mappa | van: rögtön Git-repó | nincs: sima mappa |
| Kapcsolat a GitHubbal | be van állítva (origin), pull és push azonnal megy | nincs |
| Mire jó? | ha dolgozni akarsz rajta | ha csak meg akarod nézni vagy használni |
Melyik a helyes lépés a helyzetben?
Lépkedj végig a git clone belső lépésein, és figyeld, mi jön létre a gépeden!
Klónozás után a git log --oneline --all ilyesmit mutat:
b77d818 (HEAD -> main, origin/main, origin/HEAD) feat: meghívó 533b90a Buli oldal
main: a te helyi ágad; ezen dolgozol, commitkor ez lép.origin/main: a távoli követő ág, egy helyi, csak olvasható jegyzet arról, hol állt a GitHubon a main a legutóbbi kapcsolatkor
(clone, fetch, pull, push). Nem frissül magától! Ha azóta Péter feltöltött, az origin/main csak a következő git fetch után mutatja (18. fejezet).origin/HEAD: melyik a GitHubon az alapértelmezett ág.main követi (upstream) az origin/main-t. Ezért tudja a git status kiírni:
Your branch is up to date with 'origin/main', és ezért elég paraméter nélkül git pull / git push.PS> git branch -a * main remotes/origin/HEAD -> origin/main remotes/origin/fotok remotes/origin/main PS> git switch fotok branch 'fotok' set up to track 'origin/fotok'. Switched to a new branch 'fotok'
A klón csak az alapértelmezett ágból készít helyi ágat. A többi ágra a git switch fotok elég: ha nincs ilyen helyi ág, de van
origin/fotok, a Git létrehozza a követő helyi ágat.
Ha a projekt a gépeden kezdődött (git init, 5. fejezet), és most tennéd fel a GitHubra:
PS> git remote add origin https://github.com/anna-kovacs/receptek.git PS> git branch -M main # az ág neve legyen main (ha master volt) PS> git push -u origin main # feltöltés + követés beállítása (18. fejezet)
Ha a GitHubon README-vel hoztad létre a repót, ott már van egy commit (Initial commit), amelynek semmi köze a gépeden lévő történethez. A push elutasítódik
(rejected … fetch first). Megoldás: töltsd le és fésüld össze a két független történetet:
git pull origin main --allow-unrelated-histories, majd git push -u origin main. Legközelebb hozd létre üresen a repót!
| Parancs | Mit csinál? |
|---|---|
git remote · git remote -v | a remote-ok nevei · nevek és címek |
git remote add origin <url> | új remote felvétele |
git remote set-url origin <url> | a cím cseréje (pl. HTTPS → SSH, vagy átnevezett repó) |
git remote rename origin github | átnevezés (a követő ágak neve is változik) |
git remote remove origin | eltávolítás: a GitHubon semmi nem törlődik, csak a helyi kapcsolat |
git remote show origin | részletek: címek, alapértelmezett ág, követett ágak |
A GitHub átirányítja a régi címet, így minden tovább működik. Tisztább azonban frissíteni: git remote set-url origin <új cím>.
origin-t, és feltölt.Klónozd le Péter nyilvános hazibuli repóját, nézz körül benne, aztán töltsd fel a saját receptek projektedet egy GitHub-repóba,
amelyet (sajnos) README-vel hoztál létre. A cd .. a mappák közötti váltáshoz kell.
⭐ alap · ⭐⭐ haladó · ⭐⭐⭐ kihívás
Klónozz le egy nyilvános repót (pl. https://github.com/github/gitignore.git), és nézd meg a git remote -v, a git branch -a
és a git log --oneline -5 kimenetét.
Töltsd le ugyanazt a repót ZIP-ként is, és hasonlítsd össze a két mappát (ls -Force). Mi hiányzik a ZIP-ből, és mi nem működik ezért benne?
Klónozd le az egyik saját GitHub-repódat a GitHub Desktoppal (File → Clone repository), majd nyisd meg parancssorban is (Repository → Open in …), és futtasd a
git status-t.
Egy korábbi, csak helyben létező gyakorló repódat töltsd fel egy új, üres GitHub-repóba a GitHub által javasolt három paranccsal.
Egy másik helyi repót a GitHub Desktop Publish repository gombjával tegyél fel, privát repóként. Ellenőrizd a GitHubon, majd a gépeden a
git remote -v paranccsal.
Nevezd át a GitHubon az egyik repódat (Settings → Repository name). Működik még a git push? Frissítsd a címet a git remote set-url paranccsal.
Szándékosan idézd elő a README-csapdát: hozz létre README-vel egy GitHub-repót, és próbálj bele feltölteni egy helyi repót. Olvasd el a hibaüzeneteket, és oldd meg a
--allow-unrelated-histories kapcsolóval. Rajzold le a git log --graph alapján, mi történt.
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 |
|---|---|
| helyi repó (local) | a repó a saját gépeden, munkakönyvtárral |
| távoli repó (remote) | a repó egy másik helyen (pl. a GitHubon); a helyi repóban becenévvel hivatkozunk rá |
origin | a klónozás forrásának szokásos remote-neve |
git clone | egy távoli repó teljes letöltése (történettel), origin és követő ág beállításával |
| távoli követő ág (remote-tracking branch) | pl. origin/main: helyi jegyzet arról, hol állt a távoli ág a legutóbbi kapcsolatkor |
| követés (upstream) | a helyi ág és a távoli ág párosítása (main ↔ origin/main); ettől működik paraméter nélkül a pull és a push |
git remote add / set-url / rename / remove | remote felvétele · cím cseréje · átnevezés · eltávolítás |
| elosztott verziókezelés | minden klón a teljes történetet tartalmazza; nincs egyetlen nélkülözhetetlen központ |
--allow-unrelated-histories | két, közös ős nélküli történet összefésülésének engedélyezése |
| Publish repository (Desktop) | helyi repó feltöltése egy újonnan létrehozott GitHub-repóba |
origin. git remote -v.git clone <url>: új mappa, teljes történet, origin, követő main. Projektenként egyszer; utána git pull.origin/main csak a legutóbbi kapcsolatkori állapotot mutatja; a többi ágra git switch <ág> hoz létre követő ágat.git remote add origin → git push -u origin main (vagy Desktop: Publish repository).A következő fejezetben a mindennapi szinkronizálás jön: push, pull, fetch.