Världens undergång. Bara på skoj! Det här misstaget är inte ovanligt och kan drabba vem som helst – expert eller nybörjare.
Eficode
Eficode is the leading DevOps company in Europe, driving and building the future of software development across 10 countries, with 500+ experts in DevOps and sustainable software development. Our Eficode ROOT managed DevOps platform provides centralized access control and real-time visibility of project status, quality, and performance that integrates with 50+ of your preferred tools, including the Atlassian Stack and open-source systems like Jenkins and Kubernetes.
Vad det innebär att committa till fel Git-gren
Låt oss säga att du arbetar med två aktiva grenar i ditt Git-repository och en dag råkar committa en uppdatering till fel gren, som du sedan pushar till din Git-server (till exempel Bitbucket). Oj då!
Det är värt att notera att grenbehörigheter på din Git-server ger ett bra skydd mot det här misstaget. De kan användas för att blockera direkta pushar till huvudgrenar och i stället kräva att du använder feature branches och pull requests.
Låt oss för resonemangets skull anta att du har gjort flera commits till fel gren. Vad gör du nu?
Få inte panik!
När du inser att detta har hänt behöver du stanna upp och kontrollera vilka commits på fel gren som har delats med andra, det vill säga pushats till din Git-server.
Den gyllene regeln är: Skriv aldrig om historiken för en gren som du redan har pushat till en Git-server och delat med andra.
Låt oss säga att du har två grenar på servern:
MG-200-correct-branch
MG-201-wrong-branch
Du trodde att du arbetade på MG-200-correct-branch, men i själva verket arbetade du på MG-201-wrong-branch.
Först behöver du köra ett kommando som visar vilka commits som har och inte har pushats till servern:
git log --decorate --oneline
Här är ett exempel på utdata:
afada1d (HEAD -> MG-201-wrong-branch) change on wrong branch (local)
630c250 (origin/MG-201-wrong-branch) change on wrong branch (pushed)
9a208bc (origin/develop, origin/MG-200-correct-branch, origin/HEAD, develop, MG-200-correct-branch) Task-123: activity
Argumentet ”--oneline” håller utdatan kortfattad, med en rad per commit, medan argumentet ”--decorate” visar vilka commits dina referenser pekar på.
Referenserna i rött som börjar med origin/ är referenser till fjärrgrenar. En fjärrreferens visar vad servergrenarna pekade på när du senast kommunicerade med servern, alltså hämtade ändringar från den via fetch eller pull.
Referenserna i grönt är dina lokala grenar. Om det var ett tag sedan du delade dina ändringar, alltså pushade dem, kommer dessa referenser inte att vara synkroniserade med referenserna till fjärrgrenarna.
Ovanstående utdata visar:
Den senaste commit du delade, alltså pushade till servern, och som är kopplad till MG-201-wrong-branch är 630c250. Det vet vi eftersom commiten har fjärrgrensreferensen ”origin/MG-201-wrong-branch” bredvid sig. Du är på den lokala grenen MG-201-wrong-branch och har gjort en commit lokalt till denna gren (afada1d).
Den senaste commit du delade, alltså pushade till servern, och som är kopplad till MG-201-wrong-branch är 630c250. Det vet vi eftersom commiten har fjärrgrensreferensen ”origin/MG-201-wrong-branch” bredvid sig.
Du är på den lokala grenen MG-201-wrong-branch och har gjort en commit lokalt till denna gren (afada1d).
Låt oss först flytta alla ändringar till den plats där de egentligen skulle hamna, alltså till grenen MG-200-correct-branch.
Det gör du genom att låta MG-200-correct-branch peka på den commit som MG-201-wrong-branch för närvarande pekar på:
git checkout MG-200-correct-branch
git reset --hard MG-201-wrong-branch
Efter detta ser utdata från ”git log --decorate --oneline” ut så här:
afada1d (HEAD -> MG-200-correct-branch, MG-201-wrong-branch) change on wrong branch (local)
630c250 (origin/MG-201-wrong-branch) change on wrong branch (pushed)
9a208bc (origin/develop, origin/MG-200-correct-branch, origin/HEAD, develop) Task-123: activity
Du kan nu dela MG-200-correct-branch eftersom den har rätt commits:
git push origin MG-200-correct-branch
… och loggutdata ser nu ut så här:
afada1d (HEAD -> MG-200-correct-branch, origin/MG-200-correct-branch, MG-201-wrong-branch) change on wrong branch (local)
630c250 (origin/MG-201-wrong-branch) change on wrong branch (pushed)
9a208bc (origin/develop, origin/HEAD, develop) Task-123: activity
Allt är alltså nu i ordning med MG-200-correct-branch. Däremot har du fortfarande fel commits kopplade till MG-201-wrong-branch, så det återstår lite innan du kan fira.
Den goda nyheten är att du ännu inte har pushat (delat) din commit afada1d till MG-201-wrong-branch, så du kan återigen lösa det med reset (kanske ett av dina främsta Git-kommandon när du behöver rätta till problem):
git checkout MG-201-wrong-branch
git reset --hard HEAD~1
Detta återställer åtminstone de lokala ändringarna som gjorts i MG-201-wrong-branch, och Git-loggen ser nu ut så här:
630c250 (HEAD -> MG-201-wrong-branch, origin/MG-201-wrong-branch) change on wrong branch (pushed)
9a208bc (origin/develop, origin/HEAD, develop) Task-123: activity
Observera att du inte längre kan se referenserna för MG-200-correct-branch. Det beror på att de inte längre går att nå från din nuvarande position i Git-historiken.
Det sista problemet att lösa är dock lite svårare. Din commit 630c250 pushades till servern (och delades med andra), och som tidigare nämnts är det ett stort nej att skriva om historiken för en branch som redan har pushats till en Git-server och delats med andra.
Därför är det bäst att göra en ny commit som i praktiken återställer ändringarna du av misstag committade och pushade.
Den bästa lösningen är alltså vanligtvis att göra ytterligare en ändring som återställer de kodändringar som pushades.
Som tur är erbjuder Git kommandot ”git revert” för en sådan situation:
$ git revert HEAD
När du har pushat ändringen (git push origin MG-201-wrong-branch) ser din Git-logg ut så här:
88431f1 (HEAD -> MG-201-wrong-branch, origin/MG-201-wrong-branch) Revert "change on wrong branch (pushed)"
630c250 change on wrong branch (pushed)
9a208bc (origin/develop, origin/HEAD, develop) Task-123: activity
För att bekräfta att dina filändringar inte längre finns på MG-201-wrong-branch använder du git diff:
git diff 88431f1 9a208bc
git diff ger då ingen output om commitarna representerar samma innehåll i repositoryt.
Till sist kan du checka ut rätt branch och fortsätta med din dag! :-)
git checkout MG-200-correct-branch
Klart!
Vi hoppas att du hade nytta av den här bloggen. Behöver du ytterligare hjälp är du välkommen att kontakta någon av våra experter.
Clearvision (nu en del av Eficode) erbjuder utbildning för företag i alla storlekar inom en rad olika mjukvaruapplikationer och system, inklusive Git, för att hjälpa dig att nå dina mål.
- DevOps
- Atlassian
Subscribe to our newsletter
Related blogs