-
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
3.2 Veje Git - Osnove vej in združevanja
Osnove vej in združevanja
Pojdimo skozi enostaven primer vej in združevanja s potekom dela, ki ga morda uporabljate v realnem svetu. Sledili boste tem korakom:
-
Naredite delo na spletni strani.
-
Ustvarite vejo za novo zgodbo na kateri delate.
-
Naredite nekaj dela na tej veji.
V tej fazi boste prejeli klic, da je druga težava kritična in potrebujete sprotni popravek. Naredili boste sledeče:
-
Preklopili na vašo produkcijsko vejo.
-
Ustvarili vejo, da dodate sprotni popravek.
-
Ko je testiran, združite vejo sprotnega popravka in potisnete v produkcijo.
-
Preklopite nazaj na vašo prvotno zgodbo in nadaljujete delo.
Osnove vej
Najprej recimo, da delate na vašem projektu in imate že nekaj pošiljanj.

Odločili ste se, da boste delali na težavi #53 v kateremkoli težavam-sledilnem sistemu, ki ga vaše podjetje uporablja.
Da ustvarite vejo in nanjo preklopite istočasno, lahko poženete ukaz git checkout
s stikalom -b
:
$ git checkout -b iss53
Switched to a new branch "iss53"
To je bližnjica za:
$ git branch iss53
$ git checkout iss53

Delate na vaši spletni strani in naredite nekaj pošiljanj.
Da to naredite premakne vejo iss53
naprej, ker ste jo izpisali (to pomeni, vaš HEAD
kaže nanjo):
$ vim index.html
$ git commit -a -m 'added a new footer [issue 53]'

Sedaj dobite klic, da je težava s spletno stranjo in jo potrebujete takoj popraviti.
Z Git-om vam ni treba nalagati vašega popravka skupaj s spremembami iss53
, ki ste jih naredili in ni vam treba vložiti veliko napora v povračanje teh sprememb preden lahko delate na uporabi vašega popravka na to, kar je v produkciji.
Vse kar morate narediti je preklopiti nazaj na vašo vejo master
.
Vendar preden to naredite, pomnite, da če ima vaš delovni direktorij ali vmesna faza neposlane spremembe, ki so v konfliktu z vejo, ki jo izpisujete, vam Git ne bo dovolil preklopiti vej. Najbolje je imeti čisto delovno stanje, ko preklapljate veje. Obstajajo načini, da se temu izognete (v glavnem, skrivanje in pošiljanje sprememb), kar bomo pokrili kasneje v [r_git_stashing]. Za sedaj predpostavimo, da ste poslali vse vaše spremembe, tako da lahko preklopite nazaj na vašo vejo master:
$ git checkout master
Switched to branch 'master'
Na tej točki vaš delovni direktorij projekta je točno tak, kakor je bil preden, ste pričeli delati na težavi #53 in sedaj se lahko skoncentrirate na vaš sprotni popravek. To je pomembna točka za zapomniti: ko preklapljate veje, Git ponastavi vaš delovni direktorij, da izgleda kot je, ko ste zadnjič poslali na to vejo. Doda, odstrani in spremeni datoteke avtomatično, da zagotovi, da je vaša delovna kopija taka, kot je izgledala veja na vašem zadnjem pošiljanju vanjo.
Naslednje imate za narediti sprotni popravek. Ustvarimo vejo sprotnega popravka na kateri delate dokler ni končan:
$ git checkout -b hotfix
Switched to a new branch 'hotfix'
$ vim index.html
$ git commit -a -m 'fixed the broken email address'
[hotfix 1fb7853] fixed the broken email address
1 file changed, 2 insertions(+)

master
Lahko poženete vaše teste, zagotovite, da je sprotni popravek, kar želite in ga združite nazaj v vašo vejo master, da naložite v produkcijo.
To naredite z ukazom git merge
:
$ git checkout master
$ git merge hotfix
Updating f42c576..3a0874c
Fast-forward
index.html | 2 ++
1 file changed, 2 insertions(+)
Opazili bste frazo fast-forward'' v tem združevanju.
Ker je bilo pošiljanje, kamor kaže veja, ki ste jo združili, direktno gorvodno pošiljanja na katerem ste, Git enostavno premakne kazalec naprej.
Da dodamo frazo na drug način, kot poskušate združiti eno pošiljanje z drugim, se to lahko doseže s sledenjem zgodovine prvega pošiljanja, Git poenostavi stvari, tako da prestavi kazalec naprej, ker ni divergentnega dela za združiti skupaj - to se imenuje
fast-forward''.
Vaša sprememba je sedaj posnetek pošiljanja, ki kaže na vejo master
in lahko naložite popravek.

