Git kennenlernen mit Bitbucket Cloud

So funktioniert Branching mit Bitbucket Cloud

Ziel

In diesem Tutorial lernst du die Grundlagen zum Erstellen, Reviewen und Mergen von Branches mit Git und Bitbucket Cloud. 

Dauer Zielgruppe Voraussetzungen
35 Minuten Du kennst dich bereits ein wenig mit dem Git-Workflow aus Du hast Git installiert
    Du hast ein Bitbucket-Konto

Dieses Tutorial ist für dich geeignet, wenn du dich bereits ein wenig mit dem Git-Workflow und Folgendem auskennst:

  • Klonen: Das Kopieren eines Remote-Repositorys in Bitbucket Cloud auf dein lokales System
  • Hinzufügen oder Stagen: Die Verwendung von durchgeführten Änderungen und deren Vorbereitung, damit sie deinem Git-Verlauf hinzugefügt werden können
  • Committen: Das Hinzufügen von neuen oder geänderten Dateien zum Git-Verlauf für das Repository
  • Pullen: Das Abrufen neuer Änderungen in deinem lokalen Repository, die andere zum Repository hinzugefügt haben
  • Pushen: Das Übertragen von Änderungen von deinem lokalen System auf das Remote-Repository 

Falls du die Git-Grundlagen nicht kennst, ist das kein Problem. Sieh dir einfach unser Tutorial Lerne Git mit Bitbucket Cloud kennen , dann bist du im Nullkommanichts informiert.

Warum ist Branching wichtig?

Mit Branching kannst du die Vorteile der Versionskontrolle mit Git voll ausschöpfen. Wenn du Branches in Git nutzt, kannst du:

  • Mit mehreren Teams gleichzeitig in einem einzigen Repository arbeiten.
  • Mit Teammitgliedern überall auf der Welt mithilfe von Bitbucket Cloud zusammenarbeiten.
  • Mehrere Entwicklungslinien gleichzeitig und unabhängig voneinander ausführen, und das ohne Code Freezes.

Git einrichten

Damit du gleich üben kannst, wie die Arbeit im Team in einem gemeinsamen Bitbucket-Repository abläuft, haben wir dir ein öffentliches Repository zum Forken bereitgestellt.

Was ist ein Fork?

Forken ist eine weitere Möglichkeit zum Speichern eines Klons oder einer Kopie. Der Ausdruck Forken in der Programmierung leitet sich von einem Aufruf in Unix-Systemen ab, mit dem eine Kopie eines bestehenden Prozesses erstellt wird. Ein Fork ist also im Gegensatz zu einem Branch nicht vom ursprünglichen Repository abhängig. Wird das ursprüngliche Repository gelöscht, bleibt der Fork erhalten. Wenn du ein Repository forkst, erhältst du dieses Repository mit all seinen Branches. 

  1. Gehe zu tutorials/tutorials.git.bitbucket.org.
  2. Klicke auf der linken Seite des Bildschirms auf + > Dieses Repository forken.
  3. Ändere den Namen so, dass er für dein Team unverwechselbar ist, und klicke dann auf Repository forken
  4. Erstelle für das Repository ein Verzeichnis, das du leicht aufrufen kannst. Das könnte in etwa wie folgt aussehen:
    $ mkdir test-repositories
    $ cd test-repositories/
    $ test-repositories
    Im Beispiel oben wird das Verzeichnis für die Test-Repositorys mithilfe des Befehls "mkdir" (make directory, Verzeichnis erstellen) erstellt. Anschließend wechselt Git mit "cd" (change directory, Verzeichnis wechseln) zu diesem Verzeichnis.
  5. Klone das geforkte Repository in das gerade erstellte Verzeichnis. Das wird in etwa wie folgt aussehen:
    $ git clone https://dstevenstest@bitbucket.org/dstevenstest/mygittutorial.bitbucket.io.git
        Cloning into 'mygittutorial.bitbucket.io'...
        remote: Counting objects: 12392, done.
        remote: Compressing objects: 100% (12030/12030), done.
        remote: Total 12392 (delta 8044), reused 564 (delta 360)
        Receiving objects: 100% (12392/12392), 2.72 MiB | 701.00 KiB/s, done.
        Resolving deltas: 100% (8044/8044), done.
    $ cd mygittutorial.bitbucket.io/
    So wird mit dem git clone-Befehl das Repository geklont und das vom Klon erstellte Verzeichnis angelegt:  mygittutorial.git.bitbucket.io

