Chapters ▾ 2nd Edition

3.3 Git-grenar - Grenhantering

Grenhantering

Nu när du har skapat, sammanfogat och tagit bort grenar ska vi titta på några verktyg för grenhantering som är användbara när du jobbar med grenar ofta.

Kommandot git branch gör mer än att bara skapa och ta bort grenar. Om du kör det utan argument får du en enkel lista över dina aktuella grenar:

$ git branch
  iss53
* master
  testing

Observera att * före master: visar vilken gren du har växlad till (alltså grenen som HEAD pekar på). Det betyder att om du checkar in nu kommer master att flyttas framåt med ditt nya arbete. För att se den senaste incheckningen på varje gren kan du köra git branch -v:

$ git branch -v
  iss53   93b412c Fix javascript issue
* master  7a98805 Merge branch 'iss53'
  testing 782fd34 Add scott to the author list in the readme

De användbara flaggorna --merged och --no-merged kan begränsa listan till grenar som du har eller inte har sammanfogat in i grenen du står på. För att se vilka grenar som redan är sammanfogade med den gren du står på kan du köra git branch --merged:

$ git branch --merged
  iss53
* master

Eftersom du redan sammanfogade iss53 tidigare syns den i listan. Grenar i listan utan * framför går i regel bra att ta bort med git branch -d; du har redan fått in deras arbete i en annan gren.

För att se grenar som innehåller arbete som inte är sammanfogat kan du köra git branch --no-merged:

$ git branch --no-merged
  testing

Detta visar din andra gren. Eftersom den innehåller arbete som inte är sammanfogat ännu kommer git branch -d att misslyckas:

$ git branch -d testing
error: The branch 'testing' is not fully merged.
If you are sure you want to delete it, run 'git branch -D testing'.

Om du verkligen vill ta bort grenen och förlora arbetet kan du tvinga borttagningen med -D, som felmeddelandet föreslår.

Tips

Flaggorna --merged och --no-merged visar, om du inte anger en incheckning eller gren som argument, vad som är sammanfogat respektive inte sammanfogat med din nuvarande gren.

Du kan alltid ange en extra gren för att fråga om sammanslagningsläge mot en annan gren utan att växla till den först, till exempel vad som inte är sammanfogat i master:

$ git checkout testing
$ git branch --no-merged master
  topicA
  featureB

Byta namn på en gren

Var uppmärksam

Byt inte namn på grenar som fortfarande används av andra medarbetare. Byt inte namn på en gren som master/main/mainline utan att ha läst avsnittet Byta namn på master-grenen.

Anta att du har en gren som heter bad-branch-name och vill byta namn till corrected-branch-name utan att förlora historik. Du vill också byta namn på grenen i fjärrkodförrådet (GitHub, GitLab eller annan server). Hur gör du?

Byt namn lokalt med git branch --move:

$ git branch --move bad-branch-name corrected-branch-name

Detta ersätter bad-branch-name med corrected-branch-name lokalt. För att andra ska se den korrigerade grenen i fjärrkodförrådet behöver du skicka den:

$ git push --set-upstream origin corrected-branch-name

Nu tar vi en snabb titt på läget:

$ git branch --all
* corrected-branch-name
  main
  remotes/origin/bad-branch-name
  remotes/origin/corrected-branch-name
  remotes/origin/main

Du står på corrected-branch-name och den finns i fjärrkodförrådet. Den gamla grenen finns fortfarande kvar, men du kan ta bort den så här:

$ git push origin --delete bad-branch-name

Nu är det dåliga namnet helt ersatt av det korrigerade.

Byta namn på master-grenen

Varning

Att byta namn på en gren som master/main/mainline/default bryter integrationer, tjänster, hjälpskript och bygg-/utgåveskript i ditt kodförråd. Se till att samråda med dina medarbetare innan du gör detta. Kontrollera också att du uppdaterar alla referenser till det gamla namnet i kod och skript.

Byt namn på din lokala master till main med följande kommando:

$ git branch --move master main

Nu finns ingen lokal master längre, eftersom den har bytts till main.

För att andra ska se den nya main-grenen behöver du skicka den till fjärrkodförrådet:

$ git push --set-upstream origin main

Nu hamnar du i följande läge:

$ git branch --all
* main
  remotes/origin/HEAD -> origin/master
  remotes/origin/main
  remotes/origin/master

Din lokala master är borta och ersatt av main. main finns i fjärrkodförrådet, men den gamla master finns fortfarande kvar där. Andra medarbetare kommer fortsätta använda master som bas tills du gör fler ändringar.

Nu återstår några uppgifter för att slutföra bytet:

  • Projekt som är beroende av detta behöver uppdatera kod och/eller konfiguration.

  • Uppdatera inställningar för testkörningar.

  • Justera bygg- och utgåveskript.

  • Uppdatera inställningar i kodförrådsvärden för standardgren, sammanslagningsregler och annat som matchar grennamn.

  • Uppdatera referenser till gamla grenen i dokumentation.

  • Stäng eller sammanfoga eventuella ändringsförslag som riktar sig mot gamla grenen.

När du har gjort allt detta och är säker på att main fungerar som master kan du ta bort master:

$ git push origin --delete master