master
is fast-forwarded to hotfix
Ko je vaš super pomemben pomemben popravek naložen, ste pripravljeni preklopiti nazaj k delu, ki ste ga delali preden ste bili zmoteni.
Vendar najprej boste izbrisali vejo hotfix
, ker je ne potrebujete več - veja master
kaže na enako lokacijo.
Lahko jo izbrišete z opcijo -d
ukazu git branch
:
$ git branch -d hotfix
Deleted branch hotfix (3a0874c).
Sedaj lahko vaše delo preklopite nazaj na vašo vejo dela v teku na težavi #53 in nadaljujete delo na njej
$ git checkout iss53
Switched to branch "iss53"
$ vim index.html
$ git commit -a -m 'finished the new footer [issue 53]'
[iss53 ad82d7a] finished the new footer [issue 53]
1 file changed, 1 insertion(+)

iss53
Tu je vredno omeniti, da delo, ki ste ga naredili na vaši veji hotfix
ni vsebovano na datotekah v vaši veji iss53
.
Če jo potrebujete potegniti notri, lahko združite vašo vejo master
v vašo vejo iss53
s pogonom git merge master
ali pa lahko počakate integracijo teh sprememb, dokler se ne odločite potegniti veje iss53
nazaj v master
kasneje.
Basic Merging
Predpostavimo, da ste se odločili, da je vaša težava #53 končana in pripravljena, da je združena v vašo vejo master
Da to naredite boste združili vašo vejo iss53
v master
, tako kot ste prej združili vašo vejo hotfix
.
Vse kar morate narediti je izpisati vejo, ki jo želite združiti in nato pognati ukaz git merge
:
$ git checkout master
Switched to branch 'master'
$ git merge iss53
Merge made by the 'recursive' strategy.
index.html | 1 +
1 file changed, 1 insertion(+)
To izgleda nekoliko različno kot združitev hotfix
, kar ste prej naredili.
V tem primeru se je vaša zgodovina razvoja oddaljila od neke starejše točke.
Ker pošiljanje na veji, na kateri se nahajate, ni direktni prednik veje, ki jo združujete, mora Git narediti nekaj dela.
V tem primeru Git naredi enostavno tri-načinsko združitev z uporabo dveh posnetkov, ki kažeta na vejo tips in pogostega prednika od dveh.

Namesto samo premikanja kazalca veje naprej, Git ustvari nov posnetek, ki rezultira iz te tri-načinske združitve in avtomatično ustvari novo pošiljanje, ki kaže nanjo. Na to se sklicuje kot pošiljanje združitve in je posebno v tem, da ima več kot samo enega starša.

