-
1. Erste Schritte
- 1.1 Über Versionskontrolle
- 1.2 Eine kurze Geschichte von Git
- 1.3 Was ist Git?
- 1.4 Die Kommandozeile
- 1.5 Git installieren
- 1.6 Erstmalige Git-Einrichtung
- 1.7 Hilfe bekommen
- 1.8 Zusammenfassung
-
2. Git Grundlagen
-
3. Git Branching
- 3.1 Branches im Überblick
- 3.2 Grundlegendes Branching und Merging
- 3.3 Branch-Management
- 3.4 Branching-Workflows
- 3.5 Remote-Branches
- 3.6 Rebasing
- 3.7 Zusammenfassung
-
4. Git auf dem Server
- 4.1 Die Protokolle
- 4.2 Git auf einem Server einrichten
- 4.3 Generieren Ihres SSH-Public-Keys
- 4.4 Einrichten des Servers
- 4.5 Git Daemon
- 4.6 Smart HTTP
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 Drittanbieter-Hosting-Optionen
- 4.10 Zusammenfassung
-
5. Verteiltes Git
-
6. GitHub
-
7. Git-Werkzeuge
- 7.1 Revisionsauswahl
- 7.2 Interaktives Staging
- 7.3 Stashing und Bereinigen
- 7.4 Ihre Arbeit signieren
- 7.5 Suchen
- 7.6 Historie umschreiben
- 7.7 Reset entmystifiziert
- 7.8 Fortgeschrittenes Merging
- 7.9 Rerere
- 7.10 Debugging mit Git
- 7.11 Submodule
- 7.12 Bundling
- 7.13 Ersetzen
- 7.14 Credential-Speicher
- 7.15 Zusammenfassung
-
8. Git anpassen
-
9. Git und andere Systeme
- 9.1 Git als Client
- 9.2 Migration zu Git
- 9.3 Zusammenfassung
-
10. Git-Interna
- 10.1 Plumbing und Porcelain
- 10.2 Git-Objekte
- 10.3 Git-Referenzen
- 10.4 Packfiles
- 10.5 Die Refspec
- 10.6 Übertragungsprotokolle
- 10.7 Wartung und Datenwiederherstellung
- 10.8 Umgebungsvariablen
- 10.9 Zusammenfassung
-
Anhang A: Git in anderen Umgebungen
- A1.1 Grafische Oberflächen
- A1.2 Git in Visual Studio
- A1.3 Git in Visual Studio Code
- A1.4 Git in IntelliJ / PyCharm / WebStorm / PhpStorm / RubyMine
- A1.5 Git in Sublime Text
- A1.6 Git in Bash
- A1.7 Git in Zsh
- A1.8 Git in PowerShell
- A1.9 Zusammenfassung
-
Anhang B: Git in Ihre Anwendungen einbetten
- A2.1 Kommandozeilen-Git
- A2.2 Libgit2
- A2.3 JGit
- A2.4 go-git
- A2.5 Dulwich
-
Anhang C: Git-Befehle
- A3.1 Einrichtung und Konfiguration
- A3.2 Projekte abrufen und erstellen
- A3.3 Grundlegendes Snapshotting
- A3.4 Branching und Merging
- A3.5 Projekte teilen und aktualisieren
- A3.6 Inspektion und Vergleich
- A3.7 Debugging
- A3.8 Patching
- A3.9 E-Mail
- A3.10 Externe Systeme
- A3.11 Administration
- A3.12 Plumbing-Befehle
10.5 Git Internals - Die Refspec
Die Refspec
In diesem Buch haben wir einfache Zuordnungen von Remote-Zweigen zu lokalen Referenzen verwendet, aber sie können komplexer sein. Angenommen, Sie sind den letzten Abschnitten gefolgt und haben ein kleines lokales Git-Repository erstellt und möchten nun ein Remote hinzufügen
$ git remote add origin https://github.com/schacon/simplegit-progit
Die Ausführung des obigen Befehls fügt Ihrem Repository eine Sektion in der Datei .git/config hinzu, die den Namen des Remotes (origin), die URL des Remote-Repositories und die zu verwendende Refspec für das Abrufen angibt.
[remote "origin"]
url = https://github.com/schacon/simplegit-progit
fetch = +refs/heads/*:refs/remotes/origin/*
Das Format der Refspec ist zunächst ein optionales +, gefolgt von <src>:<dst>, wobei <src> das Muster für Referenzen auf der Remote-Seite ist und <dst> dort ist, wo diese Referenzen lokal verfolgt werden. Das + weist Git an, die Referenz zu aktualisieren, auch wenn es keine Fast-Forward-Aktualisierung ist.
Im Standardfall, der automatisch von einem git remote add origin-Befehl geschrieben wird, ruft Git alle Referenzen unter refs/heads/ auf dem Server ab und schreibt sie lokal unter refs/remotes/origin/. Wenn es also einen master-Zweig auf dem Server gibt, können Sie den Log dieses Zweigs lokal über einen der folgenden Wege aufrufen:
$ git log origin/master
$ git log remotes/origin/master
$ git log refs/remotes/origin/master
Sie sind alle gleichwertig, da Git jeden von ihnen zu refs/remotes/origin/master erweitert.
Wenn Sie stattdessen möchten, dass Git jedes Mal nur den master-Zweig herunterlädt und nicht jeden anderen Zweig auf dem Remote-Server, können Sie die Fetch-Zeile ändern, um nur auf diesen Zweig zu verweisen.
fetch = +refs/heads/master:refs/remotes/origin/master
Dies ist nur die Standard-Refspec für git fetch für dieses Remote. Wenn Sie einen einmaligen Fetch durchführen möchten, können Sie die spezifische Refspec auch auf der Befehlszeile angeben. Um den master-Zweig vom Remote lokal nach origin/mymaster zu ziehen, können Sie Folgendes ausführen:
$ git fetch origin master:refs/remotes/origin/mymaster
Sie können auch mehrere Refspecs angeben. Auf der Befehlszeile können Sie mehrere Zweige wie folgt herunterladen:
$ git fetch origin master:refs/remotes/origin/mymaster \
topic:refs/remotes/origin/topic
From git@github.com:schacon/simplegit
! [rejected] master -> origin/mymaster (non fast forward)
* [new branch] topic -> origin/topic
In diesem Fall wurde der Abruf des master-Zweigs abgelehnt, da er nicht als Fast-Forward-Referenz aufgeführt war. Sie können dies überschreiben, indem Sie das + vor der Refspec angeben.
Sie können auch mehrere Refspecs für das Abrufen in Ihrer Konfigurationsdatei angeben. Wenn Sie immer die master- und experiment-Zweige vom origin-Remote abrufen möchten, fügen Sie zwei Zeilen hinzu:
[remote "origin"]
url = https://github.com/schacon/simplegit-progit
fetch = +refs/heads/master:refs/remotes/origin/master
fetch = +refs/heads/experiment:refs/remotes/origin/experiment
Seit Git 2.6.0 können Sie partielle Globs im Muster verwenden, um mehrere Zweige abzugleichen. Daher funktioniert dies:
fetch = +refs/heads/qa*:refs/remotes/origin/qa*
Noch besser ist es, Namespaces (oder Verzeichnisse) zu verwenden, um dasselbe mit mehr Struktur zu erreichen. Wenn Sie ein QA-Team haben, das eine Reihe von Zweigen pusht, und Sie den master-Zweig und alle Zweige des QA-Teams erhalten möchten, aber nichts anderes, können Sie einen Konfigurationsabschnitt wie diesen verwenden:
[remote "origin"]
url = https://github.com/schacon/simplegit-progit
fetch = +refs/heads/master:refs/remotes/origin/master
fetch = +refs/heads/qa/*:refs/remotes/origin/qa/*
Wenn Sie einen komplexen Workflow-Prozess haben, bei dem ein QA-Team Zweige pusht, Entwickler Zweige pushen und Integrationsteams an Remote-Zweigen pushen und zusammenarbeiten, können Sie diese auf diese Weise einfach in Namespaces aufteilen.
Pushing Refspecs
Es ist schön, dass Sie auf diese Weise Namespaced-Referenzen abrufen können, aber wie gelangen die Zweige des QA-Teams überhaupt in einen qa/-Namespace? Dies erreichen Sie durch die Verwendung von Refspecs zum Pushen.
Wenn das QA-Team seinen master-Zweig nach qa/master auf dem Remote-Server pushen möchte, kann es Folgendes ausführen:
$ git push origin master:refs/heads/qa/master
Wenn es möchte, dass Git dies jedes Mal automatisch ausführt, wenn es git push origin ausführt, kann es der Konfigurationsdatei einen push-Wert hinzufügen:
[remote "origin"]
url = https://github.com/schacon/simplegit-progit
fetch = +refs/heads/*:refs/remotes/origin/*
push = refs/heads/master:refs/heads/qa/master
Auch dies führt dazu, dass ein git push origin den lokalen master-Zweig standardmäßig zum Remote qa/master pusht.
|
Hinweis
|
Sie können die Refspec nicht verwenden, um aus einem Repository abzurufen und in ein anderes zu pushen. Ein Beispiel dafür finden Sie unter Halten Sie Ihr öffentliches GitHub-Repository auf dem neuesten Stand. |
Referenzen löschen
Sie können die Refspec auch verwenden, um Referenzen vom Remote-Server zu löschen, indem Sie etwas wie das Folgende ausführen:
$ git push origin :topic
Da die Refspec <src>:<dst> ist, wird durch Weglassen des <src>-Teils im Wesentlichen gesagt, dass der topic-Zweig auf dem Remote leer sein soll, was ihn löscht.
Oder Sie können die neuere Syntax verwenden (verfügbar seit Git v1.7.0)
$ git push origin --delete topic