0%

Geschiedenis lezen

Vergelijk twee momentopnamen

git show vergelijkt één commit met de commit direct ervoor. Dat werkt goed wanneer je één wijziging beoordeelt. Het is niet genoeg wanneer je vraag begint met: “Wat was er anders tussen deze twee punten?” In de afbeelding vergelijkt het linkerdeel de oudercommit (PARENT) met één commit (ONE COMMIT): de wijziging van die ene commit (ONE COMMIT’S CHANGE). Rechts staan een oudere (OLDER) en nieuwere (NEWER) momentopname naar keuze (ANY TWO SNAPSHOTS). In de getoonde richting van oud naar nieuw betekent het plusteken toegevoegd (MEANS ADDED) en het minteken verwijderd (MEANS REMOVED).

Git show vergelijkt één commit met zijn oudercommit; git diff vergelijkt twee oudere en nieuwere momentopnamen naar keuze in een gekozen richting. Plusregels zijn toegevoegd en minregels verwijderd.

Noem de twee toestanden

git diff vergelijkt toestanden. Geef je twee commitidentificatiecodes op, dan is de eerste de beginmomentopname en de tweede het eindpunt:

git diff <start> <destination>

In die vorm staan geen opties. De twee identificatiecodes zijn de commits die je wilt vergelijken, in de richting waarin je het antwoord wilt lezen. Het diagram gebruikt de gebruikelijke richting van ouder naar nieuwer. Git accepteert ook de omgekeerde volgorde en beschrijft dan de omgekeerde weg.

Bovenaan in de geschiedenis van Fern & Fig staat een commit die de vijgenprijs herstelt. De volgende documenteert waar voorraadgegevens staan. Vergelijk die twee momentopnamen:

git diff 8e9e8ec ed9fce3

Alleen README.md veranderde ertussen. De eerste drie regels zijn context. De nieuwere momentopname voegt een kop Stock toe en een zin die stock.csv als gezaghebbende bron aanwijst.

De richting verandert het verhaal

De volgorde doet ertoe. Met de oudere commit eerst betekent +: “aanwezig in de nieuwere momentopname, maar niet in de oudere”. Draai je de identificatiecodes om, dan beschrijft Git de omgekeerde weg en verschijnen diezelfde regels als verwijderingen.

Git verandert niet van mening. Een verschil heeft altijd een richting. Stel het je voor als een zin:

Als je begint bij 8e9e8ec, wat moet er dan veranderen om bij ed9fce3 te komen?

In die richting wordt de documentatie toegevoegd.

show en diff beantwoorden verschillende vragen

De uitvoer lijkt op elkaar omdat beide vergelijkingen zijn:

  • git show <commit> vraagt wat één commit ten opzichte van de oudercommit veranderde.

  • git diff <older> <newer> vraagt hoe twee momentopnamen naar keuze verschillen.

De twee commits die je aan git diff geeft hoeven niet naast elkaar te liggen. Git heeft beide momentopnamen al en kan ze dus direct vergelijken, zonder alle tussenliggende commits opnieuw af te spelen.

De vorm zonder commitnamen

git diff vergelijkt altijd twee toestanden. Twee commits noemen is alleen de meest expliciete manier om ze te kiezen.

Voer je het zonder commitnamen uit, dan vergelijkt Git bijgehouden bestanden in je werkboom met de staging area. Voordat je een wijziging klaarzet, komt de klaargezette versie nog overeen met je laatste commit. De opdracht zonder toevoegingen toont daarom bewerkingen die nog niet zijn klaargezet, ook als je ze al in de editor hebt opgeslagen. Nieuwe untracked bestanden worden niet getoond; gebruik git status om die te vinden.

git diff

In dit hoofdstuk lees je de repository van iemand anders, dus die opdracht heeft hier niets te melden. Zodra je bestanden gaat wijzigen, gebruik je haar voortdurend. Het volgende hoofdstuk begint ermee. Een leeg resultaat is ook een resultaat: er verschilt niets.

Je voert git diff OLD NEW uit. Wat vertelt een regel die met + begint in de uitvoer?

Je kunt nu de geschiedenis lezen, één commit openen en twee toestanden vergelijken. De laatste les combineert die drie handelingen om een vraag te beantwoorden die ertoe doet.