-
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
7.10 Git-Werkzeuge - Debugging mit Git
Debugging mit Git
Neben seiner primären Funktion als Versionskontrolle bietet Git auch einige Befehle, die Ihnen bei der Fehlersuche in Ihren Quellcode-Projekten helfen. Da Git dafür ausgelegt ist, nahezu jede Art von Inhalt zu verwalten, sind diese Werkzeuge ziemlich generisch, können Ihnen aber oft helfen, einen Fehler oder dessen Urheber zu finden, wenn etwas schiefgeht.
Datei-Annotation
Wenn Sie einen Fehler in Ihrem Code finden und wissen möchten, wann und warum er eingeführt wurde, ist die Datei-Annotation oft Ihr bestes Werkzeug. Sie zeigt Ihnen, welcher Commit die letzte Änderung an jeder Zeile einer Datei vorgenommen hat. Wenn Sie also feststellen, dass eine Methode in Ihrem Code fehlerhaft ist, können Sie die Datei mit git blame annotieren, um festzustellen, welcher Commit für die Einführung dieser Zeile verantwortlich war.
Das folgende Beispiel verwendet git blame, um festzustellen, welcher Commit und welcher Committer für die Zeilen in der obersten Ebene des Linux-Kernel-Makefile verantwortlich war, und verwendet weiter die Option -L, um die Ausgabe der Annotation auf die Zeilen 69 bis 82 dieser Datei zu beschränken.
$ git blame -L 69,82 Makefile
b8b0618cf6fab (Cheng Renquan 2009-05-26 16:03:07 +0800 69) ifeq ("$(origin V)", "command line")
b8b0618cf6fab (Cheng Renquan 2009-05-26 16:03:07 +0800 70) KBUILD_VERBOSE = $(V)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 71) endif
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 72) ifndef KBUILD_VERBOSE
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 73) KBUILD_VERBOSE = 0
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 74) endif
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 75)
066b7ed955808 (Michal Marek 2014-07-04 14:29:30 +0200 76) ifeq ($(KBUILD_VERBOSE),1)
066b7ed955808 (Michal Marek 2014-07-04 14:29:30 +0200 77) quiet =
066b7ed955808 (Michal Marek 2014-07-04 14:29:30 +0200 78) Q =
066b7ed955808 (Michal Marek 2014-07-04 14:29:30 +0200 79) else
066b7ed955808 (Michal Marek 2014-07-04 14:29:30 +0200 80) quiet=quiet_
066b7ed955808 (Michal Marek 2014-07-04 14:29:30 +0200 81) Q = @
066b7ed955808 (Michal Marek 2014-07-04 14:29:30 +0200 82) endif
Beachten Sie, dass das erste Feld die partielle SHA-1-Signatur des Commits ist, der diese Zeile zuletzt geändert hat. Die nächsten beiden Felder sind Werte, die aus diesem Commit extrahiert wurden – der Name des Autors und das Datum der Autorenschaft dieses Commits –, sodass Sie leicht sehen können, wer diese Zeile wann geändert hat. Danach folgen die Zeilennummer und der Inhalt der Datei. Beachten Sie auch die Commit-Zeilen ^1da177e4c3f4, wobei das ^-Präfix Zeilen kennzeichnet, die im ersten Commit des Repositorys eingeführt wurden und seitdem unverändert geblieben sind. Das ist etwas verwirrend, da Sie nun mindestens drei verschiedene Arten gesehen haben, wie Git das ^ verwendet, um eine Commit-SHA-1-Signatur zu modifizieren, aber genau das bedeutet es hier.
Eine weitere coole Sache an Git ist, dass es keine expliziten Dateiumbenennungen verfolgt. Es speichert die Snapshots und versucht dann im Nachhinein implizit zu ermitteln, was umbenannt wurde. Eine interessante Funktion davon ist, dass Sie es bitten können, alle Arten von Codebewegungen zu ermitteln. Wenn Sie -C an git blame übergeben, analysiert Git die Datei, die Sie annotieren, und versucht herauszufinden, woher Codefragmente ursprünglich stammen, wenn sie von anderswo kopiert wurden. Sagen wir zum Beispiel, Sie refaktorieren eine Datei namens GITServerHandler.m in mehrere Dateien, eine davon ist GITPackUpload.m. Indem Sie GITPackUpload.m mit der Option -C „blamen“, können Sie sehen, woher Codeabschnitte ursprünglich stammen.
$ git blame -C -L 141,153 GITPackUpload.m
f344f58d GITServerHandler.m (Scott 2009-01-04 141)
f344f58d GITServerHandler.m (Scott 2009-01-04 142) - (void) gatherObjectShasFromC
f344f58d GITServerHandler.m (Scott 2009-01-04 143) {
70befddd GITServerHandler.m (Scott 2009-03-22 144) //NSLog(@"GATHER COMMI
ad11ac80 GITPackUpload.m (Scott 2009-03-24 145)
ad11ac80 GITPackUpload.m (Scott 2009-03-24 146) NSString *parentSha;
ad11ac80 GITPackUpload.m (Scott 2009-03-24 147) GITCommit *commit = [g
ad11ac80 GITPackUpload.m (Scott 2009-03-24 148)
ad11ac80 GITPackUpload.m (Scott 2009-03-24 149) //NSLog(@"GATHER COMMI
ad11ac80 GITPackUpload.m (Scott 2009-03-24 150)
56ef2caf GITServerHandler.m (Scott 2009-01-05 151) if(commit) {
56ef2caf GITServerHandler.m (Scott 2009-01-05 152) [refDict setOb
56ef2caf GITServerHandler.m (Scott 2009-01-05 153)
Das ist wirklich nützlich. Normalerweise erhalten Sie als ursprünglichen Commit den Commit, bei dem Sie den Code kopiert haben, da dies das erste Mal ist, dass Sie diese Zeilen in dieser Datei berührt haben. Git teilt Ihnen den ursprünglichen Commit mit, bei dem Sie diese Zeilen geschrieben haben, auch wenn sie in einer anderen Datei waren.
Binäre Suche
Das Annotieren einer Datei hilft, wenn Sie von Anfang an wissen, wo das Problem liegt. Wenn Sie nicht wissen, was kaputt ist, und seit dem letzten bekannten funktionierenden Zustand Dutzende oder Hunderte von Commits stattgefunden haben, werden Sie wahrscheinlich git bisect zu Hilfe nehmen. Der Befehl bisect führt eine binäre Suche durch Ihre Commit-Historie durch, um Ihnen so schnell wie möglich zu helfen, zu identifizieren, welcher Commit ein Problem eingeführt hat.
Nehmen wir an, Sie haben gerade eine Veröffentlichung Ihres Codes in einer Produktionsumgebung vorgenommen, erhalten Fehlerberichte über etwas, das in Ihrer Entwicklungsumgebung nicht auftrat, und Sie können sich nicht vorstellen, warum der Code das tut. Sie gehen zurück zu Ihrem Code und stellen fest, dass Sie das Problem reproduzieren können, aber nicht herausfinden können, was schiefgeht. Sie können den Code mit bisect untersuchen. Zuerst führen Sie git bisect start aus, um loszulegen, und dann verwenden Sie git bisect bad, um dem System mitzuteilen, dass der aktuelle Commit, auf dem Sie sich befinden, fehlerhaft ist. Dann müssen Sie Bisect mitteilen, wann der letzte bekannte gute Zustand war, indem Sie git bisect good <guter_commit> verwenden.
$ git bisect start
$ git bisect bad
$ git bisect good v1.0
Bisecting: 6 revisions left to test after this
[ecb6e1bc347ccecc5f9350d878ce677feb13d3b2] Error handling on repo
Git hat festgestellt, dass etwa 12 Commits zwischen dem Commit, den Sie als letzten guten Commit markiert haben (v1.0), und der aktuellen fehlerhaften Version liegen, und hat den mittleren für Sie ausgecheckt. An dieser Stelle können Sie Ihren Test ausführen, um zu sehen, ob das Problem bei diesem Commit besteht. Wenn ja, wurde es irgendwann vor diesem mittleren Commit eingeführt; wenn nicht, wurde das Problem irgendwann nach dem mittleren Commit eingeführt. Es stellt sich heraus, dass hier kein Problem vorliegt, und Sie teilen Git dies mit, indem Sie git bisect good eingeben und Ihre Reise fortsetzen.
$ git bisect good
Bisecting: 3 revisions left to test after this
[b047b02ea83310a70fd603dc8cd7a6cd13d15c04] Secure this thing
Jetzt sind Sie bei einem anderen Commit, auf halbem Weg zwischen dem gerade getesteten und Ihrem fehlerhaften Commit. Sie führen Ihren Test erneut aus und stellen fest, dass dieser Commit fehlerhaft ist. Sie teilen Git dies mit git bisect bad mit.
$ git bisect bad
Bisecting: 1 revisions left to test after this
[f71ce38690acf49c1f3c9bea38e09d82a5ce6014] Drop exceptions table
Dieser Commit ist in Ordnung, und nun hat Git alle Informationen, die es benötigt, um festzustellen, wo das Problem eingeführt wurde. Es zeigt Ihnen die SHA-1-Signatur des ersten fehlerhaften Commits und einige Commit-Informationen sowie welche Dateien in diesem Commit geändert wurden, damit Sie herausfinden können, was passiert ist, das diesen Fehler eingeführt haben könnte.
$ git bisect good
b047b02ea83310a70fd603dc8cd7a6cd13d15c04 is first bad commit
commit b047b02ea83310a70fd603dc8cd7a6cd13d15c04
Author: PJ Hyett <pjhyett@example.com>
Date: Tue Jan 27 14:48:32 2009 -0800
Secure this thing
:040000 040000 40ee3e7821b895e52c1695092db9bdc4c61d1730
f24d3c6ebcfc639b1a3814550e62d60b8e68a8e4 M config
Wenn Sie fertig sind, sollten Sie git bisect reset ausführen, um Ihren HEAD auf den Zustand zurückzusetzen, in dem Sie sich vor dem Start befanden, da Sie sonst in einem seltsamen Zustand landen.
$ git bisect reset
Dies ist ein leistungsfähiges Werkzeug, das Ihnen helfen kann, Hunderte von Commits in wenigen Minuten auf einen eingeführten Fehler zu überprüfen. Tatsächlich können Sie git bisect vollständig automatisieren, wenn Sie ein Skript haben, das 0 zurückgibt, wenn das Projekt gut ist, oder einen Wert ungleich 0, wenn das Projekt fehlerhaft ist. Zuerst teilen Sie ihm erneut den Umfang des Bisecting mit, indem Sie die bekannten fehlerhaften und guten Commits angeben. Dies können Sie tun, indem Sie sie mit dem Befehl bisect start auflisten, wenn Sie möchten, wobei Sie den bekannten fehlerhaften Commit zuerst und den bekannten guten Commit als zweiten angeben.
$ git bisect start HEAD v1.0
$ git bisect run test-error.sh
Dadurch wird test-error.sh automatisch für jeden ausgecheckten Commit ausgeführt, bis Git den ersten fehlerhaften Commit gefunden hat. Sie können auch etwas wie make oder make tests oder was auch immer Sie haben, das automatisierte Tests für Sie ausführt, ausführen.