-
1. Pričetek
- 1.1 O nadzoru različic
- 1.2 Kratka zgodovina Gita
- 1.3 Kaj je Git?
- 1.4 Ukazna vrstica
- 1.5 Git namestitev
- 1.6 Prva namestitev 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 Git aliasi
- 2.8 Povzetek
-
3. Veje Git
- 3.1 Veje na kratko
- 3.2 Osnove vej in združevanja
- 3.3 Upravljanje vej
- 3.4 Potek dela z vejami
- 3.5 Oddaljene veje
- 3.6 Ponovno baziranje (rebasing)
- 3.7 Povzetek
-
4. Git na strežniku
- 4.1 Protokoli
- 4.2 Pridobiti Git na strežnik
- 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 Tretje osebne opcije gostovanja
- 4.10 Povzetek
-
5. Distribuirani Git
- 5.1 Razdeljeni poteki dela
- 5.2 Prispevanje projektu
- 5.3 Vzdrževanje projekta
- 5.4 Povzetek
-
6. GitHub
-
7. Orodja Git
- 7.1 Revision Selection
- 7.2 Interactive Staging
- 7.3 Stashing and Cleaning
- 7.4 Signing Your Work
- 7.5 Searching
- 7.6 Rewriting History
- 7.7 Reset Demystified
- 7.8 Advanced Merging
- 7.9 Rerere
- 7.10 Debugging with Git
- 7.11 Submodules
- 7.12 Bundling
- 7.13 Replace
- 7.14 Credential Storage
- 7.15 Povzetek
-
8. Prilagoditev Gita
- 8.1 Git Configuration
- 8.2 Git Attributes
- 8.3 Kljuke Git
- 8.4 An Example Git-Enforced Policy
- 8.5 Povzetek
-
9. Git in ostali sistemi
- 9.1 Git kot klient
- 9.2 Migracija na Git
- 9.3 Povzetek
-
10. Notranjost Gita
- 10.1 Napeljava in keramika
- 10.2 Git Objects
- 10.3 Git References
- 10.4 Packfiles
- 10.5 Refspec
- 10.6 Transfer Protocols
- 10.7 Maintenance and Data Recovery
- 10.8 Environment Variables
- 10.9 Povzetek
-
A1. Dodatek A: Git v drugih okoljih
- A1.1 Grafični vmesniki
- A1.2 Git v programu 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 vododovodne sisteme
10.5 Notranjost Gita - Refspec
Refspec
Skozi to knjigo smo uporabljali enostavne preslikave iz oddaljenih vej na lokalne reference, vendar lahko so bolj kompleksne. Predpostavimo, da ste sledili zadnjim nekaj sekcij in ste ustvarili majhen lokalen repozitorij Git ter mu sedaj želite dodati daljavo:
$ git remote add origin https://github.com/schacon/simplegit-progit
Pogon zgornjega ukaza doda sekcijo v datoteko .git/config
vašega repozitorija, kar določa ime daljave (origin
), URL oddaljenega repozitorija in refspec za ujemanje:
[remote "origin"]
url = https://github.com/schacon/simplegit-progit
fetch = +refs/heads/*:refs/remotes/origin/*
Oblika refspec je opcijski +
, ki mu sledi <src>:<dst>
, kjer je <src>
vzorec za reference na oddaljeni strani in <dst>
je lokacija, kamor bodo te reference zapisane lokalno.
+
pove Git-u, da posodobi referenco tudi če ni t.i. fast-forward.
V privzetem primeru, je to avtomatsko prepisano z ukazom git remote add
, Git ujame vse reference pod refs/heads/
na strežniku in jih zapiše v regs/remotes/origins/
lokalno.
Torej, če je na strežniku veja master
, lahko dostopate do dnevnika te veje lokalno preko
$ git log origin/master
$ git log remotes/origin/master
$ git log refs/remotes/origin/master
Vsi ukazi so ekvivalentni, ker Git vsakega razširi v refs/remotes/origins/master
.
Če želite, da Git namesto tega vsakič potegne samo vejo master
in ne vseh ostalih vej na oddaljenem strežniku, lahko spremenite vrstico ujetja na
fetch = +refs/heads/master:refs/remotes/origin/master
To je samo privzeti refspec za git fetch
za to daljavo.
Če želite narediti nekaj enkrat, lahko določite refspec tudi v ukazni vrstici.
Da potegnete vejo master
na daljavi dol v origin/mymaster
lokalno, lahko poženete
$ git fetch origin master:refs/remotes/origin/mymaster
Lahko določite tudi več refspec-ov. V ukazni vrstici lahko potegnete dol več vej sledeče:
$ git fetch origin master:refs/remotes/origin/mymaster \
topic:refs/remotes/origin/topic
From git@github.com:schacon/simplegit
! [rejected] master -> origin/mymaster (non fast forward)
* [new branch] topic -> origin/topic
V tem primeru je bil poteg veje master zavrnjen, ker ni bil referenca fast-forward.
To lahko prepišete z določanjem +
na začetku refspec.
V vaši nastavitveni datoteki lahko določite tudi več refspec za ujetje. Če želite vedno ujeti veje master in experiment, dodajte dve vrstici:
[remote "origin"]
url = https://github.com/schacon/simplegit-progit
fetch = +refs/heads/master:refs/remotes/origin/master
fetch = +refs/heads/experiment:refs/remotes/origin/experiment
Ne morete uporabiti več globov v vzorcu, torej to bi bilo neveljavno:
fetch = +refs/heads/qa*:refs/remotes/origin/qa*
Vendar lahko uporabite imenski prostor (ali direktorije) za dosego nečesa takega. Če imate ekipo QA, ki potiska serijo vej in želite dobiti vejo master in katerokoli vejo od ekipe QA vendar ničesar več, lahko uporabite sledečo sekcijo nastavitev:
[remote "origin"]
url = https://github.com/schacon/simplegit-progit
fetch = +refs/heads/master:refs/remotes/origin/master
fetch = +refs/heads/qa/*:refs/remotes/origin/qa/*
Če imate kompleksen potek dela, ki ima potiskalne veje ekipe QA , potiskalne veje razvijalcev in ekipe integracije in sodelujete na oddaljenih vejah, lahko naredite imenski prostor enostavno na ta način.
Refspec-i za potiskanje
Lepo je, če lahko ujamete reference imenskega prostora na ta način, vendar kako ekipa QA dobi svoje veje v imenski prostor qa/
na prvem mestu?
To lahko dosežete z uporabo refspec-ov za potiskanje.
Če ekipa QA želi potisniti svojo vejo master
v qa/master
na oddaljenem strežniku, lahko poženejo
$ git push origin master:refs/heads/qa/master
Če želijo, da Git to naredi avtomatsko vsakič, ko poženejo git push origin
, lahko dodajo vrednost push
v svojo nastavitveno datoteko:
[remote "origin"]
url = https://github.com/schacon/simplegit-progit
fetch = +refs/heads/*:refs/remotes/origin/*
push = refs/heads/master:refs/heads/qa/master
Ponovno, bo to povzročilo, da git push origin
potisne lokalno vejo master
na daljavo qa/master
vejo privzeto.
Brisanje referenc
Lahko uporabite tudi refspec za izbris referenc iz oddaljenega strežnika s pogonom nečesa takega:
$ git push origin :topic
Ker je refspec <src>:<dst>
, z opuščanjem <src>
dela, to v osnovi pravi, da naredite tematsko vejo na nobeni daljavi, kar jo izbriše.