Visual Studio 2015: Git – Amend Commit

Denne posten er skrevet fortrinnsvis for de som går fra TFS Version Control til Git, og er en introduksjon til en smart forbedring som er gjort i Visual Studio 2015 – Commit Amend.  Kommandolinje entusiaster vet allerede hvordan de gjør dette, men kan kanskje likevel være nyttig å se hvordan dette nå er løst i Visual Studio.

I TFS VC har man kun en kommando for å lagre filer til versjonskontroll, CheckIn.  Den kommandoen lagrer filen til det sentrale TFS VC systemet. Når man anvender Git så arbeider man mot sitt eget lokale git repository først – ved å commit’e endringer til det lokale, for så å push’e disse endringene til det eksterne remote repositoriet.    

Det er sjelden man gjør begge disse operasjonene etter hverandre, man committer mange flere ganger enn man pusher.  Hver gang man har en liten endring som man ser er en slags enhet, så committer man.  I og med at commit går mot det lokale, er dette veldig effektivt og raskt.  Når man er klar med oppgaven så pusher man til det remote, og da går samtlige commits opp.  De overføres samlet, men de blir ikke slått sammen, historikken fra committene bibeholdes.

Commit Amend er en kjent kommando for de Git erfarne, og enkel å gjøre på kommandolinjen.  Vi skal vise hvordan man anvender den fra Visual Studio, samt en par triks som hører med – alt fullstendig uten bruk av kommandolinjen!

Først finner vi den  – lett skjult – under Action i Changes hub’en I Team Explorer.

Normalt velger man bare (1) Commit,  men man kan også velge (2) Amend Previous Commit. 

Vi gjør en endring I en klasse I solution vår, og går til Changes for å commite den endringen.

Historien før vi gjør dette ser slik ut:

Når vi utfører Amend Previous Commit, legger vi til denne endringen til den forrige commiten.  Historien etter det blir altså:

Det ser altså ut som den nye committen har overskrevet den gamle.  Men la oss se på innholdet av denne:

 

 

 

Vi ser at den forrige endringen også er med, altså at .gitattributes ble lagt til, så vi har utvidet den forrige committen.  Ser man nøyere etter ser man at SHA-koden er endret, altså er det en helt ny commit som har skjedd.  Det er lettere å se dette om man anvender GitViz.

Det som skjedde var at den forrige committen fortsatt er der (1),  men det ble lagt en ny commit med de kombinerte endringene, og master peker nå til den nye (2).  Så historie bildet fra Visual Studio er korrekt, det viser historien fra master/head og bakover.    Git folket uttrykker dette som at “historien er omskrevet” og det er flere kommandoer for dette.

Amend Previous Commit er altså en ypperlig måte å legge til filer man “glemte” til forrige commit.   Vær oppmerksom på to viktige ting her:

FELLE

1)   Man kan kun Amend’e siste commit man gjorde. 

2) Man kan ikke Amend’e en commit som er pushed til det remote lageret. 

Det siste her er et viktig prinsipp også, så lenge man arbeider med sitt eget lokale repository kan man I prinsippet gjøre veldig mye, men med en gang man lagrer til det remote så kan også andre arbeide med det, og da kan endringer av historien bli veldig ubehagelige.   Når det gjelder Commit Amend, så tillater ikke Visual Studio at dette skjer. 

TRIKS: Beholde kommentaren eller endre den 

Noen ganger er det helt ok å både legge til en eller flere endringer I filene og samtidig endre kommentaren.  Andre ganger, spesielt når man bare skal legge til en ny fil, så kan det være ganske plagsomt, den forrige kommentaren hadde man møysommelig skrevet inn, kanskje til og med workitem nummer inkludert  (#1234), og skrive eller copy/paste på nytt er ikke morsomt.  Her kommer et lite triks som gjør dette enkelt.  La oss gjøre en ny endring, og velge Amend Previous Commit igjen:

Vi skriver rett og slett ingen ting inn i kommentarboksen – vi ignorer at det står “Enter a commit message <Required> “ der, og som man ser, så er ikke Amend Previous Commit dimmet, det er derimot Commit-knappen – for det er ikke tillatt å commite uten kommentar.  Men, vi Amend’er, og når det er gjort, ser vi at historien er lik, filen er endret og den opprinnelige kommentaren er i behold, derimit, enda en ny SHA nøkkel:

Endre kun kommentaren

Noen ganger er det ikke nye filer eller endringer man vil ha inn, men derimot kommentaren som ikke er bra nok.  Den kan man også endre med Commit Amend, men man starter fra Historie-vinduet, og går derfra (1) til Commit Details for siste commit.

I kommentarfeltet kan vi nå skrive de endringene til kommentaren vi ønsker (2), og deretter velger vi Amend Message (3) fra menyen under kommentarfeltet.

Refresh historie-vinduet (1), og så ser man endringene I kommentaren (2)

Anvendelser

Amend Commit er selvfølgelig anvendbar når man ønsker å rette noe, da kanskje først og fremst kommentaren.  Om man har glemt å knytte den til et work item, så er det veldig enkelt å bare legge til #12345 (#workitem nummeret), så vil TFS’en knytte dette automatisk sammen. 

Dersom man har glemt å legge til filer, så er det jo enkelt å bare committee på nytt, man må skrive en ny kommentare, men “glemte denne” fungerer jo også.  Amend Commit er likevel like rask, og man slipper å finne på en ny kommentar, som ofte kan bli litt meningsløs. 

I tillegg er det mange som ikke liker at historien blir så full av mange små og “glemte” småting, og det å få en litt renere historie kan man gjøre med Amend Commit.  Da slipper man kanskje også å tenke på ting som å squashe commits,  hold det rent I utgangspunktet – med Amend Commit.

Kod i vei !   Commit ofte !