Slå ihop: git merge
Det här lär du dig
Section titled “Det här lär du dig”- Att föra in en gren i
mainmedgit merge. - Skillnaden mellan en fast-forward och en merge-commit.
- Att ta bort en gren som du är klar med, med
git branch -d.
Varför behövs det här?
Section titled “Varför behövs det här?”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.
Så hänger det ihop
Section titled “Så hänger det ihop”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:
- Fast-forward (spola framåt): har
maininte fått några nya commits sedan grenen skapades, behöver Git bara flytta frammaintill 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.
Exempel
Section titled “Exempel”Fast-forward
Section titled “Fast-forward”Grenen dag-4 har en ny commit, men main har inte ändrats. Växla till main och gör en merge:
$ git switch mainSwitched to branch 'main'$ git merge dag-4Updating 7620fac..8923e85Fast-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:
$ git log --oneline8923e85 (HEAD -> main, dag-4) Lägg till dag 4: Sundsvall7620fac Lägg till dag 3: Gävle226c08c Första versionen av resplanenGrenen dag-4 behövs inte längre. Ta bort den:
$ git branch -d dag-4Deleted branch dag-4 (was 8923e85).Det är bara etiketten som tas bort. Commiten 8923e85 finns kvar i historiken för main.
Merge-commit
Section titled “Merge-commit”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:
$ 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 resplanenStå på main och gör en merge:
git merge packlistaGit 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:
Merge made by the 'ort' strategy. packlista.txt | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 packlista.txtVill 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:
$ 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 resplanenmain har nu både årtalet och packlistan.
Övning
Section titled “Övning”Vanliga problem
Section titled “Vanliga problem”Testa dig själv
Section titled “Testa dig själv”Sammanfattning
Section titled “Sammanfattning”git merge <gren>för in grenen i den gren du står på. Växla tillmainförst.- Fast-forward:
mainflyttas bara fram. Det händer närmaininte 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 imainförsvinner inte.