Rebasering: vad det är, hur rebase fungerar och arbete med Git

Författare: IT Sectr Publicerad: 2026-08-01 Lästid: 9 min

Rebase — är en operation i Git som flyttar commits från en gren till toppen av en annan, vilket skapar en linjär historik utan onödiga merge-commits. Till skillnad från sammanslagning skriver rebase om historiken: varje flyttad commit får en ny hash eftersom dess förälder ändras. Enligt Git-dokumentation (2026) används rebase för att synkronisera feature-grenar med det aktuella tillståndet för main innan en pull request skapas. Kommandot git rebase är ett av de grundläggande verktygen för att upprätthålla en ren historik i projekt som använder Git Flow.

Huvudpunkter

  • Rebase — flyttning av commits från feature-grenen till toppen av mål-grenen med skapande av nya hashar.
  • Linjär historik — den främsta fördelen med rebase: frånvaro av merge-commits förenklar läsningen av ändringsloggen.
  • Interaktiv rebase med flaggan -i gör det möjligt att slå samman, byta namn på och ta bort commits före publicering.
  • Offentliga grenar — rebase är förbjudet för grenar som andra utvecklare arbetar med eftersom det skriver om historiken.
  • Möjliga konflikter — vid flyttning av commits kan Git begära konfliktlösning för varje commit separat.

Vad är rebase i Git

Rebase — är ett Git-kommando som ombaserar den aktuella grenen på den angivna grenen: tar alla commits från den aktuella grenen, sparar dem tillfälligt, flyttar grenpekaren till mål-commiten och tillämpar de sparade commits sekventiellt ovanpå den. Resultatet — historiken ser ut som om utvecklaren arbetade direkt från den senaste commiten av mål-grenen.

Grundläggande syntax: git rebase main — när du befinner dig i feature-grenen flyttar detta kommando alla feature-commits till toppen av main. Git använder en three-way merge-strategi för varje commit separat. Om commit A redan finns i mål-grenen (bestäms via hash), hoppar Git automatiskt över den, vilket undviker dubbelarbete av ändringar.

Rebase stöder också onto-läget för att flytta en del av commits: git rebase --onto target start end — denna form gör det möjligt att extrahera ett intervall av commits från en gren och tillämpa dem ovanpå en annan. Till exempel kommer git rebase --onto main feature~3 feature att flytta de tre senaste commits av feature-grenen till toppen av main.

bash
# Växla till feature-gren
git checkout feature

# Ombasera feature på main
git rebase main

# Efter lyckad rebase — historiken är linjär
git log --oneline --graph

# Flytta de 3 senaste commits till main
git rebase --onto main HEAD~3 HEAD

Rebase vs Merge: viktigaste skillnaderna

Rebase och merge löser samma uppgift — att kombinera ändringar från olika grenar — men gör det på fundamentalt olika sätt. Merge bevarar den fullständiga sammanslagningshistoriken genom att skapa en merge-commit med två föräldrar. Rebase skriver om historiken och gör den linjär. Valet mellan dem beror på teamets arbetsflöde och reglerna för arbete med repot.

Den största skillnaden — hur sammanslagningsfaktumet registreras. Merge bevarar: “på denna punkt slog vi samman feature i main” — detta är informativt för projektets historik, men skräpar ner loggen vid frekventa sammanslagningar. Rebase visar: “feature-commits gjordes sekventiellt från mains senaste tillstånd” — detta är rent, men döljer det faktum att arbetet utfördes parallellt.

Den andra skillnaden — hantering av konflikter. Vid merge löses konflikter en gång och lösningen registreras i merge-commiten. Vid rebase kan konflikter uppstå för varje flyttad commit och varje kräver separat lösning. Detta är mer tidskrävande, men ger mer exakt kontroll över vilka ändringar som hamnar i den slutliga versionen.

KriteriumRebaseMerge
HistorikLinjär, utan merge-commitsIcke-linjär, med merge-commits
Commit-hasharSkrivs om (nya)Original bevaras
KonflikterFör varje commit separatEn gång i merge-commit
Offentliga grenarFörbjudetTillåtet
Ångringskommandogit rebase --abortgit merge --abort

Interaktiv rebase: kommandon och flaggor

