Close

Git Fetch-Pull-Request: Fertigkeit freigeschaltet

Porträtfoto von Nicola Paolucci
Nicola Paolucci

Developer Advocate


Heutzutage ist das Einfügen von Korrekturen in ein Projekt so einfach wie das Erstellen von Forks (dabei erhältst du eine vollständige Remote-Kopie des Projekts, in der du munter werkeln kannst): Du musst nur die zu ändernde Datei auswählen, auf Bearbeiten klicken und einen Commit für deine Korrekturen durchführen.

Was aber, wenn du am anderen Ende sitzt und derjenige bist, der den Pull-Request (im Folgenden kurz PR) erhält? Oft hilft eine optimierte Webbenutzeroberfläche, mehr braucht es nicht. Ein Klick auf Approve (Genehmigen) und ein Klick auf Merge (Mergen) und schon bist du fertig.

Doch so läuft es nicht immer. Oft ist es erforderlich, die Änderungen des Pull-Requests (PR) lokal zu speichern, um Tests durchzuführen und sich das Ganze in der eigenen IDE vor Augen zu führen.

Die Schritte zum Herunterladen der Pull-Requests deiner Kollegen – oder genauer genommen zum Fetchen und Auschecken – sind prinzipiell einfach. Du kannst dir das Ganze sogar noch leichter machen, wenn du einige wichtige Punkte und Tricks kennst.

Deshalb möchte ich dir näherbringen, welche Kniffe Git für Befehlszeilen bereithält, wenn es um Pull-Requests geht.

Vor dem Start: Branch-Name und Status in der Shell-Eingabeaufforderung


Es überrascht mich immer wieder, wie viele Entwickler eine Eingabeaufforderung verwenden, die nicht einmal anzeigt, auf welchem git-Branch sie sich befinden, oder ob in ihrem Arbeitsverzeichnis geänderte/nicht committete Dateien vorhanden sind. Hast du dich darin gerade wiedererkannt? Dann erlaube mir, dir ein paar Tipps zu geben und dich gleichzeitig schwer zu beeindrucken!

Tu dir selbst einen Gefallen und installiere den großartigen Liquid Prompt und du erhältst hervorragende Erläuterungen zum Status deines Arbeitsverzeichnisses in Git (oder einem beliebigen anderen VCS):

(Im Screenshot oben siehst du, dass auf meine Eingabe hin angezeigt wird, dass ich mich im Branch neuerbrach befinde und 5 Zeilen zu den von mir verfolgten Dateien in meinem Arbeitsverzeichnis hinzugefügt und 0 entfernt habe.)

Git-Logo
Zugehöriges Material

Git installieren

Bitbucket-Logo
Lösung anzeigen

Git kennenlernen mit Bitbucket Cloud

Alle arbeiten im selben Repository


Wenn du mit deinem Team im selben Repository arbeitest, ist das Auschecken eines Pull-Requests eine einfache Sache: Du musst den Branch, von dem der Pull-Request erstellt wurde, nur fetchen und auschecken:

  • Rufe alle Branches ab, die in eurem gemeinsamen Repository veröffentlicht wurden:
git fetch origin
  • Erstelle einen lokalen Branch, der den für dich interessanten Remote Branch verfolgt:
git checkout -b PRJ-1234 origin/PRJ-1234
  • Jetzt kannst du diff und merge ausführen und nach Herzenslust testen:
git diff main ./run-tests.sh
  • Wenn du mit dem Code zufrieden bist, kannst du zur Webbenutzeroberfläche zurückkehren, Feedback geben oder die Änderung vollständig genehmigen.

Mitarbeitende arbeiten in ihren eigenen Forks


Der Prozess sieht ein wenig anders aus, wenn einige der Beitragenden in separaten Abspaltungen arbeiten. In diesem Fall könntest du mit fetch den Remote-Branch abrufen, in dem der Beitrag oder das Feature committed wurde:

  • Füge zuerst den Remote Branch des Mitarbeiters hinzu:
