-
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
4.1 Git auf dem Server - Die Protokolle
An diesem Punkt sollten Sie in der Lage sein, die meisten alltäglichen Aufgaben, für die Sie Git verwenden werden, zu erledigen. Um jedoch überhaupt zusammenarbeiten zu können, benötigen Sie ein entferntes Git-Repository. Obwohl Sie technisch gesehen Änderungen von und zu den Repositories einzelner Personen übertragen können, wird davon abgeraten, da Sie leicht verwechseln können, woran sie arbeiten, wenn Sie nicht vorsichtig sind. Darüber hinaus möchten Sie, dass Ihre Mitarbeiter auch dann auf das Repository zugreifen können, wenn Ihr Computer offline ist – ein zuverlässigeres gemeinsames Repository ist oft nützlich. Daher ist die bevorzugte Methode zur Zusammenarbeit mit jemandem die Einrichtung eines Zwischen-Repositories, auf das Sie beide Zugriff haben, und von dem Sie übertragen und abrufen.
Das Betreiben eines Git-Servers ist ziemlich unkompliziert. Zuerst wählen Sie aus, welche Protokolle Ihr Server unterstützen soll. Der erste Abschnitt dieses Kapitels behandelt die verfügbaren Protokolle und deren Vor- und Nachteile. Die nächsten Abschnitte erklären einige typische Setups mit diesen Protokollen und wie Sie Ihren Server damit zum Laufen bringen. Zuletzt gehen wir einige gehostete Optionen durch, falls es Ihnen nichts ausmacht, Ihren Code auf dem Server eines anderen zu hosten, und Sie sich nicht mit dem Aufwand des Einrichtens und Wartens Ihres eigenen Servers befassen möchten.
Wenn Sie kein Interesse daran haben, Ihren eigenen Server zu betreiben, können Sie zum letzten Abschnitt des Kapitels springen, um einige Optionen für die Einrichtung eines gehosteten Kontos zu sehen, und dann zum nächsten Kapitel übergehen, in dem wir die verschiedenen Details der Arbeit in einer verteilten Quellcode-Umgebung besprechen.
Ein entferntes Repository ist im Allgemeinen ein Bare Repository – ein Git-Repository ohne Arbeitsverzeichnis. Da das Repository nur als Kollaborationspunkt verwendet wird, gibt es keinen Grund, einen Schnappschuss auf der Festplatte ausgecheckt zu haben; es sind nur die Git-Daten. Vereinfacht ausgedrückt ist ein Bare Repository der Inhalt des .git-Verzeichnisses Ihres Projekts und nichts weiter.
Die Protokolle
Git kann vier verschiedene Protokolle zum Übertragen von Daten verwenden: Lokal, HTTP, Secure Shell (SSH) und Git. Hier werden wir diskutieren, was sie sind und unter welchen grundlegenden Umständen Sie sie verwenden möchten (oder nicht).
Lokales Protokoll
Das grundlegendste ist das lokale Protokoll, bei dem sich das entfernte Repository in einem anderen Verzeichnis auf demselben Host befindet. Dies wird oft verwendet, wenn alle in Ihrem Team Zugriff auf ein gemeinsames Dateisystem wie ein NFS-Mount haben, oder in dem unwahrscheinlicheren Fall, dass sich alle auf demselben Computer anmelden. Letzteres wäre nicht ideal, da alle Ihre Code-Repository-Instanzen auf demselben Computer liegen würden, was einen katastrophalen Verlust viel wahrscheinlicher macht.
Wenn Sie ein gemeinsames gemountetes Dateisystem haben, können Sie von einem lokalen dateibasierten Repository klonen, dorthin übertragen und daraus abrufen. Um ein Repository wie dieses zu klonen oder es als Remote zu einem bestehenden Projekt hinzuzufügen, verwenden Sie den Pfad zum Repository als URL. Um beispielsweise ein lokales Repository zu klonen, können Sie Folgendes ausführen:
$ git clone /srv/git/project.git
Oder Sie können dies tun
$ git clone file:///srv/git/project.git
Git verhält sich etwas anders, wenn Sie explizit file:// am Anfang der URL angeben. Wenn Sie nur den Pfad angeben, versucht Git, Hardlinks zu verwenden oder die benötigten Dateien direkt zu kopieren. Wenn Sie file:// angeben, startet Git die Prozesse, die es normalerweise zum Übertragen von Daten über ein Netzwerk verwendet, was im Allgemeinen viel weniger effizient ist. Der Hauptgrund für die Angabe des file://-Präfixes ist, wenn Sie eine saubere Kopie des Repositorys mit unnötigen Referenzen oder Objekten wünschen – im Allgemeinen nach einem Import aus einem anderen VCS oder etwas Ähnlichem (siehe Git Internals für Wartungsaufgaben). Wir werden hier den normalen Pfad verwenden, da dies fast immer schneller ist.
Um ein lokales Repository zu einem bestehenden Git-Projekt hinzuzufügen, können Sie Folgendes ausführen:
$ git remote add local_proj /srv/git/project.git
Dann können Sie über Ihren neuen Remote-Namen local_proj von und zu diesem Remote übertragen und abrufen, als würden Sie dies über ein Netzwerk tun.
Die Vorteile
Die Vorteile von dateibasierten Repositories sind, dass sie einfach sind und vorhandene Dateiberechtigungen und Netzwerkzugriff nutzen. Wenn Sie bereits ein gemeinsam genutztes Dateisystem haben, auf das Ihr gesamtes Team Zugriff hat, ist die Einrichtung eines Repositorys sehr einfach. Sie legen die Bare-Repository-Kopie irgendwo ab, auf das alle gemeinsamen Zugriff haben, und legen die Lese-/Schreibberechtigungen fest, wie Sie es für jedes andere gemeinsam genutzte Verzeichnis tun würden. Wir werden in Getting Git on a Server besprechen, wie eine Bare-Repository-Kopie für diesen Zweck exportiert wird.
Dies ist auch eine gute Option, um schnell Arbeiten aus dem Arbeitsverzeichnis eines anderen zu holen. Wenn Sie und ein Kollege am selben Projekt arbeiten und er möchte, dass Sie etwas überprüfen, ist die Ausführung eines Befehls wie git pull /home/john/project oft einfacher, als wenn er zu einem entfernten Server überträgt und Sie dann von dort abrufen.
Die Nachteile
Die Nachteile dieser Methode sind, dass der gemeinsame Zugriff im Allgemeinen schwieriger einzurichten und von mehreren Standorten aus zu erreichen ist als einfacher Netzwerkzugriff. Wenn Sie von Ihrem Laptop aus übertragen möchten, wenn Sie zu Hause sind, müssen Sie die entfernte Festplatte einhängen, was im Vergleich zum netzwerkbasierten Zugriff schwierig und langsam sein kann.
Es ist wichtig zu erwähnen, dass dies nicht unbedingt die schnellste Option ist, wenn Sie eine Art von gemeinsam genutztem Mount verwenden. Ein lokales Repository ist nur schnell, wenn Sie schnellen Zugriff auf die Daten haben. Ein Repository auf NFS ist oft langsamer als das Repository über SSH auf demselben Server, wodurch Git lokale Festplatten auf jedem System nutzen kann.
Schließlich schützt dieses Protokoll das Repository nicht vor versehentlicher Beschädigung. Jeder Benutzer hat vollen Shell-Zugriff auf das "entfernte" Verzeichnis, und nichts hindert ihn daran, interne Git-Dateien zu ändern oder zu entfernen und das Repository zu beschädigen.
Die HTTP-Protokolle
Git kann über HTTP in zwei verschiedenen Modi kommunizieren. Vor Git 1.6.6 gab es nur eine Möglichkeit, dies zu tun, die sehr einfach und im Allgemeinen schreibgeschützt war. In Version 1.6.6 wurde ein neues, intelligenteres Protokoll eingeführt, bei dem Git Datenübertragungen intelligent verhandeln konnte, ähnlich wie bei SSH. In den letzten Jahren ist dieses neue HTTP-Protokoll sehr beliebt geworden, da es für den Benutzer einfacher und intelligenter in der Kommunikation ist. Die neuere Version wird oft als Smart HTTP-Protokoll und die ältere als Dumb HTTP bezeichnet. Wir werden zuerst das neuere Smart HTTP-Protokoll behandeln.
Smart HTTP
Smart HTTP funktioniert sehr ähnlich wie die SSH- oder Git-Protokolle, läuft jedoch über Standard-HTTPS-Ports und kann verschiedene HTTP-Authentifizierungsmechanismen verwenden, was bedeutet, dass es für den Benutzer oft einfacher ist als etwas wie SSH, da Sie z. B. die Authentifizierung mit Benutzername/Passwort verwenden können, anstatt SSH-Schlüssel einrichten zu müssen.
Es ist wahrscheinlich die beliebteste Art geworden, Git jetzt zu verwenden, da es so eingerichtet werden kann, dass es anonym wie das git://-Protokoll bedient, und auch mit Authentifizierung und Verschlüsselung wie das SSH-Protokoll übertragen werden kann. Anstatt verschiedene URLs für diese Dinge einrichten zu müssen, können Sie jetzt eine einzige URL für beides verwenden. Wenn Sie versuchen zu übertragen, und das Repository eine Authentifizierung benötigt (was es normalerweise tun sollte), kann der Server nach einem Benutzernamen und Passwort fragen. Dasselbe gilt für den Lesezugriff.
Tatsächlich ist für Dienste wie GitHub die URL, die Sie zum Anzeigen des Repositorys online verwenden (z. B. https://github.com/schacon/simplegit), dieselbe URL, die Sie zum Klonen und, wenn Sie Zugriff haben, zum Übertragen verwenden können.
Dumb HTTP
Wenn der Server keine Git-HTTP-Smart-Dienst-Antwort sendet, versucht der Git-Client, auf das einfachere Dumb HTTP-Protokoll zurückzufallen. Das Dumb-Protokoll erwartet, dass das Bare-Git-Repository wie normale Dateien vom Webserver bereitgestellt wird. Die Schönheit von Dumb HTTP liegt in der Einfachheit der Einrichtung. Grundsätzlich müssen Sie nur ein Bare-Git-Repository unter Ihrem HTTP-Dokumenten-Root platzieren und einen speziellen post-update-Hook einrichten, und Sie sind fertig (siehe Git Hooks). Zu diesem Zeitpunkt kann jeder, der auf den Webserver zugreifen kann, unter dem Sie das Repository platziert haben, auch Ihr Repository klonen. Um den Lesezugriff auf Ihr Repository über HTTP zu ermöglichen, tun Sie Folgendes:
$ cd /var/www/htdocs/
$ git clone --bare /path/to/git_project gitproject.git
$ cd gitproject.git
$ mv hooks/post-update.sample hooks/post-update
$ chmod a+x hooks/post-update
Das ist alles. Der post-update-Hook, der standardmäßig mit Git geliefert wird, führt den entsprechenden Befehl (git update-server-info) aus, um HTTP-Abruf und Klonen korrekt zu machen. Dieser Befehl wird ausgeführt, wenn Sie in dieses Repository übertragen (vielleicht über SSH); dann können andere Personen über etwas wie Folgendes klonen:
$ git clone https://example.com/gitproject.git
In diesem speziellen Fall verwenden wir den Pfad /var/www/htdocs, der für Apache-Setups üblich ist, aber Sie können jeden statischen Webserver verwenden – platzieren Sie einfach das Bare-Repository in seinem Pfad. Die Git-Daten werden als einfache statische Dateien bereitgestellt (siehe das Kapitel Git Internals für Details, wie sie genau bereitgestellt werden).
Im Allgemeinen würden Sie entweder einen Lese-/Schreib-Smart-HTTP-Server betreiben oder die Dateien einfach im Dumb-Modus als schreibgeschützt zugänglich machen. Es ist selten, eine Mischung aus beiden Diensten zu betreiben.
Die Vorteile
Wir konzentrieren uns auf die Vorteile der Smart-Version des HTTP-Protokolls.
Die Einfachheit, eine einzige URL für alle Arten von Zugriff zu haben, und dass der Server nur dann zur Authentifizierung auffordert, wenn dies erforderlich ist, macht die Dinge für den Endbenutzer sehr einfach. Die Möglichkeit, sich mit Benutzername und Passwort zu authentifizieren, ist ebenfalls ein großer Vorteil gegenüber SSH, da Benutzer keine SSH-Schlüssel lokal generieren und ihren öffentlichen Schlüssel auf den Server hochladen müssen, bevor sie damit interagieren können. Für weniger anspruchsvolle Benutzer oder Benutzer auf Systemen, auf denen SSH weniger verbreitet ist, ist dies ein erheblicher Vorteil in Bezug auf die Benutzerfreundlichkeit. Es ist auch ein sehr schnelles und effizientes Protokoll, ähnlich dem SSH-Protokoll.
Sie können Ihre Repositories auch schreibgeschützt über HTTPS bereitstellen, was bedeutet, dass Sie die Inhaltsübertragung verschlüsseln können; oder Sie können bis zum Äußersten gehen und die Clients dazu bringen, spezifische signierte SSL-Zertifikate zu verwenden.
Ein weiterer Vorteil ist, dass HTTP und HTTPS so häufig verwendete Protokolle sind, dass Unternehmensfirewalls oft so eingerichtet sind, dass sie den Datenverkehr über ihre Ports zulassen.
Die Nachteile
Git über HTTPS kann auf einigen Servern etwas komplizierter einzurichten sein als SSH. Abgesehen davon gibt es sehr wenige Vorteile, die andere Protokolle gegenüber Smart HTTP für die Bereitstellung von Git-Inhalten haben.
Wenn Sie HTTP für die authentifizierte Übertragung verwenden, ist die Angabe Ihrer Anmeldedaten manchmal komplizierter als die Verwendung von Schlüsseln über SSH. Es gibt jedoch mehrere Tools zur Zwischenspeicherung von Anmeldeinformationen, die Sie verwenden können, darunter Keychain-Zugriff unter macOS und Credential Manager unter Windows, um dies ziemlich problemlos zu gestalten. Lesen Sie Credential Storage, um zu erfahren, wie Sie die sichere Zwischenspeicherung von HTTP-Passwörtern auf Ihrem System einrichten.
Das SSH-Protokoll
Ein übliches Transportprotokoll für Git bei der Selbst-Hosting ist SSH. Das liegt daran, dass SSH-Zugang zu Servern an den meisten Orten bereits eingerichtet ist – und wenn nicht, ist es einfach zu tun. SSH ist auch ein authentifiziertes Netzwerkprotokoll und, da es allgegenwärtig ist, ist es im Allgemeinen einfach einzurichten und zu verwenden.
Um ein Git-Repository über SSH zu klonen, können Sie eine ssh://-URL wie diese angeben:
$ git clone ssh://[user@]server/project.git
Oder Sie können die kürzere, SCP-ähnliche Syntax für das SSH-Protokoll verwenden:
$ git clone [user@]server:project.git
In beiden obigen Fällen, wenn Sie den optionalen Benutzernamen nicht angeben, nimmt Git an, dass Sie der Benutzer sind, bei dem Sie gerade angemeldet sind.
Die Vorteile
Die Vorteile der Verwendung von SSH sind zahlreich. Erstens ist SSH relativ einfach einzurichten – SSH-Daemons sind alltäglich, viele Netzwerkadministratoren haben Erfahrung mit ihnen, und viele Betriebssystemverteilungen sind mit ihnen eingerichtet oder haben Tools zu ihrer Verwaltung. Als nächstes ist der Zugriff über SSH sicher – die gesamte Datenübertragung ist verschlüsselt und authentifiziert. Zuletzt, ähnlich wie bei HTTPS, Git und lokalen Protokollen, ist SSH effizient und komprimiert die Daten so weit wie möglich, bevor sie übertragen werden.
Die Nachteile
Der negative Aspekt von SSH ist, dass er keinen anonymen Zugriff auf Ihr Git-Repository unterstützt. Wenn Sie SSH verwenden, *müssen* Personen SSH-Zugriff auf Ihre Maschine haben, selbst im schreibgeschützten Modus, was SSH nicht für Open-Source-Projekte geeignet macht, bei denen Leute Ihr Repository einfach nur klonen möchten, um es zu untersuchen. Wenn Sie es nur innerhalb Ihres Unternehmensnetzwerks verwenden, ist SSH möglicherweise das einzige Protokoll, mit dem Sie zu tun haben. Wenn Sie anonymen Lesezugriff auf Ihre Projekte ermöglichen möchten und auch SSH verwenden möchten, müssen Sie SSH für Ihre Übertragungen einrichten, aber etwas anderes für andere zum Abrufen.
Das Git-Protokoll
Schließlich haben wir das Git-Protokoll. Dies ist ein spezieller Daemon, der mit Git geliefert wird; er lauscht auf einem dedizierten Port (9418) und bietet einen Dienst ähnlich dem SSH-Protokoll, jedoch ohne jegliche Authentifizierung oder Kryptografie. Damit ein Repository über das Git-Protokoll bereitgestellt werden kann, müssen Sie eine git-daemon-export-ok-Datei erstellen – der Daemon stellt kein Repository ohne diese Datei bereit –, aber abgesehen davon gibt es keine Sicherheit. Entweder ist das Git-Repository für alle zum Klonen verfügbar oder nicht. Das bedeutet, dass über dieses Protokoll im Allgemeinen nicht übertragen wird. Sie können den Übertragungszugriff aktivieren, aber angesichts des Fehlens von Authentifizierung kann jeder im Internet, der die URL Ihres Projekts findet, zu diesem Projekt übertragen. Es genügt zu sagen, dass dies selten vorkommt.
Die Vorteile
Das Git-Protokoll ist oft das schnellste Netzwerkübertragungsprotokoll. Wenn Sie viel Verkehr für ein öffentliches Projekt bereitstellen oder ein sehr großes Projekt bereitstellen, das keine Benutzerauthentifizierung für den Lesezugriff benötigt, ist es wahrscheinlich, dass Sie einen Git-Daemon einrichten möchten, um Ihr Projekt bereitzustellen. Es verwendet denselben Datenübertragungsmechanismus wie das SSH-Protokoll, jedoch ohne den Overhead für Verschlüsselung und Authentifizierung.
Die Nachteile
Aufgrund des Mangels an TLS oder anderer Kryptografie kann das Klonen über git:// zu einer Schwachstelle für die Ausführung von beliebigem Code führen und sollte daher vermieden werden, es sei denn, Sie wissen, was Sie tun.
-
Wenn Sie
git clone git://example.com/project.gitausführen, kann ein Angreifer, der z. B. Ihren Router kontrolliert, das gerade geklonte Repository modifizieren und bösartigen Code einfügen. Wenn Sie dann den gerade geklonten Code kompilieren/ausführen, führen Sie den bösartigen Code aus. Das Ausführen vongit clone http://example.com/project.gitsollte aus demselben Grund vermieden werden. -
Das Ausführen von
git clone https://example.com/project.gitleidet nicht unter demselben Problem (es sei denn, der Angreifer kann ein TLS-Zertifikat für example.com bereitstellen). Das Ausführen vongit clone git@example.com:project.gitleidet nur dann unter diesem Problem, wenn Sie einen falschen SSH-Schlüssel-Fingerabdruck akzeptieren.
Es gibt auch keine Authentifizierung, d.h. jeder kann das Repository klonen (obwohl das oft genau das ist, was Sie wollen). Es ist auch wahrscheinlich das schwierigste Protokoll einzurichten. Es muss seinen eigenen Daemon ausführen, der eine xinetd- oder systemd-Konfiguration oder ähnliches erfordert, was nicht immer ein Spaziergang ist. Es erfordert auch Firewall-Zugriff auf Port 9418, der kein Standardport ist, den Unternehmensfirewalls immer zulassen. Hinter großen Unternehmensfirewalls wird dieser obskure Port häufig blockiert.