Interaktiv rebase (git rebase -i) — är ett läge där Git öppnar en redigerare med en lista över commits och tillgängliga åtgärder för var och en av dem. Utvecklaren kan skriva om historiken innan den skickas till fjärrrepot. Detta är det främsta verktyget för att hålla commits rena i feature-grenen.

Tillgängliga kommandon i interaktivt läge: pick (lämna commiten som den är), reword (ändra commit-meddelandet), edit (stanna för ändringar), squash (slå ihop med föregående commit, behåll båda meddelandena), fixup (slå ihop, kasta meddelandet), drop (ta bort commit). Varje kommando anges före commit-hashen i den öppnade redigeraren.

Squash och fixup — de mest använda kommandona för att slå ihop commits. Om en utvecklare har gjort 5 små commits med rättelser under arbetet, kommer squash att slå ihop dem till en logisk commit med ett meningsfullt meddelande. Fixup är användbart för att korrigera skrivfel: ändringarna hamnar i den föregående commiten utan att spara sitt eget meddelande.

bash
# Öppna redigeraren för de 4 senaste commits
git rebase -i HEAD~4

# Redigeraren kommer att visa:
pick a1b2c3d Add authentication
pick e4f5g6h Fix typo in login
squash i6j7k8l Additional login fixes
pick m9n0o1p Add auth tests

# Efter sparande — Git utför rebase
# och öppnar redigeraren för sammanslaget commit-meddelande

# Auto-squash utan att öppna redigeraren
git rebase -i HEAD~4 --autosquash

Flaggan --autosquash ställer automatiskt in fixup/squash för commits vars meddelanden börjar med fixup! eller squash!. Detta påskyndar arbetet om utvecklaren i förväg markerar commits för senare sammanslagning. Flaggan --committer-date-is-author-date bevarar det ursprungliga datumet för commiten vid ombasering — användbart för att bevara kronologin i historiken.

Konfliktlösning vid rebase

Konflikter vid rebase uppstår när Git inte automatiskt kan tillämpa den flyttade commiten på grund av motsättningar med ändringar i mål-grenen. Till skillnad från merge där konflikten löses en gång, vid rebase kan varje commit orsaka en konflikt och måste lösas sekventiellt för varje commit från den äldsta till den nyaste.

När en konflikt uppstår, pausar Git rebase och rapporterar vilken commit som orsakade problemet. Utvecklaren öppnar konfliktfilen (Git markerar konfliktområden med markörer <<<<<<<, =======, >>>>>>>), redigerar den, lägger till i index (git add) och fortsätter rebase med kommandot git rebase --continue. Om ingen lösning hittas — git rebase --abort avbryter ombaseringen helt.

Tips: vid flera konflikter är det effektivare att använda git mergetool, som öppnar en visuell redigerare för att lösa motsättningar. Man kan också hoppa över den problematiska commiten (git rebase --skip), men detta tar bort dess ändringar från den slutliga historiken, vilket sällan är rätt lösning.

bash
# Starta rebase med konflikt
git rebase main
# Auto-merging file.txt
# KONFLIKT (innehåll): Sammanslagningskonflikt i file.txt

# Kontrollera status
git status
# båda modifierade: file.txt

# Redigera konfliktområden → git add → fortsätt
git add file.txt
git rebase --continue

# Vid osäkerhet — avbryt
git rebase --abort

När man inte ska rebasa

Gyllene regeln för rebase: ombasera aldrig commits som redan har skickats till fjärrrepot och är tillgängliga för andra utvecklare. Eftersom rebase skriver om commit-hashar kommer kollegor att stöta på konflikter vid synkroniseringsförsök — deras lokala historik kommer att vara oförenlig med den omskrivna fjärrhistoriken.

Situationen där rebase är kategoriskt förbjudet: om någon redan har skapat en gren baserad på dina commits (till exempel har din kollega gjort en feature från din feature), kommer ändring av historiken att förstöra hans arbete. I sådana fall ska merge användas. Det rekommenderas inte heller att rebasa precis före deadline — ett misstag vid konfliktlösning kan ta längre tid än förväntat och blockera releasen.

