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. 

Zeit Zielpublikum Voraussetzungen
35 Minuten Du verstehst den grundlegenden Git-Workflow bereits. Du hast Git installiert.
    Du hast einen Bitbucket-Account.

Dieses Tutorial hilft dir, wenn du den grundlegenden Git-Workflow bereits verstanden hast und mit folgenden Befehlen vertraut bist:

  • Klonen: das Remote-Repository in Bitbucket Cloud auf dein lokales System kopieren
  • Hinzufügen oder stagen: deine Änderungen auf das Hinzufügen in den Git-Verlauf vorbereiten
  • Committen: neue oder geänderte Dateien dem Git-Verlauf des Repositorys hinzufügen
  • Pull: Neue Änderungen, die Andere dem Repository hinzugefügt haben, in dein lokales Repository übernehmen
  • Push: Änderungen aus deinem lokalen System in das Remote-Repository übernehmen 

Wenn du mit den Git-Grundlagen nicht vertraut bist und dir fix das entsprechende Wissen aneignen willst, sieh dir einfach unser Tutorial Git kennenlernen mit Bitbucket Cloud an.

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
  • Have multiple lines of development running at the same time independent of each other without needing 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. Go to tutorials/tutorials.git.bitbucket.org
  2. Klicke links auf + > Fork this repository (Dieses Repository forken).
  3. Gibt einen Namen ein, der im Team noch nicht vergeben ist, und klicke auf Fork repository (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-repositorys
    $ cd test-repositorys/
    $ test-repositorys
    Im Beispiel oben wird das Verzeichnis für die Test-Repositorys mithilfe des Befehls "mkdir" (make directory, Englisch für Verzeichnis erstellen). Anschließend wechselt Git mit "cd" (change directory, Englisch für 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. Check out the branch you just created using the git checkout command.
    $ 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. Füge der Datei editme.html eine Notiz hinzu. Du kannst zum Beispiel Folgendes tun: 
    <div class="quote">
      <blockquote>Das ist meine tolle Notiz.</blockquote>
      <cite>Eine Notiz: Die Kunst des Notierens</cite>
    </div>
  5. Füge diese Änderung hinzu.
    git add editme.html
    Beachte: Deine Änderung wird noch nicht zum Git-Verlauf committet, sondern verbleibt in einem "Wartezustand". Darüber haben wir in Änderungen speichern 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 Änderungen speichern gesprochen.
  7. Pushe diese Änderung mit dem Befehl "git push" zu Bitbucket.
    git push
    fatal: The current branch test-1 has no upstream branch.
    Um den aktuellen Branch zu pushen und den Remote- als Upstream-Branch festzulegen, führe Folgendes durch
      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:
Learn Bitbucket Branches

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, die andere erstellt haben, arbeiten kannst.

  1. Gehe zu deinem Tutorial-Repository in Bitbucket und klicke auf Branches. Dort sollte in etwa Folgendes angezeigt werden: Branches
  2. Klicke auf Create branch (Branch erstellen), gib dem Branch den Namen test-2 und klicke auf Erstellen
  3. Kopiere den Befehl "git fetch" in das Dialogfeld zum Auschecken deines Branches. 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 dem aktuellen Stand wie dein Remote-Branch (origin) ist. 
  6. Use the git checkout command to change the focus back to your other branch. The command will look something like this:
    $ 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 +> Create a pull request (Einen Pull-Request erstellen). Dein Branch test-1 wird hier als Quell-Branch und der Master als Ziel-Branch angezeigt. 

    Because we created this repository by forking an existing repository the destination is set to the master branch of the repository we forked.

    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 Create pull request (Pull-Request erstellen).
  3. Um einen Kommentar im Pull-Request zu verfassen, wähle eine Diff-Zeile aus. (Das ist dort, wo du die Änderung an der Datei editme.html vorgenommen hast.)
  4. Click Approve in the top left of the page. Of course in a real pull request you'd have reviewers making comments
  5. Klicke auf Merge (Mergen). 
  6. (Optional) Ergänze die Commit-Nachricht.
  7. Wähle eine der folgenden beiden Merge-Strategien zum Mergen des Commits:
    • Merge commit (Commit mergen): 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 (Commits) und du siehst, wie sich der gerade gemergte Branch in die Gesamtheit der Ä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 deine lokale Umgebung sauberer zu halten.

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
    You can see you're on the branch you just used to make your change and that you don't have any changes. We're ready to get rid of that branch now that we've finished that work.
  2. Wechsele in den Master-Branch. Führe dazu den Befehl "git checkout master" aus. 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 du hast 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 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-Branch, auch Master genannt, abgetrennt sind. So ist es möglich, dass mehrere Entwickler an ihren Features arbeiten, ohne mit dem offiziellen Code in Berührung zu kommen.

Beginne mit dem Master-Branch

This workflow helps you collaborate on your code with at least one other person. As long as your Bitbucket and local repos are up-to-date, you're ready to get started.

Einen neuen Branch erstellen

Verwende für jedes Feature oder Issue, an dem du arbeitest, einen separaten Branch. Nachdem du einen Branch erstellt hast. checkst du ihn lokal aus, damit alle deine Änderungen auf diesem Branch stattfinden.

Aktualisieren, Hinzufügen, Committen und Pushen von Änderungen

Genau wie mit Git kannst du an Features arbeiten und Commits durchführen. Wenn du fertig bist, pushe deine Commits und der Feature Branch in Bitbucket wird aktualisiert.

Lass deinen Code überprüfen

Um Feedback zu deinem Code zu bekommen, erstellst du einfach einen Pull-Request. Hier kannst du Reviewer hinzufügen und vor dem Mergen einen letzten Blick auf den Code werfen. 

Einarbeiten von Feedback

Jetzt ist es an deinen Teamkollegen, zu kommentieren und zu genehmigen. Bearbeite ihre Kommentare lokal, führe einen Commit durch und pushe Änderungen zu Bitbucket. Deine Updates erscheinen dann im Pull-Request.

Deinen Branch mergen

Vor dem Mergen musst du eventuelle Merge-Konflikte lösen, falls andere Entwickler Ä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 Branches Teams effizienter machen. Es gibt verschiedene Branching-Ansätze, die wir teilweise in Workflows im Vergleich vorstellen.