Hoppa till innehåll

Slå ihop: git merge

  • Att föra in en gren i main med git merge.
  • Skillnaden mellan en fast-forward och en merge-commit.
  • Att ta bort en gren som du är klar med, med git branch -d.

En grenBranchEn egen utvecklingslinje i ett repository, där man kan göra ändringar utan att påverka huvudversionen.Läs mer om gren är till för att arbeta ifred. Men när arbetet är klart ska det in i huvudversionen, annars blir det aldrig en del av resplanen. Att föra ihop två grenar kallas att göra en mergeMergeAtt föra ihop ändringarna från två branches till en. Git gör det automatiskt när det går och ber om hjälp när samma rader ändrats på olika sätt.Läs mer om merge, på svenska slå ihop eller sammanfoga.

Du gör alltid en merge från den gren du står på. git merge dag-4 betyder: för in det som finns på dag-4 i grenen jag står på nu. Vill du föra in dag-4 i main växlar du därför först till main.

Git gör en merge på ett av två sätt:

Överst fast-forward: main flyttas fram från 7620fac till 8923e85, utan någon ny commit. Nederst merge-commit: main och packlista har varsin ny commit, och git merge skapar commiten 32d3823 som bygger på båda.

  • Fast-forward (spola framåt): har main inte fått några nya commits sedan grenen skapades, behöver Git bara flytta fram main till samma commitCommitEn sparad version av projektet i Git, med en beskrivning av vad som ändrats, vem som gjorde det och när.Läs mer om commit som grenen. Ingen ny commit skapas.
  • Merge-commit: har båda grenarna fått nya commits sedan de delade sig, skapar Git en ny commit som för ihop dem. Den är speciell, eftersom den har två föregående commits, en från varje gren.

Du väljer inte själv vilket sätt det blir. Git ser hur historiken ser ut och gör det som behövs.

Grenen dag-4 har en ny commit, men main har inte ändrats. Växla till main och gör en merge:

Terminal
$ git switch main
Switched to branch 'main'
$ git merge dag-4
Updating 7620fac..8923e85
Fast-forward
resplan.txt | 1 +
1 file changed, 1 insertion(+)

Fast-forward betyder att main bara flyttades fram från 7620fac till 8923e85. Nu pekar båda grenarna på samma commit:

Terminal
$ git log --oneline
8923e85 (HEAD -> main, dag-4) Lägg till dag 4: Sundsvall
7620fac Lägg till dag 3: Gävle
226c08c Första versionen av resplanen

Grenen dag-4 behövs inte längre. Ta bort den:

Terminal
$ git branch -d dag-4
Deleted branch dag-4 (was 8923e85).

Det är bara etiketten som tas bort. Commiten 8923e85 finns kvar i historiken för main.

Nu har du skapat grenen packlista och lagt till filen packlista.txt där. Under tiden har du också gjort en commit på main, som lägger till ett årtal i rubriken. Grenarna har gått isär:

Terminal
$ git log --oneline --all --graph
* dba7ce7 (HEAD -> main) Lägg till årtal i rubriken
| * b8c5496 (packlista) Lägg till packlista
|/
* 8923e85 Lägg till dag 4: Sundsvall
* 7620fac Lägg till dag 3: Gävle
* 226c08c Första versionen av resplanen

Stå på main och gör en merge:

Terminal
git merge packlista

Git behöver ett meddelande till den nya merge-commiten och öppnar därför en texteditor, med ett meddelande som redan är ifyllt: Merge branch 'packlista'. Spara och stäng editorn. Är det Vim, skriv :wq och tryck Enter. Sedan skriver Git:

Terminal
Merge made by the 'ort' strategy.
packlista.txt | 4 ++++
1 file changed, 4 insertions(+)
create mode 100644 packlista.txt

Vill du slippa editorn och använda det ifyllda meddelandet direkt, skriv git merge --no-edit packlista.

Längst till vänster i utskriften syns nu hur de två grenarna går ihop igen i merge-commiten:

Terminal
$ git log --oneline --graph
* 32d3823 (HEAD -> main) Merge branch 'packlista'
|\
| * b8c5496 (packlista) Lägg till packlista
* | dba7ce7 Lägg till årtal i rubriken
|/
* 8923e85 Lägg till dag 4: Sundsvall
* 7620fac Lägg till dag 3: Gävle
* 226c08c Första versionen av resplanen

main har nu både årtalet och packlistan.

1. Du vill föra in grenen dag-4 i main. Vad gör du?
Visa rätt svar
  • git switch main och sedan git merge dag-4: git merge för in den angivna grenen i den gren du står på.
2. Git skriver "Fast-forward" efter git merge. Vad har hänt?
Visa rätt svar
  • main har flyttats fram till grenens senaste commit, och ingen ny commit har skapats: Det händer när main inte har fått några nya commits sedan grenen skapades.
3. Du har gjort git merge dag-4 och sedan git branch -d dag-4. Vad händer med commitsen från dag-4?
Visa rätt svar
  • De finns kvar i historiken för main: Bara etiketten dag-4 tas bort. Commitsen är redan en del av main.

  • git merge <gren> för in grenen i den gren du står på. Växla till main först.
  • Fast-forward: main flyttas bara fram. Det händer när main inte har ändrats sedan grenen skapades.
  • Merge-commit: en ny commit med två föregångare. Det händer när båda grenarna har nya commits.
  • git branch -d <gren> tar bort en gren som är införd. Commits som finns i main försvinner inte.