git remote add jsmith http://bitbucket.org/jsmith/coolproject.git
  • Erfasse zunächst die neuesten Updates von origin, deinem Haupt-Repository:
git checkout main git fetch origin git merge main
  • Rufe alle Branches ab, die in der Fork des Mitarbeiters veröffentlicht wurden:
git fetch jsmith
  • Erstelle einen lokalen Branch, der den für dich interessanten Remote Branch verfolgt:
git checkout -b jsmith-PRJ-1234 jsmith/PRJ-1234
  • Jetzt kannst du diff und merge ausführen und nach Herzenslust testen:
git diff main ./run-tests.sh

Weniger Arbeitsaufwand dank Pull-Request-Referenzen


Die obige Methode funktioniert, aber gewisse Faktoren können dir dein Leben erschweren:

  • Was passiert, wenn du viele Mitarbeiter hast, die alle über ihre eigene Fork verfügen? Das Hinzufügen aller Forks und ihre separate Behandlung ist nicht zweckmäßig.
  • Was passiert, wenn du nicht einmal Zugriff auf einige dieser Forks hast und du den Quell-Branch nicht auschecken kannst?

In beiden Fällen lautet die Lösung: Pull-Request-Refs. Diese werden von einigen Git-Servern bereitgestellt. Meine Methode wird auf einigen Git-Servern unterstützt und kann auf deinem Server etwas anders ablaufen. Im Folgenden erkläre ich, wie du sämtliche Pull-Requests in Stash (jetzt Bitbucket Data Center) und GitHub mit dem Befehl fetch abrufen kannst.

Keine Angst vor den Refspecs

Zuallererst solltest du dich mit Refspecs vertraut machen. Kein Grund zur Sorge, Refspecs sind eine tolle Sache. Darunter versteht man einfache Zuordnungen von Remote-Branches zu lokalen Referenzen oder, anders ausgedrückt, einen direkten Weg, Git aufzufordern: "Ordne diesen Remote-Branch (oder diese Remote-Branches) diesem Namensraum lokal zu".

Ein Befehl wie z. B.:

git fetch +refs/heads/main:refs/remotes/origin/main

Dieser Befehl ordnet den Remote-Branch main in deiner origin-Remote-Verbindung einem lokalen origin/main zu. Jetzt kannst du Folgendes eingeben:

git checkout origin/main

Der Verweis bezieht sich weiterhin auf diesen Remote Branch. Das Plus-Zeichen (+) in der Definition zeigt Git, dass wir die Referenz aktualisieren wollen, wenn auch nicht per Fast-Forward.

Dies nutzen wir zum Herunterladen aller Pull-Requests, indem wir zuordnen, wie das Remote-Repository die PR-HEADS speichert, und sie einem lokalen Namensraum zuordnen, um sie leicht referenzieren zu können.

Wenn du ein origin- (oder upstream)-Remote-Repository definiert hast, gehst du wie folgt vor.

Hinweis: Wie einige Stash-Entwickler (jetzt Bitbucket Data Center) zu Recht bemerkt haben, sind meine folgenden Refs undokumentiert und privat und Änderungen an ihnen jederzeit möglich.

Herunterladen aller Pull-Requests: Stash

  • Forke ein Repository.
  • Klone deine Fork lokal:
git clone git@stash.atlassian.com:durdn/tis.git
  • Füge das ursprüngliche Upstream-Repository als upstream hinzu.
git remote add upstream git@stash.atlassian.com:tpettersen/tis.git
  • Hole dir die neuesten Heads vom Maintainer "upstream".
git fetch upstream
  • Füge das Refspec hinzu, das die Heads der Remote-Pull-Requests dem lokalen pr-Namensraum zuordnet. Führe dazu den Befehl config aus:
git config --add remote.origin.fetch '+refs/pull-requests/*/from:refs/remotes/origin/pr/*'
  • In .git/config werden die fetch-Einträge zu:
