Git

Book description

  • Behandelt die wichtigsten Szenarien und Problemfälle mit Git und wie man sie meistert- Keine umfassende Behandlung aller Git-Befehle (die man in der Praxis sowieso nicht braucht)

Table of contents

  1. Cover
  2. Titel
  3. Impressum
  4. Vorwort
    1. Warum Git?
    2. Ein Buch für professionelle Entwickler
    3. Die Zutaten
    4. Warum Workflows?
    5. Tipps zum Querlesen
    6. Beispiele und Notation
    7. Danksagungen
      1. »Standing on the Shoulders of Giants«
      2. Über die Autoren
  5. Inhaltsverzeichnis
  6. 1 Grundlegende Konzepte
    1. 1.1 Dezentrale Versionsverwaltung – alles anders?
    2. 1.2 Das Repository – die Grundlage dezentralen Arbeitens
    3. 1.3 Branching und Merging – ganz einfach!
    4. 1.4 Zusammenfassung
  7. 2 Erste Schritte
    1. 2.1 Git einrichten
    2. 2.2 Das erste Projekt mit Git
      1. Repository anlegen
      2. Das erste Commit
      3. Status abfragen
      4. Ein Commit nach Änderungen
      5. Historie betrachten
    3. 2.3 Zusammenarbeit mit Git
      1. Repository klonen
      2. Änderungen aus einem anderen Repository holen
      3. Änderungen aus beliebigen Repositorys abholen
      4. Ein Repository für den Austausch erstellen
      5. Änderungen mit push hochladen
      6. Pull: Änderungen abholen
    4. 2.4 Zusammenfassung
  8. 3 Was sind Commits?
    1. 3.1 Zugriffsberechtigungen und Zeitstempel
    2. 3.2 Die Befehle add und commit
    3. 3.3 Exkurs: Mehr über Commit-Hashes
    4. 3.4 Eine Historie von Commits
    5. 3.5 Eine etwas andere Sichtweise auf Commits
    6. 3.6 Viele unterschiedliche Historien desselben Projekts
      1. Ausgabe begrenzen: -n
      2. Ausgabeformat wählen: --format, --oneline
      3. Änderungsstatistik: --stat, --shortstat
      4. Option: log --graph
    7. 3.7 Zusammenfassung
  9. 4 Commits zusammenstellen
    1. 4.1 Der Status-Befehl
    2. 4.2 Stage-Bereich speichert Momentaufnahmen
    3. 4.3 Was tun mit Änderungen, die nicht übernommen werden sollen?
    4. 4.4 Mit .gitignore Dateien unversioniert lassen
    5. 4.5 Stashing: Änderungen zwischenspeichern
    6. 4.6 Zusammenfassung
  10. 5 Das Repository
    1. 5.1 Ein einfaches und effizientes Speichersystem
    2. 5.2 Verzeichnisse speichern: Blob & Tree
    3. 5.3 Gleiche Daten werden nur einmal gespeichert
    4. 5.4 Kompression ähnlicher Inhalte
    5. 5.5 Ist es schlimm, wenn verschiedene Daten zufällig denselben Hashwert bekommen?
    6. 5.6 Commits
    7. 5.7 Wiederverwendung von Objekten in der Commit-Historie
    8. 5.8 Umbenennen, verschieben und kopieren
    9. 5.9 Zusammenfassung
  11. 6 Branches verzweigen
    1. 6.1 Parallele Entwicklung
    2. 6.2 Bugfixes in älteren Versionen
    3. 6.3 Branches
    4. 6.4 Swimlanes
    5. 6.5 Aktiver Branch
    6. 6.6 Branchzeiger umsetzen
    7. 6.7 Branch löschen
    8. 6.8 ... und was ist, wenn man die Commit-Objekte wirklich loswerden will?
    9. 6.9 Zusammenfassung
  12. 7 Branches zusammenführen
    1. 7.1 Was passiert bei einem Merge?
    2. 7.2 Konflikte
    3. 7.3 Bearbeitungskonflikte
    4. 7.4 Konfliktmarkierungen
    5. 7.5 Bearbeitungskonflikte lösen
    6. 7.6 Und was ist mit den inhaltlichen Konflikten?
    7. 7.7 Fast-Forward-Merges
    8. 7.8 Knifflige Merge-Conflikte
    9. 7.9 Ach egal, wird schon irgendwie gehen
    10. 7.10 Zusammenfassung
  13. 8 Mit Rebasing die Historie glätten
    1. 8.1 Das Prinzip: Kopieren von Commits
    2. 8.2 »Diamantenketten« vermeiden
    3. 8.3 ... und wenn es zu Konflikten kommt?
    4. 8.4 Branches umpflanzen
    5. 8.5 Was passiert mit den ursprünglichen Commits nach dem Rebasing?
    6. 8.6 Warum ist es problematisch, Original und Kopie eines Commits im gleichen Repository zu haben?
    7. 8.7 Cherry-Picking
    8. 8.8 Zusammenfassung
  14. 9 Austausch zwischen Repositorys
    1. 9.1 Repositorys klonen
    2. 9.2 Wie sagt man Git, wo das andere Repository liegt?
    3. 9.3 Anderen Repositorys einen Namen geben
    4. 9.4 Abholen von Daten
    5. 9.5 Remote-Tracking-Branches: Wissen, was in anderen Repositorys »los« ist
    6. 9.6 Lokal mit Branches aus anderen Repositorys arbeiten
    7. 9.7 Pull = Fetch + Merge
    8. 9.8 Für Diamantenhasser: --rebase
    9. 9.9 Push – das Gegenstück zu Pull
    10. 9.10 Jeder, wie er mag
    11. 9.11 Zusammenfassung
  15. 10 Versionen markieren
    1. 10.1 Arbeiten mit Tags erstellen
    2. 10.2 Welche Tags gibt es?
    3. 10.3 Die Hashes zu den Tags ausgeben
    4. 10.4 Log-Ausgabe, um Tags anreichern
    5. 10.5 In welcher Version ist es »drin«?
    6. 10.6 Wie verschiebt man ein Tag?
    7. 10.7 Und wenn ich ein »Floating Tag« brauche?
    8. 10.8 Zusammenfassung
  16. 11 Submodule
    1. 11.1 Submodule
    2. 11.2 Zusammenfassung
  17. 12 Workflow-Einführung
    1. 12.1 Warum Workflows?
    2. 12.2 Welche Workflows sind wann sinnvoll?
      1. Der Projektstart
      2. Die Entwicklung
      3. Ein Projekt ausliefern
      4. Refaktorierungen
    3. 12.3 Aufbau der Workflows
      1. Der Einstieg
      2. Der Überblick
      3. Die Voraussetzungen
      4. Der kompakte Workflow
      5. Die Abläufe und ihre Umsetzung
      6. Warum nicht anders?
  18. 13 Ein Projekt aufsetzen
    1. Überblick
    2. Voraussetzungen
    3. Ein Projekt aufsetzen
    4. 13.1 Ablauf und Umsetzung
      1. Neues Repository von Projektverzeichnis anlegen
        1. Schritt 1: Leere Verzeichnisse vorbereiten
        2. Schritt 2: Unnötige Dateien und Verzeichnisse ignorieren
        3. Schritt 3: Repository anlegen
        4. Schritt 4: Zeilenendenbehandlung definieren
        5. Schritt 5: Dateien importieren
        6. Schritt 6: Bare-Repository erzeugen
      2. Repository über Dateizugriffe teilen
        1. Schritt 1: Bare-Repository kopieren
        2. Schritt 2: Das zentrale Repository klonen
        3. Schritt 3: Lese und Schreibrechte verwalten
        4. Vorteile und Nachteile
      3. Repository mit dem Git-Daemon teilen
        1. Schritt 1: Bare-Repository für den Git-Daemon freigeben
        2. Schritt 2: Git-Daemon starten
        3. Schritt 3: Das zentrale Repository klonen
        4. Schritt 4: Lese- und Schreibrechte verwalten
        5. Vorteile und Nachteile
      4. Repository über HTTP teilen
        1. Schritt 1: Apache2-Module aktivieren
        2. Schritt 2: Zugriff auf das CGI-Skript erlauben
        3. Schritt 3: Repository per HTTP freigeben
        4. Schritt 4: Das zentrale Repository klonen
        5. Schritt 5: Lese- und Schreibrechte verwalten
        6. Vorteile und Nachteile
      5. Repository über SSH teilen
        1. Schritt 1: Bare-Repository kopieren
        2. Schritt 2: Das zentrale Repository klonen
        3. Schritt 3: Lese- und Schreibrechte verwalten
        4. Vorteile und Nachteile
    5. 13.2 Warum nicht anders?
      1. Warum nicht auf Push verzichten?
  19. 14 Gemeinsam auf einem Branch entwickeln
    1. Überblick
    2. Voraussetzungen
    3. Gemeinsam auf einem Branch entwickeln
    4. 14.1 Ablauf und Umsetzung
      1. Auf dem master-Branch arbeiten
        1. Schritt 1: master-Branch aktualisieren
        2. Schritt 2: Lokale Änderungen durchführen
        3. Schritt 3: Lokale Änderungen mit den zentralen Änderungen zusammenführen
        4. Schritt 4: Lokale Änderungen in das zentrale Repository übertragen
    5. 14.2 Warum nicht anders?
      1. Warum kein Rebase anstelle von Merge?
  20. 15 Mit Feature-Branches entwickeln
    1. Überblick
    2. Voraussetzungen
    3. Mit Feature-Branches entwickeln
    4. 15.1 Ablauf und Umsetzung
      1. Feature-Branch anlegen
        1. Schritt 1: master-Branch aktualisieren
        2. Schritt 2: Feature-Branch anlegen
        3. Schritt 3: Optional: Feature-Branch zentral sichern
      2. Feature in den master-Branch integrieren
        1. Schritt 1: master-Branch aktualisieren
        2. Schritt 2: Merge des Feature-Branches durchführen
        3. Schritt 3: Regressionstests durchführen und Commit anlegen
        4. Schritt 4: master-Branch in das zentrale Repository übertragen
        5. Schritt 5: Feature-Branch löschen oder weiterbenutzen
        6. Variante 1: Feature-Branch löschen
        7. Variante 2: Feature weiterentwickeln
        8. Änderungen des master-Branch in den Feature-Branch übernehmen
        9. Schritt 1: master-Branch aktualisieren
        10. Schritt 2: Änderungen in den Feature-Branch übernehmen
    5. 15.2 Warum nicht anders?
      1. Warum nicht nach Teillieferungen auf dem zusammengeführten Stand weiterarbeiten?
      2. Warum Feature-Branches nicht erst kurz vor dem Release integrieren?
      3. Warum nicht direkt zwischen Feature-Branches Commits austauschen?
  21. 16 Mit Bisection Fehler suchen
    1. Überblick
    2. Voraussetzungen
    3. Mit Bisection Fehler suchen
    4. 16.1 Ablauf und Umsetzung
      1. Manuelle Fehlersuche mit Bisection
        1. Schritt 1: Fehlerindikator definieren
        2. Schritt 2: Fehlerfreies und fehlerbehaftetes Commit finden
        3. Schritt 3: Fehlersuche mit Bisection
        4. Schritt 4: Bisection beenden bzw. abbrechen
      2. Automatisierte Fehlersuche mit Bisection
        1. Schritt 1: Fehlerindikator definieren
        2. Schritt 2: Testskript bereitstellen
        3. Schritt 3: Fehlerfreies und fehlerbehaftetes Commit finden
        4. Schritt 4: Automatisierte Fehlersuche mit Bisection
        5. Schritt 5: Bisection beenden
    5. 16.2 Warum nicht anders?
      1. Warum nicht mit Merge die Testskripte in alte Commits einfügen?
  22. 17 Mit einem Build-Server arbeiten
    1. Überblick
    2. Voraussetzungen
    3. Mit einem Build-Server arbeiten
    4. 17.1 Ablauf und Umsetzung
      1. Build-Server vorbereiten
        1. Schritt 1: Leeres Build-Repository anlegen
        2. Schritt 2: master-Branch des zentralen Repositorys holen
        3. Schritt 3: build-history-Branch anlegen
      2. Git auf dem Build-Server
        1. Schritt 1: Änderungen aus dem zentralen Repository holen
        2. Schritt 2: Überprüfen, ob ein Build erforderlich ist
        3. Schritt 3: Den Workspace aufräumen
        4. Schritt 4: Änderungen in den lokalen build-history-Branch holen
        5. Schritt 5: Build durchführen
        6. Schritt 6: Commit durchführen
        7. Schritt 7: Letztes erfolgreiches Build markieren
      3. Lokale Entwicklerversion mit dem letzten erfolgreichen Build vergleichen
        1. Schritt 1: Zentrale Commits überprüfen
        2. Schritt 2: Lokale Commits überprüfen
      4. Fehlersuche mit der Build-Historie
        1. Schritt 1: Build-Repository anbinden
        2. Schritt 2: Build-Historie übertragen
        3. Schritt 3: Lokalen Branch anlegen
        4. Schritt 4: Bisect durchführen
        5. Schritt 5: Ergebnis interpretieren
        6. Schritt 6: Aufräumen
    5. 17.2 Warum nicht anders?
      1. Warum keine Tags?
      2. Warum die Build-Historie nicht im zentralen Repository ablegen?
  23. 18 Ein Release durchführen
    1. Überblick
    2. Voraussetzungen
    3. Ein Release durchführen
    4. 18.1 Ablauf und Umsetzung
      1. Vorbereitung: stable-Branch anlegen
        1. Schritt 1: Erstes Commit ermitteln
        2. Schritt 2: stable-Branch anlegen
      2. Release vorbereiten und erstellen
        1. Schritt 1: codefreeze-Branch anlegen
        2. Schritt 2: Stabilisierung mit dem codefreeze-Branch
        3. Schritt 3: Release erstellen
        4. Schritt 4: master-Branch aktualisieren
      3. Hotfix durchführen
        1. Schritt 1: hotfix-Branch anlegen und Fehler beheben
        2. Schritt 2: Überprüfen, ob parallele Hotfixes stattgefunden haben
        3. Schritt 3: Hotfix freigeben
        4. Schritt 4: Hotfix-Änderungen in andere Branches übernehmen
    5. 18.2 Warum nicht anders?
      1. Warum nicht nur mit Tags?
      2. Warum nicht auf Tags verzichten?
      3. Warum keine Fast-Forward-Merges?
      4. Warum den Hotfix nicht direkt auf dem stable-Branch implementieren?
  24. 19 Große Projekte aufteilen
    1. Überblick
    2. Voraussetzungen
    3. Große Projekte aufteilen
    4. 19.1 Ablauf und Umsetzung
      1. Modul-Repository separieren
        1. Schritt 1: Gesamt-Repository klonen
        2. Schritt 2: Unnötige Dateien und Commits entfernen
        3. Schritt 3: Unnötige Branches und Tags entfernen
        4. Schritt 4: Verkleinern des Modul-Repositorys
        5. Schritt 5: Verzeichnisstruktur des Modul-Repositorys anpassen
        6. Schritt 6: Modulverzeichnisse aus Gesamt-Repository entfernen
      2. Modul-Repository als externes Repository einbinden
        1. Schritt 1: Externes Modul ins Gesamt-Repository einbinden
    5. 19.2 Warum nicht anders?
      1. Warum kein neues Repository?
      2. Warum nicht den --subdirectory-filter verwenden?
  25. 20 Kleine Projekte zusammenführen
    1. Überblick
    2. Voraussetzungen
    3. Kleine Projekte zusammenführen
    4. 20.1 Ablauf und Umsetzung
      1. Repositorys vereinigen
        1. Schritt 1: Gesamt-Repository anlegen
        2. Schritt 2: Dateien in Projektverzeichnis verschieben (erstes Repository)
        3. Schritt 3: Zweites Repository importieren
        4. Schritt 4: Dateien in Projektverzeichnis verschieben
        5. Schritt 5: Projekte zusammenführen
    5. 20.2 Warum nicht anders?
      1. Warum nicht ohne neue Projektverzeichnisse?
  26. 21 Lange Historien auslagern
    1. Überblick
    2. Voraussetzungen
    3. Lange Historien auslagern
    4. 21.1 Ablauf und Umsetzung
      1. Historie auslagern
        1. Schritt 1: Grafts-Tag anlegen
        2. Schritt 2: Klon anlegen
        3. Schritt 3: Historie mit der grafts-Datei ver ändern
        4. Schritt 4: Repository permanent ändern
        5. Schritt 5: Repository verkleinern
      2. Archiv-Repository einbinden
        1. Schritt 1: Archiv-Repository klonen
        2. Schritt 2: Archiv-Repository einbinden
        3. Schritt 3: Historien verbinden
    5. 21.2 Warum nicht anders?
      1. Warum kein Fetch des Archiv-Repositorys?
  27. 22 Andere Versionsverwaltungen parallel nutzen
    1. Überblick
    2. Voraussetzungen
    3. Andere Versionsverwaltungen parallel nutzen
    4. 22.1 Ablauf und Umsetzung
      1. Initiales Einrichten der Repositorys
        1. Schritt 1: Neues Sync-Repository anlegen
        2. Schritt 3: CVS-Ignore-Datei konfigurieren
        3. Schritt 4: Dateien zum Sync-Repository hinzufügen
        4. Schritt 5: cvs-Branch im Sync-Repository anlegen
        5. Schritt 6: Arbeits-Repository anlegen
      2. Änderungen von der zentralen Versionsverwaltung holen
        1. Schritt 1: Geänderte Dateien ins Sync-Repository übertragen
        2. Schritt 2: Änderungen ins Arbeits-Repository übertragen
        3. Schritt 3: Änderungen in den master-Branch übernehmen
      3. Änderungen in die zentrale Versionsverwaltung übertragen
        1. Schritt 1: Aktuellen Stand aus zentraler Versionsverwaltung holen
        2. Schritt 2: Änderungen in das Sync-Repository übertragen
        3. Schritt 3: Änderungen in den cvs-Branch übernehmen
        4. Schritt 4: Änderungen in die zentrale Versionsverwaltung übertragen
        5. Schritt 5: Aktualisierungen aus der zentralen Versionsverwaltung holen
        6. Schritt 6: Commit auf dem cvs-Branch durchführen
        7. Schritt 7: master-Branch im Arbeits-Repository aktualisieren
    5. 22.2 Warum nicht anders?
      1. Warum nicht mit nur einem Repository?
  28. 23 Ein Projekt nach Git migrieren
    1. Überblick
    2. Voraussetzungen
    3. Ein Projekt nach Git migrieren
    4. 23.1 Ablauf und Umsetzung
      1. Gitlernen, Erfahrungen sammeln
        1. Schritt 1: Git erproben
        2. Schritt 2: Optional - Parallel zur anderen Versionsverwaltung arbeiten
      2. Entscheidungen treffen
        1. Schritt 1: Alle Projekte auf einmal migrieren?
        2. Schritt 2: Welche Projekte sollen migriert werden?
        3. Schritt 3: Soll die bestehende Struktur übernommen werden?
        4. Schritt 4: Können Sie sich eine Unterbrechung der Entwicklung durch die Migration erlauben?
        5. Schritt 5: Welche Branching-Strategie wollen Sie einsetzen?
        6. Schritt 6: Welches Frontend wollen Sie verwenden?
      3. Branchesfinden
      4. Repository vorbereiten
        1. Schritt 1: Projekt aus der alten Versionsverwaltung holen
        2. Schritt 2: Git-Repository anlegen
        3. Schritt 3: Lokales Backup erstellen
        4. Schritt 4: Metadateien ignorieren lassen
      5. Branches übernehmen
        1. Schritt 1: Gegebenenfalls auf Vorgänger-Branch wechseln
        2. Schritt 2: Legacy-Branch anlegen
        3. Schritt 3: Stand aus der alten Versionsverwaltung übernehmen
        4. Schritt 4: Generierte Dateien unversioniert lassen
        5. Schritt 5: Git-Branch anlegen
        6. Schritt 6: Ergebnis prüfen
      6. Repository in Betrieb nehmen
        1. Schritt 1: Ankündigung
        2. Schritt 2: Einführung
        3. Schritt 3: Letzte Änderungen abholen
        4. Schritt 4: Neues Repository bereitstellen
        5. Schritt 5: Produkt bauen bzw. Release durchführen
        6. Schritt 6: Altes Repository auf »Read only« schalten
        7. Schritt 7: Entwickler unterstützen
      7. Aufräumen
    5. 23.2 Warum nicht anders?
      1. Warum nicht die ganze Historie übernehmen?
      2. Könnte man auf die Legacy-Branches verzichten?
      3. Kann man auf den Dual Workspace verzichten?
  29. 24 Was gibt es sonst noch?
    1. 24.1 Interaktives Rebasing – Historie verschönern
    2. 24.2 Umgang mit Patches
    3. 24.3 Patches per Mail versenden
    4. 24.4 Bundles-Pull im Offline-Modus
    5. 24.5 Archive erstellen
    6. 24.6 Grafische Werkzeuge für Git
    7. 24.7 Repository im Webbrowser anschauen
    8. 24.8 Zusammenarbeit mit Subversion
    9. 24.9 Aliase für Befehle
    10. 24.10 Notizen an Commits
    11. 24.11 Hooks - Git erweitern
    12. 24.12 Github - Hosting von Repositorys
  30. 25 Grenzen von Git
    1. 25.1 Hohe Komplexität
    2. 25.2 Komplizierter Umgang mit Submodulen
    3. 25.3 Ressourcenverbrauch bei großen binären Dateien
    4. 25.4 Repositorys können nur vollständig verwendet werden
    5. 25.5 Autorisierung nur auf dem ganzen Repository
    6. 25.6 Mäßige grafische Werkzeuge für Historienauswertung
  31. »Schritt für Schritt«-Anleitungen
  32. Workflow-Verzeichnis
  33. Index
  34. Fußnoten
    1. Vorwort
    2. Kapitel 2
    3. Kapitel 3
    4. Kapitel 4
    5. Kapitel 5
    6. Kapitel 7
    7. Kapitel 11
    8. Kapitel 13
    9. Kapitel 14
    10. Kapitel 15
    11. Kapitel 16
    12. Kapitel 17
    13. Kapitel 18
    14. Kapitel 19
    15. Kapitel 20
    16. Kapitel 21
    17. Kapitel 22
    18. Kapitel 23
    19. Kapitel 24
    20. Kapitel 25

Product information

  • Title: Git
  • Author(s): René Preißel, Bjørn Stachmann
  • Release date: September 2012
  • Publisher(s): dpunkt
  • ISBN: 97833898648004