Kapitel ▾ 2. Auflage

2.5 Git Grundlagen - Mit Remotes arbeiten

Mit Remotes arbeiten

Um an einem Git-Projekt zusammenarbeiten zu können, müssen Sie wissen, wie Sie Ihre Remote-Repositorys verwalten. Remote-Repositorys sind Versionen Ihres Projekts, die im Internet oder in einem Netzwerk gehostet werden. Sie können mehrere davon haben, von denen jede in der Regel entweder schreibgeschützt oder für Sie Lese-/Schreibzugriff hat. Die Zusammenarbeit mit anderen beinhaltet die Verwaltung dieser Remote-Repositorys und das Senden und Abrufen von Daten zu und von ihnen, wenn Sie Arbeit teilen müssen. Die Verwaltung von Remote-Repositorys umfasst die Kenntnis, wie man Remote-Repositorys hinzufügt, nicht mehr gültige Remotes entfernt, verschiedene Remote-Branches verwaltet und sie als getracked definiert oder nicht, und mehr. In diesem Abschnitt werden wir einige dieser Remote-Management-Fähigkeiten behandeln.

Hinweis
Remote-Repositorys können sich auf Ihrer lokalen Maschine befinden.

Es ist durchaus möglich, dass Sie mit einem "Remote"-Repository arbeiten, das sich tatsächlich auf demselben Host befindet wie Sie. Das Wort "Remote" bedeutet nicht unbedingt, dass sich das Repository irgendwo anders im Netzwerk oder im Internet befindet, sondern nur, dass es sich woanders befindet. Die Arbeit mit einem solchen Remote-Repository würde immer noch alle Standard-Push-, Pull- und Fetch-Operationen wie bei jedem anderen Remote beinhalten.

Ihre Remotes anzeigen

Um zu sehen, welche Remote-Server Sie konfiguriert haben, können Sie den Befehl git remote ausführen. Er listet die Kurznamen für jeden von Ihnen angegebenen Remote-Handle auf. Wenn Sie Ihr Repository geklont haben, sollten Sie mindestens origin sehen – das ist der Standardname, den Git dem Server gibt, von dem Sie geklont haben.

$ git clone https://github.com/schacon/ticgit
Cloning into 'ticgit'...
remote: Reusing existing pack: 1857, done.
remote: Total 1857 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (1857/1857), 374.35 KiB | 268.00 KiB/s, done.
Resolving deltas: 100% (772/772), done.
Checking connectivity... done.
$ cd ticgit
$ git remote
origin

Sie können auch -v angeben, was Ihnen die URLs anzeigt, die Git für den Kurznamen gespeichert hat, um beim Lesen und Schreiben zu diesem Remote verwendet zu werden.

$ git remote -v
origin	https://github.com/schacon/ticgit (fetch)
origin	https://github.com/schacon/ticgit (push)

Wenn Sie mehr als eine Remote haben, listet der Befehl sie alle auf. Zum Beispiel könnte ein Repository mit mehreren Remotes zur Zusammenarbeit mit mehreren Mitarbeitern ungefähr so aussehen.

$ cd grit
$ git remote -v
bakkdoor  https://github.com/bakkdoor/grit (fetch)
bakkdoor  https://github.com/bakkdoor/grit (push)
cho45     https://github.com/cho45/grit (fetch)
cho45     https://github.com/cho45/grit (push)
defunkt   https://github.com/defunkt/grit (fetch)
defunkt   https://github.com/defunkt/grit (push)
koke      git://github.com/koke/grit.git (fetch)
koke      git://github.com/koke/grit.git (push)
origin    git@github.com:mojombo/grit.git (fetch)
origin    git@github.com:mojombo/grit.git (push)

Dies bedeutet, dass wir Beiträge von jedem dieser Benutzer ziemlich einfach abrufen können. Wir haben möglicherweise zusätzlich die Berechtigung, zu einem oder mehreren davon zu pushen, obwohl wir das hier nicht erkennen können.

Beachten Sie, dass diese Remotes eine Vielzahl von Protokollen verwenden; wir werden dies in Git auf einem Server einrichten genauer behandeln.

Remote-Repositorys hinzufügen

Wir haben bereits erwähnt und einige Demonstrationen gegeben, wie der Befehl git clone implizit die origin Remote für Sie hinzufügt. Hier ist, wie Sie explizit ein neues Remote-Git-Repository als Kurznamen hinzufügen, auf den Sie leicht verweisen können: Führen Sie git remote add <kurzname> <url> aus.

