fredag 14. mars 2014 Git
Her følger ukens GIT #7 fra Stian.
Du har sikkert sett referanser til HEAD@
, HEAD~
, HEAD^
og lignende, men vet du hva alle disse egentlig er? La oss begynne med selve HEAD
: HEAD
er rett og slett en peker til hvor du er nå. Et Git-depot inneholder som du nok vet en tre-lignende graf (egentlig en DAG), og commits er noder i "treet". HEAD
er en peker til noden som er utsjekket for øyeblikket.
Utover HEAD
finnes det også andre navngitte referanser (noder du kan referere med navn), for eksempel greiner (master
), tags/merker (v1.0
), eksterne greiner (origin/master
). Depotes navngitte referanser og hvor de peker til finner du ved å ta en titt på git show-ref
Som vi så i tipset om git reflog
i forrige uke, så kan man bruke @ til å referere relativt i historien fra vår navigering rundt i depoet. Med andre ord, hvor vi er nå og stegene vi sekvensielt utførte for å komme oss hit.
# Reflog lar oss se historikk på våre operasjoner
$ git reflog head # Se global historikk
$ git reflog master # Se historikk for master-greinen
# @ lar oss navigere bakover i historikken
$ git show master@{1} # En operasjon bakover på master
$ git show head@{2} # To operasjoner bakover (globalt)
$ git show master@{"yesterday"} # Alternativt på tid/dato
# Første operasjon som er minst X gammel på gjeldene branch
$ git show @{"1 week 2 days ago"}
$ git show @{-1} # Forrige branch du sjekket ut
# Atomløsningen for tirsdag morgen,
# revert alle mandagscommits på master (mellom søndag og nå)
$ git revert master@{"last sunday"}..master@{"today at 8:00"}
# Diff gjeldende branch (master) med forrige utsjekket (gren).
$ git checkout gren
$ git checkout master
$ git diff @{-1}
# Historikk fra master i går (med tidspunkter):
$ git reflog master@{"yesterday"}
525ddab master@{Fri Nov 1 18:18:49 2013 +0100}: commit: Mer fizz
423efd9 master@{Fri Nov 1 17:07:27 2013 +0100}: commit: Fjernet buzz
050d410 master@{Fri Nov 1 17:01:36 2013 +0100}: pull: Fast-forward
# Hva er forskjellen før og etter en pull?
$ git pull
$ git diff master master@{1}
Som vi så kunne vi bruke @
-operatoren til å navigere i historikken vår. Nå skal vi se på ^
og ~
som lar oss referere relativt i commit-treet.
^
er en foreldre-velger, den lar oss velge blant nodene som er direkte foreldre til en gitt node. I figuren ser vi at master/A har to foreldre, i dette tilfelle vil vi kunne nå B
med A^1
og C
med A^2
. Dersom bare ^
er angitt antas ^1
, mao A^=B
.
Flere operatorer kan slåes sammen for å navigere oppover i treet. A^^ = A^1^1 = A->B->D
for å nå D fra A.
~
lar oss navigere i generasjoner, den vil alltid velge første forelder. A~ = A~1 = B
, vi navigerer en generasjon oppover i treet via første forelder. A~2 = A->B->D
- to generasjoner bakover, alltid via første forelder.
$ git reflog
0dfbba3 HEAD@{0}: checkout: moving from fizzbuzz to master
525ddab HEAD@{1}: checkout: moving from master to fizzbuzz
A~3 = ?
master^2 = ?
master^2^2^ = ?
fizzbuzz^~ = ?
HEAD^2~2 = ?
HEAD@{1} = ?
HEAD@{1}~2 = ?
HEAD@{-1}^2~ = ?
0dfbba3^^^ = ?
525ddab^2 = ?