Mit dem Branching-Workflow einen Branch erstellen und Änderungen vornehmen

In diesem Branch fügst du eine Notiz zu deiner Website hinzu. 

  1. Erstelle einen Branch mit dem Befehl "git branch". 
    $ git branch test-1
  2. Checke den eben erstellten Branch mit dem Befehl git checkout aus.
    $ git checkout test-1
    Switched to branch 'test-1'
  3. Lasse dir deine lokalen Branches mit dem Befehl "git branch" auflisten.
    $ git branch
      master
      * test-1
  4. Aktualisiere die Datei editme.html , indem du ihr ein Zitat hinzufügst. Du kannst zum Beispiel Folgendes verwenden: 
    <div class="quote">
      <blockquote>This is a quote, and I like it.</blockquote>
      <cite>A quote: The Art of Quoting</cite>
    </div>
  5. Füge diese Änderung hinzu.
    git add editme.html
    Hinweis: Deine Änderung wird noch nicht zum Git-Verlauf committet, sondern verbleibt im Wartezustand. Darüber haben wir im Abschnitt Speichern von Änderungen gesprochen.
  6. Committe die Änderung mit einer beschreibenden Commit-Nachricht.
    git commit editme.html -m'added a new quote'
    [test-1 063b772] added a new quote
    1 file changed, 3 insertions(+), 3 deletions(-)
    Hinweis: Die Änderungen erscheinen nun im Git-Verlauf als ein einziger "Commit". Darüber haben wir in Speichern von Änderungen gesprochen.
  7. Pushe diese Änderung mit dem Befehl "git push" zu Bitbucket.
    git push
    fatal: The current branch test-1 has no upstream branch.
    To push the current branch and set the remote as upstream, use
      git push --set-upstream origin test-1
    Ein Fehler wird gemeldet, weil du den Branch benennen musst, bevor du den neuen lokal erstellten Branch zum ersten Mal pushst.
  8. Pushe den Branch und die Änderung mit dem Befehl "git push branch".
    $ git push origin test-1
    Counting objects: 3, done.
    Delta compression using up to 8 threads.
    Compressing objects: 100% (3/3), done.
    Writing objects: 100% (3/3), 363 bytes | 0 bytes/s, done.
    Total 3 (delta 2), reused 0 (delta 0)
    remote:
    remote: Create pull request for test-1:
    remote: https://bitbucket.org/dstevenstest/dans.git.bitbucket.org/pull-requests/new?source=test-1&t=1
    remote:
    To https://bitbucket.org/dstevenstest/dans.git.bitbucket.org.git
    * [new branch] test-1 -> test-1
    Damit erkennt das System, dass das ursprüngliche Repository das Ziel dieses neuen Branches ist.
  9. Öffne dein Übungs-Repository und klicke auf Branches. Jetzt sollten dir sowohl der Master-Branch als auch der Branch test-1 angezeigt werden. Das sollte in etwa wie folgt aussehen:
Lerne Bitbucket-Branches kennen

Einen Remote Branch erstellen, abrufen und auschecken

