-
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
10.8 Notranjost Gita - Spremenljivke okolja
Spremenljivke okolja
Git vedno deluje znotraj lupine bash
in uporablja več lupinskih okoljskih spremenljivk, da določi, kako se obnaša.
Občasno je koristno vedeti, kaj so te spremenljivke in kako jih lahko uporabimo, da Git deluje tako, kot želimo.
To ni izčrpen seznam vseh okoljskih spremenljivk, na katere Git obrača pozornost, vendar bomo obravnavali najbolj uporabne.
Globalno obnašanje
Nekatere splošne lastnosti Gitovega obnašanja kot računalniškega programa so odvisne od okoljskih spremenljivk.
GIT_EXEC_PATH
določa, kje Git išče svoje podprograme (kot so git-commit
, git-diff
in drugi).
Trenutne nastavitve lahko preverite z zagonom git --exec-path
.
HOME
se običajno ne šteje za prilagodljivega (preveč drugih stvari je odvisnih od njega), vendar je to mesto, kjer Git išče globalno konfiguracijsko datoteko.
Če želite resnično prenosno namestitev Git, skupaj z globalno konfiguracijo, lahko v profilu lupine prenosnega Gita preglasite HOME
.
PREFIX
je podoben, vendar namenjen konfiguraciji v celotnem sistemu.
Git išče to datoteko na $PREFIX/etc/gitconfig
.
GIT_CONFIG_NOSYSTEM
, če je nastavljen, onemogoči uporabo konfiguracijske datoteke v celotnem sistemu.
To je uporabno, če vaša sistemska konfiguracija moti vaše ukaze, vendar nimate dostopa do njene spremembe ali odstranitve.
GIT_PAGER
nadzoruje program, ki se uporablja za prikaz večstranskega izhoda v ukazni vrstici.
Če tega ni, se bo PAGER
uporabljal kot nadomestitev.
GIT_EDITOR
je urejevalnik, ki ga bo Git zagnal, ko bo uporabnik moral urejati nekaj besedila (na primer sporočilo potrditve).
Če ni nastavljen, bo uporabljen EDITOR
.
Lokacije repozitorijev
Git uporablja več okoljskih spremenljivk za določanje vmesnika s trenutnim repozitorijem.
GIT_DIR
je mesto direktorija .git
.
Če ta ni določen, Git hodi po drevesu direktorija navzgor, dokler ne pride do ~
ali /
in pri vsakem koraku išče direktorij .git
.
GIT_CEILING_DIRECTORIES
nadzoruje obnašanje iskanja direktorija .git
.
Če dostopate do direktorijev, ki se počasi nalagajo (na primer tisti na pogonu traku ali preko počasnega omrežnega priključka), želite, da se Git preneha truditi prej, kot bi sicer, še posebej, če je Git sprožen pri izgradnji vaše lupine.
GIT_WORK_TREE
je mesto korenskega direktorija delovnega direktorija za ne-goli repozitorij.
Če je določen --git-dir
ali GIT_DIR
, vendar ni določena nobena od --work-tree
, GIT_WORK_TREE
ali core.worktree
, se trenutni delovni direktorij obravnava kot vrh vašega delovnega drevesa.
GIT_INDEX_FILE
je pot do datoteke indeksa (samo za ne-gole repozitorije).
GIT_OBJECT_DIRECTORY
se lahko uporabi za določitev mesta direktorija, ki običajno prebiva v .git/objects
.
GIT_ALTERNATE_OBJECT_DIRECTORIES
je seznam ločen z dvopičjem (oblikovan kot /dir/one:/dir/two:…
), ki pove Gitu, kje preveriti objekte, če jih ni v GIT_OBJECT_DIRECTORY
.
Če imate veliko projektov z velikimi datotekami, ki imajo natančno enako vsebino, lahko to uporabite za izogibanje shranjevanju preveč kopij.
Pathspec-i
»Pathspec« se nanaša na način, kako v Gitu določate poti do stvari, vključno z uporabo nadomestnih znakov.
Ti se uporabljajo v datoteki .gitignore
pa tudi v ukazni vrstici (git add *.c
).
GIT_GLOB_PATHSPECS
in GIT_NOGLOB_PATHSPECS
nadzirata privzeto obnašanje posebnih znakov v pathspec-ih.
Če je GIT_GLOB_PATHSPECS
nastavljen na 1, nadomestni znaki delujejo kot maskirni znaki (kar je privzeto); če je GIT_NOGLOB_PATHSPECS
nastavljen na 1, nadomestni znaki ustrezajo le sami sebi, kar pomeni, da bi se nekaj, kot je *.c
, ujelo le z datoteko poimenovano »\*.c«, ne pa z vsako datoteko, katere ime se konča s .c
.
To lahko v posameznih primerih preglasite tako, da začnete pathspec z :(glob)
ali :(literal)
, kot je na primer :(glob)\*.c
.
GIT_LITERAL_PATHSPECS
onemogoči obe zgoraj opisani obnašanji; nadomestni znaki ne bodo delovali in preglasitvene predpone bodo tudi onemogočene.
GIT_ICASE_PATHSPECS
nastavi vse pathspec-e, da delujejo v načinu brez razlikovanja velikosti črk.
Potrjevanje
Končno ustvarjanje objekta potrditve Git je običajno opravljena z git-commit-tree
, ki uporablja te okoljske spremenljivke kot svoj primarni vir informacij in se zanaša na vrednosti konfiguracije le, če teh spremenljivk ni prisotnih.
GIT_AUTHOR_NAME
je čitljivo ime v polju »avtor«.
GIT_AUTHOR_EMAIL
je e-poštni naslov za polje »avtor«.
GIT_AUTHOR_DATE
je časovni žig, uporabljen za polje »avtor«.
GIT_COMMITTER_NAME
nastavi ime za polje »potrjevalec«.
GIT_COMMITTER_EMAIL
je e-poštni naslov za polje »potrjevalec«.
GIT_COMMITTER_DATE
se uporablja za časovni žig v polju »potrjevalec«.
EMAIL
je nadomestni e-poštni naslov, če konfiguracijska vrednost user.email
ni nastavljena.
Če ta ni nastavljena, se Git zanaša na sistemsko uporabniško ime in imena gostiteljev sistema.
Omrežje
Git uporablja knjižnico curl
za mrežne operacije prek HTTP-ja, zato GIT_CURL_VERBOSE
Gitu sporoča, da izpiše vsa sporočila, ki jih ustvari ta knjižnica.
To je podobno, kot če bi v ukazni vrstici uporabili curl -v
.
GIT_SSL_NO_VERIFY
Gitu sporoči, naj ne preverja certifikatov SSL.
To je včasih potrebno, če uporabljate samo-podpisani certifikat za streženje repozitorijev Git prek HTTPS-ja, ali pa če postavljate strežnik Git in še niste namestili celotnega certifikata.
Če je hitrost prenosa podatkov operacije HTTP nižja od GIT_HTTP_LOW_SPEED_LIMIT
bajtov na sekundo več kot GIT_HTTP_LOW_SPEED_TIME
sekund, bo Git prekinil to operacijo.
Te vrednosti preglasijo konfiguracijski vrednosti http.lowSpeedLimit
in http.lowSpeedTime
.
GIT_HTTP_USER_AGENT
nastavi niz uporabniškega agenta, ki ga Git uporablja za komunikacijo prek HTTP-ja.
Privzeta vrednost je vrednost, kot je git/2.0.0
.
Prikazovanje razlik in združevanje
GIT_DIFF_OPTS
je nekoliko napačno poimenovan.
Edine veljavne vrednosti so -u<n>
ali --unified=<n>
, kar nadzira število vrstic konteksta, ki jih prikaže ukaz git diff
.
GIT_EXTERNAL_DIFF
se uporablja kot preglasitev konfiguracijske vrednosti diff.external
.
Če je nastavljena, bo Git ta program sprožil ob klicu ukaza git diff
.
GIT_DIFF_PATH_COUNTER
in GIT_DIFF_PATH_TOTAL
sta uporabni znotraj programa, določenega z GIT_EXTERNAL_DIFF
ali diff.external
.
Prva predstavlja, katera datoteka v seriji je v procesu primerjave razlik (začenši z 1), druga pa je skupno število datotek v paketu.
GIT_MERGE_VERBOSITY
nadzira izhodno vrednost za rekurzivno strategijo združevanja.
Dovoljene vrednosti so:
-
0 ne izpiše ničesar, razen morda enega samega sporočila o napaki.
-
1 prikaže samo konflikte.
-
2 prikaže tudi spremembe v datotekah.
-
3 prikaže, ko so datoteke izpuščene, ker se niso spremenile.
-
4 prikazuje vse poti, kot se obdelujejo.
-
5 in več prikazuje podrobne informacije za odpravljanje težav.
Privzeta vrednost je 2.
Razhroščevanje
Želite resnično vedeti, kaj počne Git? Git ima vgrajen skoraj popoln nabor sledi in vse, kar morate storiti, je, da jih vklopite. Možne vrednosti teh spremenljivk so naslednje:
-
true
,1
, ali2
— sled kategorije se izpiše v stderr. -
Absolutna pot, ki se začne s
/
— sled se izpiše v datoteko na tej poti.
GIT_TRACE
nadzoruje splošne sledi, ki se ne ujemajo s katero koli posebno kategorijo.
To vključuje razširitev aliasov in delegacijo drugim podprogramom.
$ GIT_TRACE=true git lga
20:12:49.877982 git.c:554 trace: exec: 'git-lga'
20:12:49.878369 run-command.c:341 trace: run_command: 'git-lga'
20:12:49.879529 git.c:282 trace: alias expansion: lga => 'log' '--graph' '--pretty=oneline' '--abbrev-commit' '--decorate' '--all'
20:12:49.879885 git.c:349 trace: built-in: git 'log' '--graph' '--pretty=oneline' '--abbrev-commit' '--decorate' '--all'
20:12:49.899217 run-command.c:341 trace: run_command: 'less'
20:12:49.899675 run-command.c:192 trace: exec: 'less'
GIT_TRACE_PACK_ACCESS
nadzoruje sledenje dostopu do paketnih datotek.
Prvo polje predstavlja paketno datoteko, do katere se dostopa, drugo polje pa je odmik znotraj te datoteke:
$ GIT_TRACE_PACK_ACCESS=true git status
20:10:12.081397 sha1_file.c:2088 .git/objects/pack/pack-c3fa...291e.pack 12
20:10:12.081886 sha1_file.c:2088 .git/objects/pack/pack-c3fa...291e.pack 34662
20:10:12.082115 sha1_file.c:2088 .git/objects/pack/pack-c3fa...291e.pack 35175
# […]
20:10:12.087398 sha1_file.c:2088 .git/objects/pack/pack-e80e...e3d2.pack 56914983
20:10:12.087419 sha1_file.c:2088 .git/objects/pack/pack-e80e...e3d2.pack 14303666
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean
GIT_TRACE_PACKET
omogoča sledenje na ravni paketov za omrežne operacije.
$ GIT_TRACE_PACKET=true git ls-remote origin
20:15:14.867043 pkt-line.c:46 packet: git< # service=git-upload-pack
20:15:14.867071 pkt-line.c:46 packet: git< 0000
20:15:14.867079 pkt-line.c:46 packet: git< 97b8860c071898d9e162678ea1035a8ced2f8b1f HEAD\0multi_ack thin-pack side-band side-band-64k ofs-delta shallow no-progress include-tag multi_ack_detailed no-done symref=HEAD:refs/heads/master agent=git/2.0.4
20:15:14.867088 pkt-line.c:46 packet: git< 0f20ae29889d61f2e93ae00fd34f1cdb53285702 refs/heads/ab/add-interactive-show-diff-func-name
20:15:14.867094 pkt-line.c:46 packet: git< 36dc827bc9d17f80ed4f326de21247a5d1341fbc refs/heads/ah/doc-gitk-config
# […]
GIT_TRACE_PERFORMANCE
nadzira beleženje podatkov o uspešnosti.
Izpis prikazuje, koliko časa traja posamezni klic git
.
$ GIT_TRACE_PERFORMANCE=true git gc
20:18:19.499676 trace.c:414 performance: 0.374835000 s: git command: 'git' 'pack-refs' '--all' '--prune'
20:18:19.845585 trace.c:414 performance: 0.343020000 s: git command: 'git' 'reflog' 'expire' '--all'
Counting objects: 170994, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (43413/43413), done.
Writing objects: 100% (170994/170994), done.
Total 170994 (delta 126176), reused 170524 (delta 125706)
20:18:23.567927 trace.c:414 performance: 3.715349000 s: git command: 'git' 'pack-objects' '--keep-true-parents' '--honor-pack-keep' '--non-empty' '--all' '--reflog' '--unpack-unreachable=2.weeks.ago' '--local' '--delta-base-offset' '.git/objects/pack/.tmp-49190-pack'
20:18:23.584728 trace.c:414 performance: 0.000910000 s: git command: 'git' 'prune-packed'
20:18:23.605218 trace.c:414 performance: 0.017972000 s: git command: 'git' 'update-server-info'
20:18:23.606342 trace.c:414 performance: 3.756312000 s: git command: 'git' 'repack' '-d' '-l' '-A' '--unpack-unreachable=2.weeks.ago'
Checking connectivity: 170994, done.
20:18:25.225424 trace.c:414 performance: 1.616423000 s: git command: 'git' 'prune' '--expire' '2.weeks.ago'
20:18:25.232403 trace.c:414 performance: 0.001051000 s: git command: 'git' 'rerere' 'gc'
20:18:25.233159 trace.c:414 performance: 6.112217000 s: git command: 'git' 'gc'
GIT_TRACE_SETUP
prikazuje informacije o tem, kaj Git odkriva o repozitoriju in okolju, s katerim sodeluje.
$ GIT_TRACE_SETUP=true git status
20:19:47.086765 trace.c:315 setup: git_dir: .git
20:19:47.087184 trace.c:316 setup: worktree: /Users/ben/src/git
20:19:47.087191 trace.c:317 setup: cwd: /Users/ben/src/git
20:19:47.087194 trace.c:318 setup: prefix: (null)
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean
Razno
GIT_SSH
, če je določen, je program, ki se sproži namesto ssh
, ko Git poskuša vzpostaviti povezavo z gostiteljem SSH.
Sproži se kot $GIT_SSH [uporabnik@]gostitelj [-p <vrata>] <ukaz>
.
Upoštevajte, da to ni najlažji način prilagajanja načina, kako se sproži ssh
; ne podpira dodatnih parametrov ukazne vrstice, zato bi morali napisati ovijalni skript in nastaviti GIT_SSH
, da kaže nanj.
Za to je verjetno lažje uporabiti datoteko ~/.ssh/config
.
Vedite, da to ni najlažji način za prilagoditev, kako je ssh
priklican; to ne bo podpiralo dodatnih parametrov ukazne vrstice.
Za podporo dodatnih parametrov ukazne vrstice lahko uporabite GIT_SSH_COMMAND
, napišete ovojni skript in nastavite GIT_SSH
, da kaže nanj, ali pa uporabite datoteko ~/.ssh/config
.
GIT_SSH_COMMAND
nastavi ukaz SSH, ki je uporabljen, ko se Git poskuša povezati z gostiteljem SSH.
Ukaz interpretira lupina in dodatni argumenti ukazne vrstice se lahko uporabijo pri ssh
, kot je GIT_SSH_COMMAND="ssh -i ~/.ssh/my_key" git clone git@example.com:my/repo
.
GIT_ASKPASS
je nadomestitev za konfiguracijsko vrednost core.askpass
.
To je program, ki se sproži vsakič, ko Git potrebuje uporabniške poverilnice in pričakuje besedilni poziv kot argument ukazne vrstice, odgovor pa vrne na stdout
(glejte razdelek Shramba poverilnic za več informacij o tem podsistemu).
GIT_NAMESPACE
nadzira dostop do referenc imenskega prostora in je enakovreden zastavici --namespace
.
To je večinoma uporabno na strežniški strani, kjer želite shranjevati več različic ene same zbirke v eni zbirki in ohraniti reference ločene.
GIT_FLUSH
lahko uporabite za prisilitev Gita, da uporablja I/O brez medpomnilnika pri postopnem pisanju na stdout.
Vrednost 1 povzroči, da Git bolj pogosto izprazni, vrednost 0 pa povzroči, da je ves izhod v medpomnilniku.
Privzeta vrednost (če ta spremenljivka ni nastavljena) je izbira ustrezne sheme medpomnilnika glede na dejavnost in način izhoda.
GIT_REFLOG_ACTION
vam omogoča, da določite opisni besedilni zapis, zapisan v referenčnem dnevniku (reflog).
Tukaj je primer:
$ GIT_REFLOG_ACTION="my action" git commit --allow-empty -m 'My message'
[master 9e3d55a] My message
$ git reflog -1
9e3d55a HEAD@{0}: my action: My message