[remote "upstream"]
    url = git@stash.atlassian.com:docker/libswarm.git
    fetch = +refs/heads/*:refs/remotes/upstream/*
    fetch = +refs/pull-requests/*/from:refs/remotes/upstream/pr/*
  • Jetzt kannst du mit fetch einfach alle Pull-Anfrage-Branches abrufen:
$ git fetch upstream

remote: Counting objects: 417, done.
remote: Compressing objects: 100% (274/274), done.
remote: Total 417 (delta 226), reused 277 (delta 128)
Receiving objects: 100% (417/417), 105.28 KiB | 0 bytes/s, done.
Resolving deltas: 100% (226/226), done.

From stash.atlassian.com:docker/libswarm
 * [new ref]         refs/pull-requests/10/from-> upstream/pr/10
 [...]
 * [new ref]         refs/pull-requests/100/from -> upstream/pr/100
 * [new ref]         refs/pull-requests/101/from -> upstream/pr/101
 [...]
 * [new ref]         refs/pull-requests/109/from -> upstream/pr/109
 * [new ref]         refs/pull-requests/110/from -> upstream/pr/110
 [...]
  • Nun kannst du einfach folgendermaßen zu einem bestimmten Pull-Request wechseln:
git checkout pr/102

Herunterladen aller Pull-Requests: Github

Wenn sich die Abspaltungen oder Upstreams auf GitHub befinden, funktioniert es genau wie oben, nur der Befehl config ändert sich zu:

 git config --add remote.origin.fetch '+refs/pull//head:refs/remotes/origin/pr/'

Und das Remote-Repository in .git/config wird so geändert, dass er eine zusätzliche fetch-Konfiguration enthält, mit der die PR-Heads einem lokalen Namensbereich mit der Bezeichnung pr zugeordnet werden:

[remote "upstream"] url = git@github.com:docker/libswarm.git fetch = +refs/heads/*:refs/remotes/upstream/* fetch = +refs/pull/*/head:refs/remotes/upstream/pr/*

Abrufen eines einzelnen Pull-Requests mithilfe von Referenzen

Wenn du keine fetch-Einträge in .git/config machen und schnell mit einem Pull-Request fortfahren willst, ist hier der passende Befehl:

  • Auschecken einer einzelnen PA in Bitbucket:
git fetch refs/pull-requests/your-pr-number/from:local-branch-name
  • Auschecken eines einzelnen PR in Github:
git fetch refs/pull/your-pr-number/head:local-branch-name

Wenn du den obigen Befehl häufig verwendest, kannst du den Prozess mit einem git-Alias optimieren:

# For Stash
git config alias.spr '!sh -c "git fetch origin pull-requests/${1}/from:pr/${1}" -'

# For Github
git config alias.gpr '!sh -c "git fetch origin pull/${1}/head:pr/${1}" -'

Wenn dieser Alias konfiguriert ist, können wir mit einem einfachen Befehl (danke, Inuit) eine Pull-Anfrage abrufen:

Fazit


Sobald du ein paar einfache Aliasse erstellt oder die richtigen Refspecs zu deiner .git/config hinzugefügt hast, ist es einfach, die Arbeit deiner Kollegen oder Beitragenden im Auge zu behalten.

Nicola Paolucci

Nicola is an all-round hacker who loves exploring and teaching bleeding edge technologies. He writes and talks about Git, development workflows, code collaboration and more recently about Docker. Prior to his current role as Developer Instigator at Atlassian he led software teams, built crowd sourcing applications for geo-spacial data, worked on huge e-commerce deployments. Little known facts about Nicola: he gesticulates a lot while speaking (being Italian), lives in Amsterdam and rides a Ducati.


Diesen Artikel teilen

Lesenswert

Füge diese Ressourcen deinen Lesezeichen hinzu, um mehr über DevOps-Teams und fortlaufende Updates zu DevOps bei Atlassian zu erfahren.

Mitarbeiter arbeiten mit unzähligen Tools zusammen

Bitbucket-Blog

Abbildung: DevOps

DevOps-Lernpfad

Demo Den: Feature-Demos mit Atlassian-Experten

So funktioniert Bitbucket Cloud mit Atlassian Open DevOps

Melde dich für unseren DevOps-Newsletter an

Thank you for signing up