Detta är övningar för att träna sig i att använda det populära versionshanteringsverktyget Git.
Git är ett distribuerat versionshanteringsverktyg vilket innebär att alla som arbetar med ett repository har hela förändringshistoriken från alla andra.
Git används för bl.a:
I labbarna här kommer vi att arbeta en del from command-line. Det finns GUI-klienter för Git, men för att nöta in begreppen är det bra att skriva dessa flera gånger - vilket vi gör när vi gör labbarna från commandoprompten.
Mot slutet av dessa labbar övergår vi till GUI-klienter för Git.
Inför dessa labbar behöver vissa förutsättningar vara på plats.
En versionshanterad katalog kallas ofta för ett repository.
Ofta har man en central kopia av repositoryt, kallad för remote och de som ändrar i filerna har alla lokala versioner av denna.
Efter incheckningar synkar man med det centrala repositoryt så att alla har chansen att få samma filversioner.
I denna övning ska vi få en katalog i ditt lokala filhanteringssystem versionshanterad med Git.
git init
och tryck Ett tomt repository är inte så upphetsande. Vi lägger till en fil och ser till att den versionshanteras - och gör vår första commit av den.
En commit är en incheckning till repositoryt - alltså en beskriven återställningspunkt i versionshanteringen.
git status
. Den bör visa att det finns en ändring som inte är med i versionshanteringen.git add <filnamn>
git status
). Nu bör filen vara versionshanterad. Den är dock ännu inte incheckad, utan bara med i de ändringar som kommer med vid en incheckning.git commit -m "Skapade initial version av ny root-fil"
(eller vad för kommentar du vill lägga)git status
. Vad får du för svar?git log
. Vad ser du?Ibland gör man bort sig i ändringarna och vill backa till ett tidigare läge. De möjliga lägena för Git utgörs av de olika commits som gjorts.
Kommandot för att gå tillbaka i git är git reset
.
Nu ska vi fejka att vi av misstag råkar ta bort filen du nyss skapade och vill återskapa denna.
git status
. Den ska visa att du är oincheckade ändringar i form av en borttagen fil.git reset --hard
och tryck ENTER
Vill man gå tillbaka längre än till senaste checkin får man lägga till det commit-id som syns när man skriver git log
.
Då kan det t.ex. se ut så här: git reset --hard c91bfa18007b0c09d9dae892e5baeb4e9794df73
.
Inbyggt i Git finns ett system för branchning. Det innebär att man kan skapa en separat version av en en katalog för vissa typer av ändringar - som man sedan kan välja om och när man ska ta med i huvud-versionen av filerna.
Denna mekanism kan vara väldigt användbar för t.ex. kodhantering där man utvecklar enskilda funktioner separat från varandra. Då riskerar man inte att störa varandra.
Man kan se repositoryt som ett träd med flera grenar. Man kan hoppa runt och vara på olika grenar av detta träd.
git branch
och tryck ENTER för att visa nuvarandre grenar av repositorytgit branch json-introduction
git branch
igen för att lista grenarna. Vilken gren är du på?git checkout json-introduction
för att skifta till din nya branchgit branch
så att du är på rätt branch{ "name": "Linus Torvalds" }
git add .
, git commit -m "JSON file added"
)git log
för att se tidigare incheckningar med deras kommentarergit checkout master
. Finns JSON-filen med där?När man har gjort ändringar i en branch, och kanske gjort några olika commits, så har man förhoppningsvis fått till den nya featuren. Då är det dags att mergea ihop denna feature-branch med huvudkodbasen så att den blir införlivad i branchen master.
När man ska göra en merge så ställer man sig på den mottagande branchen och drar in den branch man vill ha till den.
git branch
git checkout master
git branch
git merge json-introduction
git status
git log
och kolla så att din incheckningskommentar från tidigare är medgit branch
. Finns branchen json-introduction kvar?git branch -d json-introduction
(-d
står för delete)Ofta är man flera som jobbar i samma repository. Då kan det uppstå konflikter när flera personer pillat i samma fil.
I denna övning ska vi provocera fram en sådan konflikt, och lösa denna.
git branch
och eventuellt git checkout master
)git branch change1
)git add person.json
följt av git commit -m "Changed person in person.json file"
)git checkout master
)git add person.json
följt av git commit -m "Changed person name in person.json file"
)git status
att förändringen är omhändertagen. Nu har vi två olika brancher med olika ändringar på samma namn.git merge change1
Det är bra att kunna skapa egna repositoryn, men det vanligaste är kanske att någon annan redan har skapat ett repository där du förväntas pilla i filerna.
För detta så klonar man hem en kopia av repositoryt - och får då även med all förändringshistorik.
Det finns mängder av olika Git-tjänster som kan tillhandahålla en remote. Några av de vanligaste är GitHub, Microsoft Azure DevOps, Bitbucket o.s.v. men det finns många fler.
cd
)git clone
och klistra in URL från tidigare steg innan du trycker ENTERNär flera personer jobbar mot ett gemensamt remote repository så har alla sina egna förändringar lokalt hela tiden. Oavsett hur många checkins du gör lokalt kommer de inte andra personer till gagn innan du knuffar upp dessa till remote.
Innan man pushar upp sina förändringar bör man göra en pull så att man får hem de förändringar som eventuellt finns i remote redan och kan lösa eventuella merge-problem lokalt så att man inte förstör för andra.
git add .
följt av git commit -m "Min fil tillagd"
)git status
git pull
git push
Det finns stöd för Git i alla möjliga programmeringsmiljöer, som t.ex. Visual Studio Code, IntelliJ, Eclipse och liknande.
I dessa får man viss hjälp med att synka filer och genomföra merge vid filkonflikter.
Med i Git kommer även två inbyggda GUI-applikationer. Vi ska kika lite på dessa.
gitk
, antingen från din startmeny eller från din terminalgit-gui
Ibland vill man sluta versionshantera en katalog, t.ex. om man vill zippa ihop den och skicka iväg den.
I rooten på den versionshanterade katalogen finns en dold underkatalog som heter .git
i den ligger allt som har med Git att göra.
.git
git status
så att katalogen är versionshanteradgit log
vad du har för incheckningar.git
git status
igen. Nu ska inte längre katalogen vara versionshanterad med gitgit init
i katalogen igen. Dubbelkolla så att katalogen .git
finns igen.git status
för att se statusgit log
och notera att vi nu har tappat bort hela historiken.Bra jobbat om du orkade ända hit. :)