Vredno je pokazati, da Git določa najboljšega pogostega prednika za uporabo za svojo bazo združitev; to je različno od stareših orodij kot je CVS ali Subversion (pred verzijo 1.5), kjer je razvijalec, ki je delal združitev, moral ugotoviti najboljšo osnovo združitve sam. To naredi združevanje veliko bolj enostavno v Git-u kot v teh starejših sistemih.
Sedaj, ko je vaše delo združeno, nimate več potrebe po veji iss53
.
Problem lahko zaprete v vašem sistemu sledenja problemov in izbrišete vejo:
$ git branch -d iss53
Basic Merge Conflicts
Včasih ta proces ne gre gladko.
Če ste spremenili isti del neke datoteke različno v dveh vejah, ki jih združujete skupaj, jih Git ne bo mogel združiti čisto.
Če je vaš popravek za težavo #53 spremenil isti del datoteke kot hotfix
, boste dobili konflikt združevanja, ki izgleda nekako takole:
$ git merge iss53
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.
Ti ni avtomatično ustvaril pošiljanja združevanja.
Ustavil je proces, dokler ne rešite konflikta.
Če želite videti, katere datoteke niso združene na katerikoli točki po konfliktu združevanja, lahko poženete git status
:
$ git status
On branch master
You have unmerged paths.
(fix conflicts and run "git commit")
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: index.html
no changes added to commit (use "git add" and/or "git commit -a")
Karkoli, kar ima konflikte združevanja in ni bilo rešeno je izpisano kot nezdruženo. Git doda standardne označevalce konflikta ločljivosti k datotekam, ki imajo konflikte, tako da jih lahko odprete ročno in rešite te konflikte. Vaša datoteka vsebuje sekcijo, ki izgleda nekako takole:
<<<<<<< HEAD:index.html
<div id="footer">contact : email.support@github.com</div>
=======
<div id="footer">
please contact us at support@github.com
</div>
>>>>>>> iss53:index.html
To pomeni, da verzija v HEAD
(vaše veje master
, ker to je bilo, kar ste imeli izpisano, ko ste pognali vaš ukaz združevanja) je vrhnji del tega bloka (vse nad =======
), medtem ko verzija v vaši veji iss53
izgleda kot vse v spodnjem delu.
Da rešite konflikt, morate ali izbrati eno stran ali drugo ali združiti vsebino sami.
Na primer ta konflikt lahko rešite z zamenjavo celotnega bloka s tem:
<div id="footer">
please contact us at email.support@github.com
</div>
Ta ločljivost ima malo vsake sekcije in <<<<<<<
, =======
, and >>>>>>>
vrstice so bile v celoti odstranjene.
Ko ste rešili vsakega od teh sekcij v vsaki konfliktni datoteki, poženite git add
na vsaki datoteki, da jo označite kot rešeno.
Dajanje datoteke v vmesno fazo jo označi kot rešeno v Git-u.
Če želite uporabiti grafično orodje, da rešite te težave, lahko poženete git mergetool
, ki zažene ustrezno vizualno združevalno orodje in vas sprehodi skozi konflikte:
$ git mergetool
This message is displayed because 'merge.tool' is not configured.
See 'git mergetool --tool-help' or 'git help config' for more details.
'git mergetool' will now attempt to use one of the following tools:
opendiff kdiff3 tkdiff xxdiff meld tortoisemerge gvimdiff diffuse diffmerge ecmerge p4merge araxis bc3 codecompare vimdiff emerge
Merging:
index.html
Normal merge conflict for 'index.html':
{local}: modified file
{remote}: modified file
Hit return to start merge resolution tool (opendiff):
Če želite uporabiti drugo orodje združevanja namesto privzetega (Git izbere opendiff
v tem primeru, ker je bil ukaz pognan na Mac-u), vidite lahko vsa podprta orodja izpisana na vrhu za ``one of the following tools.''
Samo vpišite ime orodja, ki bi ga raje uporabljali.
Opomba
|
Če potrebujete bolj napredna orodja za reševanje prepredenih konfliktov združevanja, bomo pokrili več o združevanju v [r_advanced_merging]. |
Ko zapustite orodje združevanja, vas Git vpraša, če je bila združitev uspešna.
Če poveste skripti, da je bila, da datoteko v vmesno fazo, da jo označi kot rešeno za vas.
Ponovno lahko poženete git status
, da potrdite, da so bili vsi konflikti rešeni:
$ git status
On branch master
All conflicts fixed but you are still merging.
(use "git commit" to conclude merge)
Changes to be committed:
modified: index.html
Če ste s tem zadovoljni in potrdite, da je vse, kar je imelo s konflikti bilo dano v vmesno fazo, lahko vpišete git commit
, da končate pošiljanje združevanja.
Sporočilo pošiljanja privzeto izgleda nekako takole:
Merge branch 'iss53'
Conflicts:
index.html
#
# It looks like you may be committing a merge.
# If this is not correct, please remove the file
# .git/MERGE_HEAD
# and try again.
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
# All conflicts fixed but you are still merging.
#
# Changes to be committed:
# modified: index.html
#
To sporočilo lahko spremenite s podrobnostmi o tem, kako ste rešili združevanje, če razmišljate, da bi bilo v pomoč ostalim, da pogledajo to združevanje v prihodnosti - zakaj ste to naredili, če ni očitno.