Wenn du in einem Team arbeitest, wirst du wahrscheinlich Branches pullen und abrufen, die von anderen Teammitgliedern erstellt und zu Bitbucket gepusht wurden. In diesem Beispiel zeigen wir dir die Grundlagen zum Erstellen von Branches und wie du mit Branches arbeiten kannst, die andere erstellt haben.

  1. Gehe zu deinem Tutorial-Repository in Bitbucket und klicke auf Branches. Dort sollte in etwa Folgendes angezeigt werden:  Branches
  2. Klicke auf Branch erstellen, benenne den Branch als test-2 und klicke auf Erstellen
  3. Kopiere den Befehl "git fetch" in das Dialogfeld zum Auschecken deines Branch. Die Ausgabe wird in etwa wie folgt aussehen:
    $ git fetch && git checkout test-2
    From https://bitbucket.org/dstevenstest/dans.git.bitbucket.org
    * [new branch] test-2 -> origin/test-2
    Branch test-2 set up to track remote branch test-2 from origin.
    Switched to a new branch 'test-2'
  4. Gib den Befehl "git branch" in dein Terminal ein. Es wird eine Liste mit Branches angezeigt, die in etwa so aussieht:
    $ git branch
      master
      test-1
    * test-2
    Der mit einem Stern * markierte Branch ist der aktive Branch. Darauf solltest du in einem Branching-Workflow unbedingt achten. 
  5. Mit dem Befehl "git status" erhältst du eine Ausgabe dieser Art:
    $ git status
    On branch test-2
    Your branch is up-to-date with 'origin/test-2'.
    nothing to commit, working tree clean
    Hier siehst du, in welchem Branch du bist und dass der Branch auf demselben Stand wie dein Remote-Branch (origin) ist. 
  6. Verwende den Befehl "git checkout", um den Fokus wieder auf deinen anderen Branch zu ändern. Der Befehl sieht in etwa wie folgt aus:
    $ git checkout test-1
    Switched to branch 'test-1'
    Your branch is ahead of 'origin/test-1' by 3 commits.
    (use "git push" to publish your local commits)
    Einer der wichtigsten Punkte beim Arbeiten mit Branches: Vergewissere dich bei Änderungen, dass du sie auch am richtigen Branch vornimmst. 

Änderungen pushen und Pull-Requests erstellen

Jetzt wird es Zeit, deine erste Änderung reviewen zu lassen und den Branch zu mergen.

  1. Klicke auf +> Pull-Request erstellen. Dein Branch test-1 wird hier als Quell-Branch und der Master als Ziel-Branch angezeigt. 

    Da wir dieses Repository durch Forken eines bestehenden Repositorys erstellt haben, wird der Master-Branch des geforkten Repositorys als Ziel festgelegt.

    Um dies zu korrigieren, musst du den Ziel-Branch des Repositorys (den Branch, in den du deine Änderungen mergen wirst) von tutorials/tutorials.git.bitbucket.org in dein Repository ändern.

    Pull Request

    Außerdem kannst du Reviewer aus deinem Team zum Pull-Request hinzufügen. Erfahre mehr über Pull-Requests.

  2. Klicke auf Pull-Request erstellen.
  3. Um einen Kommentar im Pull-Request zu verfassen, wählst du eine Diff-Zeile aus. (Das ist dort, wo du die Änderung an der Datei editme.html vorgenommen hast.)
  4. Klicke oben links auf der Seite auf Genehmigen. In einem echten Pull-Request würden natürlich Reviewer Kommentare einfügen.
  5. Klicke auf Mergen
  6. (Optional) Ergänze die Commit-Nachricht, mit weiteren Informationen.
  7. Wähle die Merge-Strategie Commit mergen aus den zwei Optionen aus:
    • Merge commit—Alle Commits aus deinem Quell-Branch werden beibehalten und in den Ziel-Branch eingegliedert. Alternativ kannst du "git merge --no-ff" in die Befehlszeile eingeben.
    • Squash—Führt deine Commits zusammen, wenn du den Quell-Branch in den Ziel-Branch mergst. Alternativ kannst du "git merge --squash" in die Befehlszeile eingeben.
    Erfahre mehr über diese beiden Merge-Strategien.
  8. Klicke auf Commits, um zu sehen, wie sich der gerade gemergte Branch in die restlichen Änderungen einfügt.

