-
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
7.9 Orodja Git - Rerere
Rerere
Funkcionalnost git rerere
je nekoliko skrita značilnost.
Ime izhaja iz »reuse recorded resolution« (»ponovno uporabi posneto rešitev«) in vam, kot že samo ime nakazuje, omogoča, da si Git zapomni, kako ste rešili konflikt med kosi, tako da vam lahko prihodnjič pomaga in konflikt reši avtomatično.
Obstaja več scenarijev, kjer je ta funkcionalnost zelo priročna.
Eden izmed primerov, ki ga omenjajo v dokumentaciji, je, ko želite zagotoviti, ali se bo dolgotrajna tematska veja na koncu gladko združila brez konfliktov, vendar pa v svoji zgodovini ne želite imeti veliko vmesnih potrditev združitev.
Z vklopljenim rerere
lahko občasno poskusite združiti, rešite konflikte, nato pa izstopite iz združitve.
Če to počnete neprestano, bi morala biti končna združitev enostavna, saj lahko rerere
vse naredi za vas avtomatično.
Enako taktiko lahko uporabite, če želite ohraniti vejo ponovno bazirano, da se vam ne bo treba ukvarjati z istimi konflikti pri vsakem ponovnem baziranju. Ali pa, če želite vzeti vejo, ki ste jo združili in rešili veliko konfliktov, in se odločite, da jo boste raje ponovno bazirali — verjetno vam ni treba znova reševati vseh istih konfliktov.
Druga uporaba rerere
je, ko združujete več tematskih vej, ki se razvijajo, skupaj v testno glavo, kar uporablja občasno tudi sam projekt Git.
Če testi niso uspešni, lahko izbrišete združitve in jih ponovno izvedete brez tiste tematske veje, ki je naredila težave, ne da bi se morali ponovno spopasti s konflikti.
Za vklop funkcionalnosti rerere
morate samo nastaviti to nastavitev konfiguracije:
$ git config --global rerere.enabled true
To lahko omogočite tudi tako, da v določenem repozitoriju ustvarite direktorij .git/rr-cache
, vendar je nastavitev konfiguracije bolj jasna in vam omogoča, da to funkcionalnost omogočite globalno.
Zdaj si poglejmo preprost primer podoben prejšnjemu.
Recimo, da imamo datoteko z imenom hello.rb
, ki je videti tako:
#! /usr/bin/env ruby
def hello
puts 'hello world'
end
V eni veji spremenimo besedo »hello« v »hola«, nato pa v drugi veji spremenimo »world« v »mundo«, tako kot prej.
Ko združimo dve veji skupaj, bomo dobili konflikt združevanja:
$ git merge i18n-world
Auto-merging hello.rb
CONFLICT (content): Merge conflict in hello.rb
Recorded preimage for 'hello.rb'
Automatic merge failed; fix conflicts and then commit the result.
Opaziti bi morali novo vrstico Recorded preimage for FILE
.
Sicer bi morala biti videti enako kot običajen konflikt med združevanjem.
V tem trenutku nam lahko rerere
pove nekaj stvari.
Običajno bi zdaj zagnali ukaz git status
, da bi videli, kaj vse je povzročilo konflikt:
$ git status
# On branch master
# Unmerged paths:
# (use "git reset HEAD <file>..." to unstage)
# (use "git add <file>..." to mark resolution)
#
# both modified: hello.rb
#
Z git rerere status
pa vam bo git rerere
tudi povedal, kaj je posnel v stanje pred-združevanja:
$ git rerere status
hello.rb
Z ukazom git rerere diff
lahko prikažete trenutno stanje reševanja — s čim ste začeli, da bi rešili konflikt, in s čim ste ga rešili.
$ git rerere diff
--- a/hello.rb
+++ b/hello.rb
@@ -1,11 +1,11 @@
#! /usr/bin/env ruby
def hello
-<<<<<<<
- puts 'hello mundo'
-=======
+<<<<<<< HEAD
puts 'hola world'
->>>>>>>
+=======
+ puts 'hello mundo'
+>>>>>>> i18n-world
end
Prav tako (in to ni povezano z rerere
) lahko uporabite ukaz git ls-files -u
, da vidite datoteke, ki so povzročile konflikt, in predhodno, leve in desne različice:
$ git ls-files -u
100644 39804c942a9c1f2c03dc7c5ebcd7f3e3a6b97519 1 hello.rb
100644 a440db6e8d1fd76ad438a49025a9ad9ce746f581 2 hello.rb
100644 54336ba847c3758ab604876419607e9443848474 3 hello.rb
Sedaj lahko konflikt rešite tako, da spremenite vsebino datoteke na puts 'hola mundo'
, in nato lahko znova zaženete ukaz git rerere diff
, da vidite, kaj si bo rerere
zapomnil:
$ git rerere diff
--- a/hello.rb
+++ b/hello.rb
@@ -1,11 +1,7 @@
#! /usr/bin/env ruby
def hello
-<<<<<<<
- puts 'hello mundo'
-=======
- puts 'hola world'
->>>>>>>
+ puts 'hola mundo'
end
To pomeni, da bo Git ob zaznavi konflikta med kosom kode v datoteki hello.rb
, kjer je na eni strani »hello mundo« in na drugi strani »hola world«, konflikt rešil s »hola mundo«.
Sedaj lahko označimo konflikt kot rešen in ga potrdimo:
$ git add hello.rb
$ git commit
Recorded resolution for 'hello.rb'.
[master 68e16e5] Merge branch 'i18n'
Vidite lahko, da se prikaže sporočilo »Recorded resolution for FILE«, kar pomeni, da je bila rešitev konflikta uspešno posneta.
Zdaj pa razveljavimo to združitev in namesto tega ponovno bazirajmo na vrh naše veje master
.
To lahko storimo z ukazom git reset
, kot smo videli v razdelku Demistifikacija ponastavitve.
$ git reset --hard HEAD^
HEAD is now at ad63f15 i18n the hello
Naša združitev je razveljavljena. Sedaj ponovno bazirajmo tematsko vejo.
$ git checkout i18n-world
Switched to branch 'i18n-world'
$ git rebase master
First, rewinding head to replay your work on top of it...
Applying: i18n one word
Using index info to reconstruct a base tree...
Falling back to patching base and 3-way merge...
Auto-merging hello.rb
CONFLICT (content): Merge conflict in hello.rb
Resolved 'hello.rb' using previous resolution.
Failed to merge in the changes.
Patch failed at 0001 i18n one word
Sedaj smo dobili enak konflikt združevanja, kot smo pričakovali, vendar oglejte si vrstico Resolved FILE using previous resolution
.
Če si ogledamo datoteko, bomo videli, da je bila že rešena in da v njej ni označb konfliktov združevanja.
#! /usr/bin/env ruby
def hello
puts 'hola mundo'
end
Tudi git diff
vam bo prikazal, kako je bilo avtomatično ponovno rešeno:
$ git diff
diff --cc hello.rb
index a440db6,54336ba..0000000
--- a/hello.rb
+++ b/hello.rb
@@@ -1,7 -1,7 +1,7 @@@
#! /usr/bin/env ruby
def hello
- puts 'hola world'
- puts 'hello mundo'
++ puts 'hola mundo'
end
Z git checkout
lahko tudi ponovno kreirate stanje konfliktne datoteke:
$ git checkout --conflict=merge hello.rb
$ cat hello.rb
#! /usr/bin/env ruby
def hello
<<<<<<< ours
puts 'hola world'
=======
puts 'hello mundo'
>>>>>>> theirs
end
V razdelku Napredno združevanje smo videli primer tega.
Za zdaj pa ga ponovno rešimo samo z ukazom git rerere
:
$ git rerere
Resolved 'hello.rb' using previous resolution.
$ cat hello.rb
#! /usr/bin/env ruby
def hello
puts 'hola mundo'
end
Datoteko smo ponovno rešili samodejno s pomočjo predpomnjenja rešitve rerere
.
Sedaj lahko dodate in nadaljujete ponovno baziranje, da ga dokončate.
$ git add hello.rb
$ git rebase --continue
Applying: i18n one word
Če torej pogosto ponovno združujete veje, ali želite imeti tematsko vejo posodobljeno z vejo master
brez veliko združevanj, ali pogosto ponovno bazirate, lahko vklopite rerere
in si tako olajšajte življenje.