inus Torvalds begann mit der Entwicklung von Git, um die Quellen des Linux-Kernels zu verwalten. Heute ist es das meistverwendete Versionskontrollsystem für Open-Source-Software und erfreut sich auch im Firmenumfeld großer Beliebtheit.
Das vorliegende Buch führt Sie auch in dieser aktualisierten, 2. Auflage fundiert und mit zahlreichen Beispielen in die Benutzung von Git und alle relevanten Techniken ein, die im täglichen Umgang mit der Versionsverwaltung zum Einsatz kommen. Sie lernen die Modellierung eines Repositorys als Graph von Commits und damit die Grundlage für fortgeschrittene Konzepte kennen: Merge-Strategien, automatisierte Fehlersuche, Umstiegsszenarien (Subversion-Migration zu Git). Hinzu kommen die Besonderheiten dezentraler Arbeitsabläufe und deren Einfluss auf den Workflow von Projekten.
Umfang der Darstellung und Erfahrung der beiden Autoren machen das Buch zu einer unverzichtbaren Hilfe bei der Arbeit mit der modernen Versionsverwaltungssoftware. Quelle: Verlagstext
/ AUS DEM INHALT: / / /
Inhaltsverzeichnis:
I Grundlagen 17
1 Einführung und erste Schritte 19
1.1 Grundbegriffe 19
1.2 Erste Schritte mit Git 22
1.2.1 Das erste Repository 22
1.2.2 Der erste Commit 23
1.2.3 Commits einsehen 25
1.3 Git konfigurieren 27
1.3.1 Git Aliase 28
1.3.2 Farbe einstellen 29
1.3.3 Zeichensätze einstellen 29
1.3.4 Zeilenenden einstellen 30
1.3.5 Editor, Pager und Browser einstellen 30
1.3.6 Konfiguration über Umgebungsvariablen 31
1.3.7 Automatische Fehlerkorrektur 32
2 Grundlagen 33
2.1 Git-Kommandos 33
2.1.1 Index 34
2.1.2 Commits schrittweise erstellen 36
3
2.1.3 Commits erstellen 41
2.1.4 Dateien verschieben und löschen 44
2.1.5 grep auf einem Repository 45
2.1.6 Die Projektgeschichte untersuchen 46
2.1.7 Commit-Ranges 49
2.1.8 Unterschiede zwischen Commits 50
2.2 Das Objektmodell 50
2.2.1 SHA-1 - der sichere Hash-Algorithmus 51
2.2.2 Die Git-Objekte 52
2.2.3 Die Objektdatenbank 54
2.2.4 Die Objektdatenbank untersuchen 55
2.2.5 Deduplication 57
2.2.6 Die Graph-Struktur 58
3 Praktische Versionsverwaltung 61
3.1 Referenzen: Branches und Tags 61
3.1.1 HEAD und andere symbolische Referenzen 64
3.1.2 Branches verwalten 66
3.1.3 Tags - Wichtige Versionen markieren 70
3.2 Versionen wiederherstellen 76
3.2.1 Detached HEAD 77
3.2.2 Commits rückgängig machen 78
3.2.3 Reset und der Index 80
3.3 Branches zusammenführen: Merges 82
3.3.1 Zwei Branches verschmelzen 83
3.3.2 Fast-Forward-Merges: Einen Branch vorspulen 85
3.3.3 Merge-Strategien 87
3.3.4 Optionen für die recursive-Strategie 89
3.4 Merge-Konflikte lösen 90
3.4.1 Hilfe beim Merge: mergetool 95
4
3.4.2 rerere: Reuse Recorded Resolution 96
3.4.3 Konflikte vermeiden 98
3.5 Einzelne Commits übernehmen: Cherry-Pick 100
3.6 Visualisierung von Repositories 101
3.6.1 Revision Parameters 101
3.6.2 Gitk 104
3.7 Reflog 106
4 Fortgeschrittene Konzepte 109
4.1 Commits verschieben - Rebase 109
4.1.1 Ein Beispiel 111
4.1.2 Erweiterte Syntax und Konflikte 112
4.1.3 Warum Rebase sinnvoll ist 113
4.1.4 Wann Rebase nicht sinnvoll ist - Rebase vsMerge 114
4.1.5 Ein Wort der Warnung 115
4.1.6 Code-Dopplungen vermeiden 116
4.1.7 Patch-Stacks verwalten 116
4.1.8 Rebase einschränken mit -onto 117
4.1.9 Einen Commit verbessern 118
4.1.10 Rebase feinjustieren 118
4.2 Die Geschichte umschreiben - Interaktives Rebase 120
4.2.1 Kleine Fehler korrigieren: Bug Squashing 122
4.2.2 Commits beliebig editieren 123
4.3 Wer hat diese Änderungen gemacht? - git blame 125
4.3.1 Blame grafisch 126
4.4 Dateien ignorieren 127
4.4.1 Syntax für Muster 127
4.4.2 Nachträglich ignorieren oder versionieren 129
4.4.3 Ignorierte und unbekannte Dateien löschen 129
4.5 Veränderungen auslagern - git stash 130
5
4.5.1 Grundlegende Benutzung 130
4.5.2 Konflikte lösen 131
4.5.3 Wenn Sie den Stash nicht anwenden können 131
4.5.4 Nachricht anpassen 132
4.5.5 Stashes einsehen 133
4.5.6 Stashes löschen 134
4.5.7 Wie ist der Stash implementiert? 134
4.6 Commits annotieren - git notes 135
4.7 Mehrere Root-Commits 137
4.8 Regressionen finden - git bisect 138
4.8.1 Benutzung 139
4.8.2 Automatisierung 139
5 Verteiltes Git 141
5.1 Wie funktioniert verteilte Versionsverwaltung? 142
5.2 Repositories klonen 143
5.2.1 Repository-URLs 145
5.2.2 Remote-Tracking-Branches 146
5.3 Commits herunterladen 148
5.3.1 git fetch 149
5.3.2 git pull 152
5.3.3 git fetch vsgit pull 155
5.4 Commits hochladen: git push 158
5.4.1 Remote-Referenzen löschen 160
5.4.2 Push ohne Argumente: push.default 160
5.4.3 Konfiguration des Upstream-Branches 161
5.5 Remotes untersuchen 162
5.5.1 Zusammenfassung eines Remotes 162
5.5.2 Vergleich mit dem Upstream 163
5.6 Verteilter Workflow mit mehreren Remotes 164
5.7 Remotes verwalten 165
5.7.1 Pull-Request 166
5.8 Tags austauschen 167
5.8.1 Tags herunterladen 167
5.8.2 Tags hochladen 168
5.9 Patches per E-Mail 169
5.9.1 Patches exportieren 170
5.9.2 Patches versenden 172
5.9.3 Patches einpflegen 174
5.10 Ein verteilter, hierarchischer Workflow 176
5.11 Unterprojekte verwalten 177
5.11.1 Submodules 178
5.11.2 Subtrees 180
5.11.3 Submodules vsSubtrees 182
6 Workflows 185
6.1 Anwender 186
6.2 Ein Branching-Modell 188
6.3 Releases-Management 192
6.3.1 Aufgaben sondieren 192
6.3.2 Release erstellen 194
II Fortgeschrittene Szenarien 199
7 Git auf dem Server 201
7.1 Einen Git-Server hosten 201
7.1.1 Das Git-Protokoll 202
7.1.2 Repositories auf dem gleichen Rechner 203
7.1.3 Bare Repositories - Repositories ohne Working Tree ..203
7.1.4 Zugriffsrechte eines Repositorys 204
7.1.5 Zugriff per SSH: Die Git-Shell 204
7.1.6 Zugriff per SSH: Öffentliche Schlüssel 205
7.1.7 Beispiel: Zwei Nutzer wollen kollaborieren 205
7.2 Gitolite: Git einfach hosten 206
7.2.1 Gitolite installieren 207
7.2.2 Gitolite-Konfiguration 208
7.2.3 Eigentümer und Beschreibung 210
7.2.4 Zugriffsrechte auf Datei- oder Branch-Ebene 210
7.2.5 Persönliche Namespaces 212
7.2.6 Zugriffsregelung auf Dateiebene 212
7.2.7 Aktionen explizit verbieten 213
7.2.8 Sollte man Policies forcieren? 214
7.3 Git-Daemon: Anonymer, lesender Zugriff 214
7.3.1 Git-Daemon und Inetd 215
7.3.2 Der Debian-Weg: Git-Daemon sv 216
7.3.3 Der Git-Daemon auf einem Produktivsystem 217
7.3.4 Über Gitolite exportierbare Repositories festlegen 218
7.4 Gitweb: Das integrierte Web-Frontend 219
7.4.1 Gitweb global installieren 219
7.4.2 Gitweb und Apache 221
7.4.3 Gitweb und Lighttpd 221
7.5 CGit - CGI for Git 222
7.5.1 CGit und Apache und Lighttpd 223
7.5.2 Konfiguration 224
7.5.3 Einzelne Repositories speziell konfigurieren 226
7.5.4 Caching ausnutzen 227
8 Git automatisieren 229
8.1 Git-Attribute - Dateien gesondert behandeln 230
8.1.1 Filter: Smudge und Clean 231
8.1.2 Keywords in Dateien 231
8.1.3 Eigene Diff-Programme 233
8.2 Hooks 236
8.2.1 Commits 237
8.2.2 Serverseitig 239
8.2.3 Patches anwenden 242
8.2.4 Sonstige Hooks 242
8.3 Eigene Git-Kommandos schreiben 244
8.3.1 Initialisierung 245
8.3.2 Position im Repository 246
8.3.3 Referenzen auflisten: rev-list 247
8.3.4 Änderungen finden 248
8.3.5 Die Objektdatenbank und rev-parse 249
8.3.6 Referenzen iterieren: for-each-ref 252
8.3.7 Referenzen umschreiben: git update-ref 254
8.3.8 Erweiterte Aliase 255
8.4 Versionsgeschichte umschreiben 256
8.4.1 Sensitive Informationen nachträglich entfernen 258
8.4.2 Unterverzeichnis extrahieren 260
8.4.3 Grafts: Nachträgliche Merges 261
8.4.4 Alte Commits löschen 262
9 Zusammenspiel mit anderen Versionsverwaltungssystemen 265
9.1 Subversion 266
9.1.1 Konvertierung 267
9.1.2 Bidirektionale Kommunikation 277
9.2 Eigene Importer 284
III Anhang 289
A Installation 291
A.1 Linux 291
A.1.1 Debian/Ubuntu 291
A.1.2 Fedora 292
A.1.3 Gentoo 293
A.1.4 Installation aus den Quellen 293
A.2 Mac OS X 294
A3 Windows 294
B Struktur eines Repositorys 295
B1 Aufräumen 297
B2 Performance 298
C Shell-Integration 301
C1 Git und die Bash 302
C.1.1 Completion 302
C.1.2 Prompt 304
C.2 Git und die Z-Shell 307
C.2.1 Completion 307
C.2.2 Prompt 310
D Github 315
Index 323
10