Einen Branch löschen und den Master in den lokalen Arbeits-Branch pullen

Du hast jetzt den grundlegenden Branching-Workflow abgeschlossen und deine Änderung befindet sich im Master. Zum Schluss erklären wir, wie du den gerade gemergten Branch löschst, den aktualisierten Master-Branch pullst und den aktualisierten Master-Branch in deinen test-2-Branch mergst.

Warum sollte ich den Branch löschen?

Vergiss nicht, dass Branching in Git nicht dasselbe wie in SVN oder ähnlichen Versionskontrollsystemen ist. Der Unterschied liegt darin, dass du in Git langlebige Branches nutzen kannst, wie etwa einen Master- oder einen Entwicklungs-Branch, aber auch kurzlebige Entwicklungs-Branches, wie wir sie in diesem Tutorial zeigen. Daher kann es hilfreich sein, lokale Branches zu löschen, um für eine aufgeräumte lokale Umgebung zu sorgen.

Warum sollte ich den Master pullen und in test-2 mergen?

Bei diesem Beispiel nehmen wir an, dass du an einem Repository arbeitest, an dem auch ein anderes Teammitglied tüftelt. Dabei solltest du Änderungen gelegentlich in deinen Arbeits-Branch pullen, um Merge-Konflikten bei Pull-Requests vorzubeugen.

  1. Öffne dein Terminal und führe den Befehl "git status" aus. Das Ergebnis sollte etwa so aussehen:
    $ git status
    On branch test-1
    nothing to commit, working tree clean
    Wie du siehst, befindest du dich auf dem Branch, den du gerade für deine Änderung verwendet hast, und es liegen keine Änderungen vor. Nachdem wir diese Arbeit erledigt haben, können wir diesen Branch entfernen.
  2. Wechsele in den Master-Branch, indem du den Befehl "git checkout master" ausführst. Das Ergebnis sollte etwa so aussehen:
    git checkout master
    Switched to branch 'master'
    Your branch is up-to-date with 'origin/master'.
    Siehst du die Nachricht, die anzeigt, dass du auf dem neuesten Stand bist? Das gilt nur für deinen lokalen Branch. Klar, denn wir haben gerade eine Änderung in den Master gemergt und diese Änderung nicht vom Remote-Repository in unser lokales System gepullt. Das werden wir als Nächstes tun.
  3. Führe den Befehl "git pull" aus. Das Ergebnis sollte etwa so aussehen:
    $ git pull
    remote: Counting objects: 1, done.
    remote: Total 1 (delta 0), reused 0 (delta 0)
    Unpacking objects: 100% (1/1), done.
    From https://bitbucket.org/dstevenstest/dans.git.bitbucket.org
    2d4c0ab..dd424cb master -> origin/master
    Updating 2d4c0ab..dd424cb
    Fast-forward
    editme.html | 6 +++---
    1 file changed, 3 insertions(+), 3 deletions(-)
    Wenn du die Änderungen aus dem Remote-Repository pullst, führt Git einen Fast-Forward-Merge aus, um deine Änderungen zu integrieren. Dabei wird auch die Anzahl der geänderten Dateien und Zeilen in dieser Datei angezeigt.
  4. Führe den Befehl "git branch -d {branch_name}" aus, um den Branch test-1 zu entfernen. Das Ergebnis wird etwa so aussehen:
    $ git branch -d test-1
    Deleted branch test-1 (was 063b772)
    Du siehst, dass der Branch gelöscht wurde und welcher der letzte Commit-Hash für diesen Branch war. Wenn du einen Branch auf diese Weise löschst, bist du auf der sicheren Seite, denn Git lässt nicht zu, dass du einen Branch mit nicht committeten Änderungen löschst. Allerdings hält Git dich nicht davon ab, Änderungen zu löschen, die zwar in den Git-Verlauf committet, aber nicht in einen anderen Branch gemergt wurden.
  5. Wechsele mit dem Befehl "git checkout" in den Branch test-2.
    $ git checkout test-2
    Switched to branch 'test-2'
    Your branch is up-to-date with 'origin/test-2'.
  6. Merge den Master-Branch in deinen Arbeits-Branch. Verwende dazu den Befehl "git merge master test-2". Das Ergebnis wird etwa so aussehen:
    $ git merge master test-2
    Updating 2d4c0ab..dd424cb
    Fast-forward
    editme.html | 6 +++---
    1 file changed, 3 insertions(+), 3 deletions(-)
    Dabei solltest du Folgendes bedenken:
    • Auf den aktiven Branch kommt es an. Wenn du master in test-2 mergen willst, solltest du test-2 ausgecheckt haben (aktiv). Dasselbe gilt, wenn du test-2 in master mergen willst. Auch dann musst du den Master ausgecheckt haben.
    • Mit "git branch" kannst du den aktiven Branch anzeigen, der dann mit einem Sternchen markiert ist. Mit "git status" findest du heraus, in welchem Branch du dich befindest und ob lokale Änderungen ausstehen.

