-
1. Začetek
- 1.1 O nadzoru različic
- 1.2 Kratka zgodovina Gita
- 1.3 Kaj je Git?
- 1.4 Ukazna vrstica
- 1.5 Namestitev Gita
- 1.6 Prva nastavitev Gita
- 1.7 Pridobivanje pomoči
- 1.8 Povzetek
-
2. Osnove Git
- 2.1 Pridobivanje repozitorija Git
- 2.2 Snemanje sprememb v repozitorij
- 2.3 Pregled zgodovine potrditev
- 2.4 Razveljavljanje stvari
- 2.5 Delo z daljavami
- 2.6 Označevanje
- 2.7 Aliasi Git
- 2.8 Povzetek
-
3. Veje Git
- 3.1 Veje na kratko
- 3.2 Osnove vej in združevanja
- 3.3 Upravljanje vej
- 3.4 Poteki dela z vejami
- 3.5 Oddaljene veje
- 3.6 Ponovno baziranje
- 3.7 Povzetek
-
4. Git na strežniku
- 4.1 Protokoli
- 4.2 Pridobitev Gita na strežniku
- 4.3 Generiranje vaših javnih ključev SSH
- 4.4 Nastavitev strežnika
- 4.5 Prikriti proces Git
- 4.6 Pametni HTTP
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 Možnosti gostovanja pri tretjih ponudnikih
- 4.10 Povzetek
-
5. Porazdeljeni Git
- 5.1 Porazdeljeni poteki dela
- 5.2 Prispevek k projektu
- 5.3 Vzdrževanje projekta
- 5.4 Povzetek
-
6. GitHub
-
7. Orodja Git
- 7.1 Izbira revizije
- 7.2 Interaktivno pripravljanje
- 7.3 Shranjevanje na varno (angl. stashing) in čiščenje
- 7.4 Podpisovanje vašega dela
- 7.5 Iskanje
- 7.6 Prepisovanje zgodovine
- 7.7 Demistifikacija ponastavitve
- 7.8 Napredno združevanje
- 7.9 Rerere
- 7.10 Razhroščevanje z Gitom
- 7.11 Podmoduli
- 7.12 Povezovanje v pakete
- 7.13 Zamenjava
- 7.14 Shramba poverilnic
- 7.15 Povzetek
-
8. Prilagoditev Gita
- 8.1 Konfiguracija Git
- 8.2 Atributi Git
- 8.3 Kljuke Git
- 8.4 Primer pravilnika, ki ga uveljavlja Git
- 8.5 Povzetek
-
9. Git in ostali sistemi
- 9.1 Git kot odjemalec
- 9.2 Migracija na Git
- 9.3 Povzetek
-
10. Notranjost Gita
- 10.1 Napeljava in keramika
- 10.2 Objekti Git
- 10.3 Reference Git
- 10.4 Packfiles (datoteke zmanjšanih podatkov)
- 10.5 Refspec
- 10.6 Protokoli prenosa
- 10.7 Vzdrževanje in obnovitev podatkov
- 10.8 Spremenljivke okolja
- 10.9 Povzetek
-
A1. Dodatek A: Git v drugih okoljih
- A1.1 Grafični vmesniki
- A1.2 Git v Visual Studio
- A1.3 Git v Visual Studio Code
- A1.4 Git v IntelliJ / PyCharm / WebStorm / PhpStorm / RubyMine
- A1.5 Git v Sublime Text
- A1.6 Git v Bashu
- A1.7 Git v Zsh
- A1.8 Git v Powershellu
- A1.9 Povzetek
-
A2. Dodatek B: Vdelava Gita v vašo aplikacijo
- A2.1 Git v ukazni vrstici
- A2.2 Libgit2
- A2.3 JGit
- A2.4 go-git
- A2.5 Dulwich
-
A3. Dodatek C: Ukazi Git
- A3.1 Nastavitev in konfiguracija
- A3.2 Pridobivanje in ustvarjanje projektov
- A3.3 Osnove posnetkov
- A3.4 Veje in združevanje
- A3.5 Deljenje in posodabljanje projektov
- A3.6 Pregled in primerjava
- A3.7 Razhroščevanje
- A3.8 Popravljanje
- A3.9 E-pošta
- A3.10 Zunanji sistemi
- A3.11 Administracija
- A3.12 Orodja za sisteme napeljave
3.5 Veje Git - Oddaljene veje
Oddaljene veje
Oddaljene reference so reference (kazalci) v vaših oddaljenih repozitorijih, vključno z vejami, oznakami itd.
Polni seznam oddaljenih referenc lahko dobite izrecno z git ls-remote <remote>
, ali git remote show <remote>
za oddaljene veje kot tudi več informacij.
Vseeno, bolj pogosti način je izkoristiti veje, ki sledijo daljavam.
Veje, ki sledijo daljavam, so reference stanja oddaljenih vej. So lokalne reference, ki jih ne morete premakniti; Git jih za vas premakne, kadarkoli naredite kakršnokoli omrežno komunikacijo, da zagotovi, da pravilno predstavljajo stanje oddaljenega repozitorija. Razmišljajte o njih kot o zaznamkih, ki vas opominjajo, kje so bile veje v vaših oddaljenih repozitorijih, ko ste se zadnjič nanje povezali.
Veje s sledenjem daljav imajo obliko <remote>/<branch>
.
Na primer, če želite videti, kakšna je bila veja master
na vaši daljavi origin
od zadnjič, ko ste komunicirali z njo, bi preverili vejo origin/master
.
Če ste delali na težavi s partnerjem in ta potisne na vejo iss53
, imate morda vašo lastno lokalno vejo iss53
, vendar veja na strežniku bi bila predstavljena kot veja s sledenjem daljave origin/iss53
.
To je lahko nekoliko zmedeno, torej poglejmo primer.
Recimo, da imate strežnik Git na vašem omrežju na git.ourcompany.com
.
Če klonirate iz tega, vam jo Gitov ukaz clone
avtomatično poimenuje origin
, povleče vse njene podatke, ustvari kazalec, kjer se nahaja njegova veja master
in jo lokalno poimenuje origin/master
.
Git vam da tudi vašo lastno lokalno vejo master
, ki se začne na istem mestu kot veja izvora (angl. origin) master
, tako da imate nekaj za narediti iz tega.
Opomba
|
»origin« ni nič posebnega
Tako kot ime veje »master« nima v Gitu nobenega posebnega pomena, ga prav tako nima »origin«.
Medtem ko je »master« privzeto ime za začetno vejo, ko poženete |
Če naredite nekaj dela na vaši lokalni veji master
in vmes nekdo drug potisne na git.ourcompany.com
in posodobi njegovo vejo master
, potem se bosta vaši zgodovini premaknili različno naprej.
Tudi, dokler ostanete izven povezave z vašim strežnikom origin
, se vaš kazalec origin/master
ne bo premaknil.
Da sinhronizirate vaše delo z dano daljavo, poženite ukaz git fetch <remote>
(v našem primeru, git fetch origin
).
Ta ukaz poišče strežnik, kjer je »origin« (v tem primeru je git.ourcompany.com
), prenese iz njega kakršnekoli podatke, ki jih še nimate, in posodobi vašo lokalno podatkovno bazo, kar premakne vaš kazalec origin/master
na njegov novi, bolj posodobljen položaj.
git fetch
posodobi vaše veje s sledenjem na daljavoZa demonstracijo imetja večih oddaljenih strežnikov in kako so oddaljene veje za te oddaljene projekte videti, predpostavimo, da imate drug interni strežnik Git, ki je uporabljen samo za razvoj s strani ene vaših šprintnih ekip (angl. sprint teams).
Ta strežnik je na git.team1.ourcompany.com
.
Lahko ga dodate kot novo oddaljeno referenco k projektu, kjer trenutno delate, s pogonom ukaza git remote add
, kot smo pokrili v Osnove Git.
Poimenujte to daljavo teamone
, ki bo vaše kratko ime za ta celotni URL.
Sedaj lahko poženete git fetch teamone
, da prenesete vse, kar ima oddaljeni strežnik teamone
in česar vi še nimate.
Ker ima ta strežnik podnabor podatkov, ki jih ima sedaj vaš strežnik origin
, Git ne prenese nobenih podatkov, vendar postavi vejo s sledenjem daljave imenovano teamone/master
, ki kaže na potrditev, ki jo ima teamone
na njihovi veji master
.
teamone/master
Potiskanje
Ko želite deliti vejo s svetom, jo morate potisniti na daljavo, na kateri imate dostop pisanja. Vaše lokalne veje niso avtomatično sinhronizirane z daljavami, na katere pišete — eksplicitno morate potisniti veje, ki jih želite deliti. Na ta način lahko uporabite zasebne veje za delo, ki ga ne želite deliti, in potisnete samo tematske veje, na katerih želite sodelovati.
Če imate vejo imenovano serverfix
, na kateri želite delati z drugimi, jo lahko potisnete na enak način, kakor ste potisnili svojo prvo vejo.
Poženite git push <remote> <branch>
:
$ git push origin serverfix
Counting objects: 24, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (15/15), done.
Writing objects: 100% (24/24), 1.91 KiB | 0 bytes/s, done.
Total 24 (delta 2), reused 0 (delta 0)
To https://github.com/schacon/simplegit
* [new branch] serverfix -> serverfix
To je nekakšna bližnjica.
Git avtomatično razširi ime veje serverfix
v refs/heads/serverfix:refs/heads/serverfix
, kar pomeni, »Vzemi mojo lokalno vejo serverfix
in jo potisni, da se posodobi oddaljena veja serverfix
«.
Podrobneje bomo šli skozi del refs/heads/
v poglavju Notranjost Gita, vendar v splošnem lahko to izpustite.
Lahko naredite tudi git push origin serverfix:serverfix
, kar naredi isto stvar — pravi »Vzemi mojo vejo serverfix
in jo naredi oddaljeno vejo serverfix
«.
To obliko lahko uporabite za potiskanje lokalne veje na oddaljeno vejo, ki je poimenovana drugače.
Če ne želite, da se na daljavi imenuje serverfix
, lahko namesto tega poženete git push origin serverfix:awesomebranch
, da potisnete vašo lokalno vejo serverfix
na vejo awesomebranch
na oddaljenem projektu.
Opomba
|
Ne vpisujte vsakič svojega gesla
Če za potiskanje uporabljate HTTPS URL, vas bo strežnik Git vprašal za uporabniško ime in geslo za overjanje. Privzeto vas bo vprašal za te informacije v terminalu, tako da strežnik lahko ve, ali vam je potiskanje dovoljeno. Če ne želite vsakič vpisovati, ko potiskate, lahko nastavite »predpomnilnik poverilnic« (angl. credential cache).
Najenostavnejše ga je samo obdržati v spominu za nekaj minut, kar lahko enostavno nastavite s pogonom Za več informacij o različnih možnostih predpomnjenja poverilnic, ki so na voljo, glejte razdelek Shramba poverilnic. |
Naslednjič, ko eden izmed vaših sodelavcev prenese iz strežnika, bo dobil referenco, kjer je strežniška različica serverfix
pod oddaljeno vejo origin/serverfix
:
$ git fetch origin
remote: Counting objects: 7, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 3 (delta 0)
Unpacking objects: 100% (3/3), done.
From https://github.com/schacon/simplegit
* [new branch] serverfix -> origin/serverfix
Pomembno je opomniti, da ko naredite prenos, ki prinese novo vejo, ki sledi daljavi, vam ni treba avtomatično imeti njihovih lokalnih, urejevalnih kopij.
Z drugimi besedami v tem primeru, nimate nove veje serverfix
— imate samo kazalec origin/serverfix
, ki ga ne morete spremeniti.
Da združite to delo v svojo trenutno delovno vejo, lahko poženete git merge origin/serverfix
.
Če želite vašo lastno vejo serverfix
, na kateri lahko delate, jo lahko osnujete na svoji veji, ki sledi daljavi:
$ git checkout -b serverfix origin/serverfix
Branch serverfix set up to track remote branch serverfix from origin.
Switched to a new branch 'serverfix'
To vam da lokalno vejo, na kateri lahko delate, in se začne, kjer je origin/serverfix
.
Sledenje vej
Izvlečenje lokalne veje iz veje, ki sledi daljavi, avtomatično ustvari t. i. »sledeno vejo« (angl.tracking branch) in veja, ki ji sledi, se imenuje zgornja veja oz. veja povratnega toka (angl. upstream branch).
Sledene veje so lokalne veje, ki imajo neposreden odnos z oddaljeno vejo.
Če ste na sledeni veji in vpišete git pull
, Git avtomatsko ve, iz katerega strežnika prenesti in katero vejo združiti.
Ko klonirate repozitorij, v splošnem avtomatično ustvari vejo master
, ki sledi origin/master
.
Vendar nastavite lahko tudi druge sledene veje, če želite — take, ki sledijo vejam na drugih daljavah ali ne sledijo veji master
.
Enostaven primer je, kar ste ravnokar videli, da poženete git checkout -b <branch> <remote>/<branch>
.
To je dovolj pogosta operacija, zato ima Git na voljo bližnjico --track
:
$ git checkout --track origin/serverfix
Branch serverfix set up to track remote branch serverfix from origin.
Switched to a new branch 'serverfix'
V bistvu je to tako pogosto, da je na voljo celo bližnjica za to bližnjico. Če ime veje, ki jo želite izvleči, (a) ne obstaja in (b) se točno prilega imenu na samo eni izmed daljav, bo Git ustvaril sledeno vejo namesto vas:
$ git checkout serverfix
Branch serverfix set up to track remote branch serverfix from origin.
Switched to a new branch 'serverfix'
Da nastavite lokalno vejo z različnim imenom, kot je oddaljena veja, lahko enostavno uporabite prvo različico z različnim imenom lokalne veje:
$ git checkout -b sf origin/serverfix
Branch sf set up to track remote branch serverfix from origin.
Switched to a new branch 'sf'
Sedaj bo vaša lokalna veja sf
avtomatično vlekla iz origin/serverfix
.
Če že imate lokalno vejo in jo želite nastaviti na oddaljeno vejo, ki ste jo ravnokar povlekli, ali pa želite spremeniti vejo povratnega toka, ki ga sledite, lahko pri ukazu git branch
uporabite možnost -u
ali --set-upstream-to
, da jo izrecno nastavite kadarkoli.
$ git branch -u origin/serverfix
Branch serverfix set up to track remote branch serverfix from origin.
Opomba
|
Bližnjica povratnega toka
Ko imate sledeno vejo nastavljeno, lahko naredite referenco na vejo povratnega toka z bližnjico |
Če želite videti, katero sledeno vejo imate nastavljeno, lahko uporabite možnost -vv
ukaza git branch
.
To bo izpisalo vaše lokalne veje z več informacijami vključno, čemu vsaka veja sledi in če je vaša lokalna veja spredaj, zadaj, ali oboje.
$ git branch -vv
iss53 7e424c3 [origin/iss53: ahead 2] Add forgotten brackets
master 1ae2a45 [origin/master] Deploy index fix
* serverfix f8674d9 [teamone/server-fix-good: ahead 3, behind 1] This should do it
testing 5ea463a Try something new
Torej tu lahko vidite, da naša veja iss53
sledi origin/iss533
in je »spredaj« (angl. ahead) za dva, kar pomeni, da imamo lokalno dve potrditvi, ki nista potisnjeni na strežnik.
Lahko vidimo tudi, da naša veja master
sledi origin/master
in je posodobljena.
Naslednje lahko vidimo, da naša veja serverfix
sledi veji server-fix-good
na našem strežniku teamone
in je spredaj za tri in zadaj za eno, kar pomeni, da je na strežniku ena potrditev, ki je še nismo združili in lokalno tri potrditve, ki jih še nismo potisnili.
Na koncu lahko vidimo, da naša veja testing
ne sledi katerikoli oddaljeni veji.
Pomembno je opomniti, da so te številke samo od zadnjič, ko ste prenesli iz vsakega strežnika. Ta ukaz ne seže po strežnikih, pove vam o tem, kaj je lokalno shranil v predpomnilnik iz teh strežnikov. Če želite popolno posodobitev številk spredaj ali zadaj, boste morali prenesti iz vseh svojih daljav, ravno preden to poženete. To lahko naredite takole:
$ git fetch --all; git branch -vv
Vlečenje
Medtem ko bo ukaz git fetch
na strežnik prenesel vse spremembe, ki jih še nimate, ne bo nikakor spremenil vašega delovnega direktorija.
Enostavno vam bo pridobil podatke in vam omogočil, da jih združite sami.
Vendar pa obstaja ukaz imenovan git pull
, ki je v bistvu git fetch
, ki mu takoj sledi git merge
v večini primerov.
Če imate nastavljeno sledeno vejo, kot je demonstrirano v zadnjem razdelku, bodisi izrecno nastavljeno, ali pa da vam jo je ustvarilo z ukazoma clone
ali checkout
, bo git pull
poiskal, kateremu strežniku in veji trenutna veja sledi, prenesel iz tistega strežnika in nato to oddaljeno vejo poskusil združiti.
V splošnem je bolje, da enostavno uporabite ukaza fetch
in merge
izrecno, saj je čarobnost git pull
pogostokrat zmedena.
Brisanje oddaljenih vej
Predpostavimo, da ste končali z oddaljeno vejo — recimo, da ste vi in vaši sodelavci končali z lastnostjo in jo imate združeno v vašo oddaljeno vejo master
(ali katerokoli vejo, na kateri je vaša stabilna linija kode).
Oddaljeno vejo lahko izbrišete z uporabo možnosti --delete
pri git push
.
Če želite izbrisati vašo vejo serverfix
iz strežnika, poženite naslednje:
$ git push origin --delete serverfix
To https://github.com/schacon/simplegit
- [deleted] serverfix
V osnovi vse kar to naredi, je, da odstrani kazalec iz strežnika. Strežnik Git bo v splošnem obdržal podatke tam za nekaj časa, dokler se ne požene sproščanje pomnilnika (angl. garbage collection), torej če je bila po nesreči izbrisana, je povrnitev pogostokrat enostavna.