Undantag: om grenen endast används av en utvecklare (personlig feature-gren, opublicerad eller publicerad i draft-läge), är rebase före push standardpraxis. Efter publicering och påbörjat teamarbete — endast merge. GitHub och GitLab erbjuder som standard squash merge som en kompromiss: det slår ihop commits till en, men skriver inte om mål-grenens historik.

  • Offentliga grenar (main, develop, release) — rebase helt förbjudet.
  • Andras commits — om grenen innehåller commits från en annan utvecklare är rebase oacceptabelt.
  • Före release — risken för konflikter är högre: merge är säkrare en dag före deadline.
  • Grenar med taggar — att flytta en commit med en tagg bryter mot konventionerna för semantisk versionhantering.
  • CI/CD kopplat till hashar — vissa distributionssystem identifierar byggen via commit-hash; rebase bryter spårningen.

Praktiskt arbetsflöde med rebase

I moderna team används oftast rebase-orienterat arbetsflöde i kombination med GitHub Flow. Processen ser ut så här: utvecklaren skapar en feature-gren från main, arbetar i den, synkroniserar periodiskt via git rebase main och utför före skapandet av en pull request en interaktiv rebase för att rensa historiken.

Efter att PR har skapats (om nya ändringar från main behöver hämtas) används git pull --rebase main istället för vanlig git pull. Detta gör det möjligt att hämta ändringar utan att skapa en onödig merge-commit. Git pull med flaggan --rebase är likvärdigt med git fetch + git rebase — Git laddar först nya commits, sedan ombaserar det lokala ändringar ovanpå dem.

Git gör det möjligt att ställa in rebase som standardbeteende för pull: git config --global pull.rebase true. Efter denna konfiguration utför git pull alltid rebase istället för merge. Om vanlig pull behövs — används git pull --no-rebase. Många team aktiverar också autostash: git config --global rebase.autoStash true — detta döljer automatiskt ocommittade ändringar före rebase och återställer dem efteråt.

Vanliga frågor

Vad innebär det att rebasa commits i Git?

Att rebasa — innebär att utföra git rebase: att flytta commits från den aktuella grenen till toppen av en annan. Som ett resultat blir historiken linjär, varje commit får en ny hash och merge-commits skapas inte. Kommandot används för att synkronisera grenar utan onödiga sammanslagningspunkter i loggen.

Hur skiljer sig rebase från merge?

Merge skapar en merge-commit med två föräldrar, bevarar parallell historik och ursprungliga hashar. Rebase skriver om historiken — commits får nya hashar och historiken blir linjär. Merge är säkrare för offentliga grenar, rebase ger en renare logg.

Hur gör man en interaktiv rebase?

Kommandot git rebase -i HEAD~N öppnar en redigerare med de N senaste commits. För varje commit kan man välja en åtgärd: pick (behåll), reword (byt namn), edit (ändra), squash (slå ihop med föregående), fixup (slå ihop utan meddelande), drop (ta bort). Efter sparande tillämpar Git de valda ändringarna.

Varför är rebase farligt för offentliga grenar?

Rebase skriver om commit-hashar, vilket gör historiken inkompatibel med kopior av samma commits hos andra utvecklare. Om en kollega redan har tagit emot dina commits via git pull och du senare ombaserade dem, kommer hans git push att avvisas och git pull kommer att skapa dubbla commits och konflikter.

Kan rebase ångras efter utförande?

Före slutförande — git rebase --abort avbryter helt. Efter slutförande kan föregående tillstånd återställas via git reflog — hitta hashen för commiten före rebase och utför git reset --hard till den. Reflog lagrar historiken över HEAD-förflyttningar i 30 dagar som standard.

Sammanfattning

  • Rebase — operation för att flytta commits till en ny bas, skapar linjär historik utan merge-commits.
  • Kommando git rebase main ombaserar den aktuella grenen på main, tillämpar commits sekventiellt ovanpå.
  • Interaktivt läge -i gör det möjligt att slå samman (squash), byta namn (reword) och ta bort (drop) commits.
  • Konflikter vid rebase löses för varje commit separat, till skillnad från merge.
  • Offentliga grenar — ombasering är förbjudet eftersom det förstör historiken för andra utvecklare.
  • git pull --rebase — säkert sätt att synkronisera med fjärrgren utan merge-commit.
  • Git reflog — möjliggör återställning efter misslyckad rebase inom 30 dagar.

Vi utvecklar en mobil applikation nyckelfärdigt

IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.

Diskutera projektet

Läs också