Git: Wie benennt man einen Branch um?

Einen lokalen Branch umzubenennen ist ein Befehl. Einen umzubenennen, der schon auf einem Remote liegt, sind drei — und der, den man weglässt, ist genau der, der den Branch danach auf die richtige Stelle zeigen lässt.

Lokal

user@pc:~$ git branch -m neuer-name                # benennt den aktuellen Branch um
user@pc:~$ git branch -m alter-name neuer-name     # benennt einen anderen um
before : old-name
after  : new-name

git branch -m nimmt ein oder zwei Argumente. Mit einem benennt es den aktuellen Branch um — das ist die Form, die man meistens braucht, und der Grund, warum der Befehl in fremden Beispielen so unsymmetrisch aussieht.

An deinen Commits ändert sich dabei nichts:

commit on the renamed branch : 2c7db02 work on the branch

Ein Branch ist eine Datei, in der ein Hash steht. Ihn umzubenennen benennt den Zeiger um und nicht die Historie. Es wird also nichts umgeschrieben, und selbst bei geteilten Commits gibt es nichts zu befürchten.

Der Remote erfährt davon nichts

remote : main old-name

Lokal umzubenennen fasst den Remote überhaupt nicht an. Schlimmer noch: Dein Branch trackt jetzt einen Remote-Branch unter dem alten Namen.

upstream of new-name : origin/old-name

Ein einfaches git push würde deinen umbenannten Branch also direkt wieder nach alter-name schieben — genau die Verwirrung, die du vermeiden wolltest.

Auf dem Remote umbenennen sind drei Befehle

user@pc:~$ git push origin neuer-name              # den neuen anlegen
user@pc:~$ git push origin --delete alter-name     # den alten entfernen
user@pc:~$ git branch -u origin/neuer-name         # den Upstream umbiegen
remote now           : main new-name
upstream of new-name : origin/new-name

Der dritte wird vergessen, weil ohne ihn alles richtig aussieht: Auf dem Remote steht der korrekte Name, und der falsche Upstream fällt erst beim nächsten Push oder Pull auf.

Ein Umbenennen auf der Remote-Seite gibt es nicht — git legt einen Ref an und löscht einen anderen. Das ist wichtig, wenn jemand anderes den Branch hat: In dessen Klon steht weiterhin der alte Name, und dessen Upstream zeigt jetzt auf etwas, das es nicht mehr gibt. Bei einem geteilten Branch sag also Bescheid, statt darauf zu hoffen, dass es auffällt.

Ist der Branch geschützt oder der Standard-Branch von jemandem, wird das Löschen verweigert. GitHub, GitLab und die anderen haben dafür eine Umbenennen-Funktion in den Einstellungen, die das sauber erledigt und offene Merge Requests mitnimmt. Nimm die statt der drei Befehle.

-m und -M

user@pc:~$ git branch -m neuer-name belegt
fatal: a branch named 'taken' already exists

user@pc:~$ git branch -M neuer-name belegt
local : main taken

-M ist --move --force. Es benennt über einen bestehenden Branch hinweg um, und der ersetzte Branch ist danach einfach aus der Liste verschwunden — ohne Rückfrage und ohne Meldung über die übliche hinaus.

Seine Commits sind über git reflog noch eine Weile erreichbar, wie bei jedem erzwungenen Löschen, aber es gibt keinen Grund sich darauf zu verlassen. Nimm -m und lass dich aufhalten.

Nebenbei: -M ist genau das, was git branch -M main in jedem Einstiegs-Schnipsel tut — es erzwingt, dass der erste Branch main heißt, ganz gleich wie er vorher hieß.

Hinweis zu Netcup (Werbung)

Der deutsche Hoster Netcup bietet unter anderem günstige und zugleich leistungsstarke Webhosting Pakete, KVM-basierte Root Server und dezidierte Server an. Mit unseren Gutscheincodes kannst du noch mehr Geld sparen (6€ bei deiner ersten Bestellung, 30% Rabatt auf alle KVM-basierten Root Server, ...).