$ git remote
origin
$ git remote add pb https://github.com/paulboone/ticgit
$ git remote -v
origin	https://github.com/schacon/ticgit (fetch)
origin	https://github.com/schacon/ticgit (push)
pb	https://github.com/paulboone/ticgit (fetch)
pb	https://github.com/paulboone/ticgit (push)

Jetzt können Sie die Zeichenkette pb an der Kommandozeile anstelle der gesamten URL verwenden. Wenn Sie beispielsweise alle Informationen abrufen möchten, die Paul hat, Sie aber noch nicht in Ihrem Repository, können Sie git fetch pb ausführen.

$ git fetch pb
remote: Counting objects: 43, done.
remote: Compressing objects: 100% (36/36), done.
remote: Total 43 (delta 10), reused 31 (delta 5)
Unpacking objects: 100% (43/43), done.
From https://github.com/paulboone/ticgit
 * [new branch]      master     -> pb/master
 * [new branch]      ticgit     -> pb/ticgit

Pauls master-Branch ist jetzt lokal als pb/master zugänglich – Sie können ihn in einen Ihrer Branches mergen oder einen lokalen Branch an diesem Punkt auschecken, wenn Sie ihn inspizieren möchten. Wir werden im Detail besprechen, was Branches sind und wie man sie benutzt, in Git Branching.

Von Ihren Remotes abrufen und nach Hause holen

Wie Sie gerade gesehen haben, können Sie, um Daten von Ihren Remote-Projekten abzurufen, Folgendes ausführen:

$ git fetch <remote>

Der Befehl geht zu diesem Remote-Projekt und ruft alle Daten von diesem Remote-Projekt ab, die Sie noch nicht haben. Nachdem Sie dies getan haben, haben Sie Referenzen auf alle Branches dieses Remotes, die Sie jederzeit mergen oder inspizieren können.

Wenn Sie ein Repository klonen, fügt der Befehl automatisch dieses Remote-Repository unter dem Namen "origin" hinzu. Daher ruft git fetch origin alle neuen Arbeiten ab, die seit Ihrem Klonen (oder dem letzten Abruf von dort) auf diesen Server gepusht wurden. Es ist wichtig zu beachten, dass der Befehl git fetch nur die Daten in Ihr lokales Repository herunterlädt – er mergt sie nicht automatisch mit Ihrer Arbeit oder verändert das, woran Sie gerade arbeiten. Sie müssen sie manuell in Ihre Arbeit mergen, wenn Sie bereit sind.

Wenn Ihr aktueller Branch so eingerichtet ist, dass er einen Remote-Branch verfolgt (siehe nächster Abschnitt und Git Branching für weitere Informationen), können Sie den Befehl git pull verwenden, um diesen Remote-Branch automatisch abzurufen und dann in Ihren aktuellen Branch zu mergen. Dies kann ein einfacherer oder angenehmerer Workflow für Sie sein. Standardmäßig richtet der Befehl git clone Ihren lokalen master-Branch so ein, dass er den Remote-master-Branch (oder wie auch immer der Standard-Branch heißt) auf dem Server, von dem Sie geklont haben, verfolgt. Das Ausführen von git pull ruft im Allgemeinen Daten vom Server ab, von dem Sie ursprünglich geklont haben, und versucht automatisch, sie in den Code zu mergen, an dem Sie gerade arbeiten.

Hinweis

Ab Git-Version 2.27 wird git pull eine Warnung ausgeben, wenn die Variable pull.rebase nicht gesetzt ist. Git wird Sie weiterhin warnen, bis Sie die Variable setzen.

Wenn Sie das Standardverhalten von Git wünschen (Fast-Forward, wenn möglich, sonst einen Merge-Commit erstellen): git config --global pull.rebase "false"

Wenn Sie beim Pullen rebasen möchten: git config --global pull.rebase "true"

Zu Ihren Remotes pushen

Wenn Ihr Projekt an einem Punkt ist, den Sie teilen möchten, müssen Sie es nach oben pushen. Der Befehl dafür ist einfach: git push <remote> <branch>. Wenn Sie Ihren master-Branch zu Ihrem origin-Server pushen möchten (auch hier richten Klonen normalerweise beide Namen automatisch für Sie ein), können Sie dies ausführen, um alle Commits, die Sie gemacht haben, zurück zum Server zu pushen.

