Kapitel ▾ 2. Auflage

3.3 Git Branching - Branch Management

Branch Management

Nachdem Sie nun einige Branches erstellt, zusammengeführt und gelöscht haben, sehen wir uns einige Branch-Management-Tools an, die nützlich sind, wenn Sie Branches ständig verwenden.

Der Befehl git branch tut mehr als nur Branches erstellen und löschen. Wenn Sie ihn ohne Argumente ausführen, erhalten Sie eine einfache Liste Ihrer aktuellen Branches.

$ git branch
  iss53
* master
  testing

Beachten Sie das Zeichen *, das dem master-Branch vorangestellt ist: Es zeigt den Branch an, den Sie gerade ausgecheckt haben (d. h. den Branch, auf den HEAD zeigt). Das bedeutet, dass der master-Branch mit Ihrer neuen Arbeit voranschreiten wird, wenn Sie zu diesem Zeitpunkt committen. Um den letzten Commit auf jedem Branch zu sehen, können Sie git branch -v ausführen.

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

Die nützlichen Optionen --merged und --no-merged können diese Liste nach Branches filtern, die Sie bereits in den aktuellen Branch übernommen haben oder noch nicht. Um zu sehen, welche Branches bereits in den aktuellen Branch übernommen wurden, können Sie git branch --merged ausführen.

$ git branch --merged
  iss53
* master

Da Sie iss53 bereits früher zusammengeführt haben, sehen Sie ihn in Ihrer Liste. Branches auf dieser Liste, denen kein * vorangestellt ist, können im Allgemeinen mit git branch -d gelöscht werden. Sie haben deren Arbeit bereits in einen anderen Branch integriert, sodass Sie nichts verlieren werden.

Um alle Branches anzuzeigen, die Arbeit enthalten, die Sie noch nicht übernommen haben, können Sie git branch --no-merged ausführen.

$ git branch --no-merged
  testing

Dies zeigt Ihren anderen Branch an. Da er Arbeit enthält, die noch nicht übernommen wurde, wird das Löschen mit git branch -d fehlschlagen.

$ 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'.

Wenn Sie den Branch wirklich löschen und diese Arbeit verlieren möchten, können Sie dies mit -D erzwingen, wie die hilfreiche Meldung anzeigt.

Tipp

Die oben beschriebenen Optionen --merged und --no-merged zeigen Ihnen, was jeweils in Ihren *aktuellen* Branch übernommen wurde oder nicht, wenn kein Commit- oder Branch-Name als Argument angegeben wird.

Sie können jederzeit ein zusätzliches Argument angeben, um den Merge-Status in Bezug auf einen anderen Branch abzufragen, ohne diesen anderen Branch zuerst auszuchecken, z. B. was nicht in den master-Branch übernommen wurde?

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

Ändern eines Branch-Namens

Vorsicht

Benennen Sie keine Branches um, die noch von anderen Kollaborateuren verwendet werden. Benennen Sie einen Branch wie master/main/mainline nicht um, ohne den Abschnitt Ändern des Master-Branch-Namens gelesen zu haben.

Angenommen, Sie haben einen Branch namens bad-branch-name und möchten ihn in corrected-branch-name umbenennen, während die gesamte Historie erhalten bleibt. Sie möchten auch den Branch-Namen im Remote (GitHub, GitLab, anderer Server) ändern. Wie machen Sie das?

Benennen Sie den Branch lokal mit dem Befehl git branch --move um.

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

Dies ersetzt Ihren bad-branch-name durch corrected-branch-name, aber diese Änderung ist vorerst nur lokal. Damit andere den korrigierten Branch im Remote sehen können, pushen Sie ihn.

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

Nun werfen wir einen kurzen Blick darauf, wo wir jetzt stehen.

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

Beachten Sie, dass Sie sich auf dem Branch corrected-branch-name befinden und dieser im Remote verfügbar ist. Der Branch mit dem schlechten Namen ist dort jedoch auch noch vorhanden, aber Sie können ihn löschen, indem Sie den folgenden Befehl ausführen:

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

Nun ist der schlechte Branch-Name vollständig durch den korrigierten Branch-Namen ersetzt.

Ändern des Master-Branch-Namens

Warnung

Das Ändern des Namens eines Branches wie master/main/mainline/default wird die Integrationen, Dienste, Hilfsprogramme und Build/Release-Skripte, die Ihr Repository verwendet, unterbrechen. Stellen Sie sicher, dass Sie sich vorab mit Ihren Kollaborateuren beraten. Suchen Sie außerdem Ihr Repository gründlich durch und aktualisieren Sie alle Verweise auf den alten Branch-Namen in Ihrem Code und Ihren Skripten.

Benennen Sie Ihren lokalen master-Branch mit dem folgenden Befehl in main um:

$ git branch --move master main

Es gibt keinen lokalen master-Branch mehr, da er in den main-Branch umbenannt wurde.

Damit andere den neuen main-Branch sehen können, müssen Sie ihn auf den Remote pushen. Dies macht den umbenannten Branch im Remote verfügbar.

$ git push --set-upstream origin main

Nun landen wir im folgenden Zustand:

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

Ihr lokaler master-Branch ist weg, da er durch den main-Branch ersetzt wurde. Der main-Branch ist im Remote vorhanden. Der alte master-Branch ist jedoch immer noch im Remote vorhanden. Andere Kollaborateure werden den master-Branch weiterhin als Basis ihrer Arbeit verwenden, bis Sie weitere Änderungen vornehmen.

Nun stehen Ihnen noch einige Aufgaben bevor, um den Übergang abzuschließen:

  • Alle Projekte, die von diesem abhängen, müssen ihren Code und/oder ihre Konfiguration aktualisieren.

  • Aktualisieren Sie alle Testlaufkonfigurationsdateien.

  • Passen Sie Build- und Release-Skripte an.

  • Leiten Sie Einstellungen auf Ihrem Repo-Host für Dinge wie den Standard-Branch des Repos, Merge-Regeln und andere Dinge, die Branch-Namen übereinstimmen, um.

  • Aktualisieren Sie Verweise auf den alten Branch in der Dokumentation.

  • Schließen oder mergen Sie alle Pull-Requests, die auf den alten Branch abzielen.

Nachdem Sie all diese Aufgaben erledigt haben und sicher sind, dass der main-Branch genauso funktioniert wie der master-Branch, können Sie den master-Branch löschen.

$ git push origin --delete master