Wir hoffen, du hast ein wenig über das Branching und die zugehörigen Befehle gelernt. Rekapitulieren wir das Ganze noch einmal:

Den Branching-Workflow reviewen

Der Feature Branch Workflow von Git ermöglicht deinem Team eine effiziente Zusammenarbeit in Bitbucket. In diesem Workflow findet die gesamte Feature-Entwicklung in Branches statt, die vom Haupt-Master-Branch getrennt sind. So ist es möglich, dass mehrere Entwickler an ihren Features arbeiten, ohne mit dem Hauptcode in Berührung zu kommen.

Beginne mit dem Master Branch

Dieser Workflow hilft dir bei der Zusammenarbeit an einem Code mit mindestens einer weiteren Person. Solange dein Bitbucket und die lokalen Repositorys aktuell sind, bist du startbereit.

Erstelle einen neuen Branch

Verwende einen separaten Branch für jedes Feature oder jeden Vorgang, den du bearbeitest. Nachdem du einen Branch erstellt hast, checkst du ihn lokal aus, damit jegliche von dir gemachten Änderungen auf diesem Branch vorliegen.

Aktualisiere, committe und pushe Änderungen und füge sie hinzu

Bearbeite das Feature und nehme Commits vor, wie du es auch sonst bei Git machen würdest. Wenn du fertig bist, pushe deine Commits, wodurch der Feature Branch auf Bitbucket aktualisiert wird.

Lasse deinen Code prüfen

Um Feedback zu deinem Code zu erhalten, erstellst du einen Pull-Request in Bitbucket. Von hier kannst du Prüfer hinzufügen und sicherstellen, dass vor dem Mergen alles in Ordnung ist. 

Arbeite Feedback ein

Deine Teamkollegen können jetzt Kommentare einfügen und Genehmigungen gewähren. Arbeite ihre Kommentare lokal ein und committe und pushe die Änderungen zu Bitbucket. Deine Aktualisierungen werden im Pull-Request angezeigt.

Merge deinen Branch

Vor dem Mergen musst du eventuelle Merge-Konflikte lösen, falls andere Personen Änderungen an dem Repository vorgenommen haben. Wenn dein Pull-Request genehmigt wurde und es keine Konflikte gibt, kannst du deinen Code zum Master-Branch hinzufügen. Führe das Mergen ausgehend vom Pull-Request in Bitbucket durch. 

Dieses Tutorial kann dir nur begrenzt zeigen, wie Teams mit Branches effizienter arbeiten. Es gibt verschiedene Branching-Ansätze, von denen wir einige in Workflows im Vergleich vorstellen.