$ git push origin master

Dieser Befehl funktioniert nur, wenn Sie von einem Server geklont haben, auf den Sie Schreibzugriff haben, und wenn niemand in der Zwischenzeit gepusht hat. Wenn Sie und jemand anderes gleichzeitig klonen und dieser nach oben pusht und Sie dann nach oben pushen, wird Ihr Push zu Recht abgelehnt. Sie müssen zuerst deren Arbeit abrufen und in Ihre einarbeiten, bevor Sie pushen dürfen. Weitere detaillierte Informationen zum Pushen zu Remote-Servern finden Sie in Git Branching.

Ein Remote inspizieren

Wenn Sie weitere Informationen zu einem bestimmten Remote sehen möchten, können Sie den Befehl git remote show <remote> verwenden. Wenn Sie diesen Befehl mit einem bestimmten Kurznamen, wie z. B. origin, ausführen, erhalten Sie etwas wie dies.

$ git remote show origin
* remote origin
  Fetch URL: https://github.com/schacon/ticgit
  Push  URL: https://github.com/schacon/ticgit
  HEAD branch: master
  Remote branches:
    master                               tracked
    dev-branch                           tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)

Es listet die URL des Remote-Repositorys sowie die Tracking-Branch-Informationen auf. Der Befehl teilt Ihnen hilfreich mit, dass, wenn Sie sich auf dem master-Branch befinden und git pull ausführen, nach dem Abrufen automatisch der master-Branch des Remotes in den lokalen gemergt wird. Er listet auch alle Remote-Referenzen auf, die er heruntergeladen hat.

Das ist ein einfaches Beispiel, dem Sie wahrscheinlich begegnen werden. Wenn Sie Git intensiver nutzen, können Sie jedoch viel mehr Informationen von git remote show erhalten.

$ git remote show origin
* remote origin
  URL: https://github.com/my-org/complex-project
  Fetch URL: https://github.com/my-org/complex-project
  Push  URL: https://github.com/my-org/complex-project
  HEAD branch: master
  Remote branches:
    master                           tracked
    dev-branch                       tracked
    markdown-strip                   tracked
    issue-43                         new (next fetch will store in remotes/origin)
    issue-45                         new (next fetch will store in remotes/origin)
    refs/remotes/origin/issue-11     stale (use 'git remote prune' to remove)
  Local branches configured for 'git pull':
    dev-branch merges with remote dev-branch
    master     merges with remote master
  Local refs configured for 'git push':
    dev-branch                     pushes to dev-branch                     (up to date)
    markdown-strip                 pushes to markdown-strip                 (up to date)
    master                         pushes to master                         (up to date)

Dieser Befehl zeigt an, welcher Branch automatisch gepusht wird, wenn Sie git push ausführen, während Sie sich auf bestimmten Branches befinden. Er zeigt auch, welche Remote-Branches auf dem Server Sie noch nicht haben, welche Remote-Branches Sie haben, die vom Server entfernt wurden, und mehrere lokale Branches, die automatisch mit ihrem Remote-Tracking-Branch gemergt werden können, wenn Sie git pull ausführen.

Remotes umbenennen und entfernen

Sie können git remote rename ausführen, um den Kurznamen eines Remotes zu ändern. Wenn Sie beispielsweise pb in paul umbenennen möchten, können Sie dies mit git remote rename tun.

$ git remote rename pb paul
$ git remote
origin
paul

Es ist erwähnenswert, dass dies auch alle Ihre Remote-Tracking-Branch-Namen ändert. Was zuvor unter pb/master referenziert wurde, befindet sich jetzt unter paul/master.

Wenn Sie aus irgendeinem Grund ein Remote entfernen möchten – der Server wurde verschoben, Sie verwenden einen bestimmten Spiegel nicht mehr oder vielleicht trägt ein Mitwirkender nicht mehr bei –, können Sie entweder git remote remove oder git remote rm verwenden.

$ git remote remove paul
$ git remote
origin

Sobald Sie die Referenz auf ein Remote auf diese Weise löschen, werden auch alle Remote-Tracking-Branches und Konfigurationseinstellungen, die mit diesem Remote verbunden sind, gelöscht.