Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Git Workshop für Einsteiger

Git Workshop für Einsteiger

Sujeevan Vijayakumaran

August 20, 2017
Tweet

More Decks by Sujeevan Vijayakumaran

Other Decks in Technology

Transcript

  1. Git Workshop
    Sujeevan Vijayakumaran
    Twitter: @svijee
    Blog: svij.org
    20. August 2017

    View Slide

  2. Wer ist das?
    • aus Castrop-Rauxel
    • zur Zeit Student der Angewandten Informatik (M.Sc., Universität Duisburg-Essen)
    • zuvor Dualer Student (IT-Center Dortmund/FH Dortmund)
    • Git-Nutzer seit 2011
    • aktiv in der Ubuntu & Open Source Szene (seit 2010)
    • aktuell beruflich mehr DevOps als Software-Entwickler
    • Autor des Git-Buchs des mitp Verlags
    1

    View Slide

  3. Git-Buch
    • „Mein“ Git-Buch
    • Verlag: mitp, 2016
    • Preis: 29,99€ (Buch), 25,99€ (Ebook)
    • Der Workshop basiert auf dem Buch
    • Buch basiert auf Tutorial auf meinem
    Blog svij.org
    • Keine Angst: Keine „Vorlesung“ des
    Buches ;)
    2

    View Slide

  4. Was gibts sonst noch?
    • Pause etwa alle 60 Minuten
    • Bei Fragen sofort fragen!
    • Mitmachen ist wichtig für das Verständnis!
    3

    View Slide

  5. Was machen wir hier?
    Einführung in Versionskontrolle
    Grundlagen
    Wie Git intern arbeitet
    Arbeiten mit Branches
    Verteilte Repositories
    4

    View Slide

  6. Einführung in Versionskontrolle

    View Slide

  7. Abbildung 1: »If that doesn’t fix it, git.txt contains the phone number of a friend of mine who
    understands git. Just wait through a few minutes of ’It’s really pretty simple, just think of
    branches as...’ and eventually you’ll learn the commands that will fix everything.«
    »xkcd: Git«, © Randall Munroe (xkcd.com/1597) ist lizenziert unter der Creative Commons Lizenz CC BY-NC 2.5 5

    View Slide

  8. Was ist eine Versionsverwaltung?
    • Verwaltung von Versionen
    • vortrag_v1, vortrag_v2, vortrag_v3,…
    • vortrag_final
    • votrag_final_new
    6

    View Slide

  9. Was kann versioniert werden?
    Quellcode
    Bilder
    Videos
    … und vieles mehr.
    7

    View Slide

  10. Warum eine Versionsverwaltung?
    • Nachvollziehbarkeit
    • „Springen“ zwischen Versionen
    • Teamwork
    Angereichert mit weiteren Informationen:
    • Wer? (Autor)
    • Wann? (Datum mit Uhrzeit)
    • Was? (Änderungsnotiz)
    8

    View Slide

  11. Drei Arten der Versionsverwaltung
    Lokal Zentral Verteilt
    9

    View Slide

  12. Lokale Versionsverwaltung
    • Lediglich lokal
    • häufig nur einzelne Dateien
    • nur einzelne Person
    • keine (eingebaute) Datensicherheit
    • SCCS, RCS
    10

    View Slide

  13. Zentrale Versionsverwaltung
    • CVS, Subversion (svn)
    • Repository auf zentralen Server
    • Arbeitskopie auf Clients
    • jede Aktion am Repository nur online
    11

    View Slide

  14. Verteilte Versionsverwaltung
    • Git, Bazaar (bzr), Mercurial (hg)
    • kompletter Klon liegt auf Clients + Server
    • kein unnötiger Netzwerk-Traffic
    • höhere Datensicherheit
    12

    View Slide

  15. Verteilte Versionsverwaltung
    13

    View Slide

  16. Kurzes zur Geschichte
    • Ursprünglicher Entwickler: Linus Torvalds
    • 2005 für den Linux-Kernel
    • git == Blödmann
    14

    View Slide

  17. Grundlagen

    View Slide

  18. Git Installation - Linux
    Installation des Kommandozeilen-Clients über die Paketverwaltung
    • apt-get install git (Debian/Ubuntu)
    • dnf install git (Fedora)
    • pacman -S git (ArchLinux)
    • zypper install git (openSUSE)
    15

    View Slide

  19. Git CLI unter Windows
    Abbildung 2: Git CLI unter Windows.
    16

    View Slide

  20. „Projekt“
    • Lernen durch einfaches Anwendungsbeispiel
    • Bauen einer einfachen statischen Webseite
    • Projekt beinhaltet ein wenig Arbeiten mit HTML-Code
    17

    View Slide

  21. Git Repository anlegen
    $ mkdir meineWebseite
    $ cd meineWebseite
    $ git init
    Leeres Git-Repository in ~/meineWebseite/.git/ initialisiert
    18

    View Slide

  22. Inhalt des .git Ordners
    $ ls -l .git
    insgesamt 32
    drwxr-xr-x 2 sujee sujee 4096 6. Mär 21:24 branches
    -rw-r--r-- 1 sujee sujee 92 6. Mär 21:24 config
    -rw-r--r-- 1 sujee sujee 73 6. Mär 21:24 description
    -rw-r--r-- 1 sujee sujee 23 6. Mär 21:24 HEAD
    drwxr-xr-x 2 sujee sujee 4096 6. Mär 21:24 hooks
    drwxr-xr-x 2 sujee sujee 4096 6. Mär 21:24 info
    drwxr-xr-x 4 sujee sujee 4096 6. Mär 21:24 objects
    drwxr-xr-x 4 sujee sujee 4096 6. Mär 21:24 refs
    19

    View Slide

  23. Git-Konfiguration
    Globales Setzen des Namen und der E-Mail-Adresse für Commits.
    $ git config --global user.name "Sujeevan Vijayakumaran"
    $ git config --global user.email "[email protected]"
    $ cat ~/.gitconfig
    [user]
    name = Sujeevan Vijayakumaran
    email = [email protected]
    Alternativ:
    $ git config -l
    20

    View Slide

  24. git status
    $ git status
    Auf Branch master
    Initialer Commit
    nichts zu committen (Erstellen/Kopieren Sie Dateien
    und benutzen Sie "git add" zum Versionieren)
    21

    View Slide

  25. Bootstrap Download
    $ curl -o bootstrap.zip -L https://git.io/vy2Ue
    $ unzip bootstrap.zip
    $ mv bootstrap-3.3.7-dist/* .
    $ rmdir bootstrap-3.3.7-dist
    $ rm bootstrap.zip
    22

    View Slide

  26. Zum ersten Commit: Schritt 1
    Abbildung 3: Das Arbeitsverzeichnis ist gefüllt, Repository und Staging sind leer.
    23

    View Slide

  27. Inhalt des Projektordners
    $ ls -l
    drwxr-xr-x 1 sujee sujee 320 25. Jul 2016 css
    drwxr-xr-x 1 sujee sujee 326 25. Jul 2016 fonts
    drwxr-xr-x 1 sujee sujee 68 25. Jul 2016 js
    24

    View Slide

  28. git status - Kein Commit - Staging-Area leer
    $ git status
    Auf Branch master
    Initialer Commit
    Unversionierte Dateien:
    (benutzen Sie "git add ...", um die Änderungen
    zum Commit vorzumerken)
    css/
    fonts/
    js/
    nichts zum Commit vorgemerkt, aber es gibt unversionierte
    Dateien (benutzen Sie "git add" zum Versionieren)
    25

    View Slide

  29. git add css && git status
    $ git add css
    $ git status
    Auf Branch master - Initialer Commit
    zum Commit vorgemerkte Änderungen:
    (benutzen Sie "git rm --cached ..." zum Entfernen
    aus der Staging-Area)
    neue Datei: css/bootstrap-theme.css
    neue Datei: css/bootstrap-theme.css.map
    neue Datei: css/bootstrap-theme.min.css
    neue Datei: css/bootstrap-theme.min.css.map
    neue Datei: css/bootstrap.css
    neue Datei: css/bootstrap.css.map
    neue Datei: css/bootstrap.min.css
    neue Datei: css/bootstrap.min.css.map
    Unversionierte Dateien:
    fonts/
    js/ 26

    View Slide

  30. Zum ersten Commit: Schritt 2
    Abbildung 4: Der css-Ordner wurde hinzugefügt, das Repository ist weiterhin noch leer.
    27

    View Slide

  31. git add && git status
    $ git add fonts/glyphicons-halflings-regular.eot
    $ git status
    Auf Branch master
    Initialer Commit
    zum Commit vorgemerkte Änderungen:
    (benutzen Sie "git rm --cached ..." zum Entfernen aus
    der Staging-Area)
    neue Datei: css/bootstrap-theme.css
    neue Datei: css/bootstrap-theme.css.map
    neue Datei: css/…
    neue Datei: fonts/glyphicons-halflings-regular.eot
    Unversionierte Dateien:
    fonts/glyphicons-halflings-regular.svg
    fonts/glyphicons-halflings-regular.ttf
    fonts/glyphicons-halflings-regular.woff
    fonts/glyphicons-halflings-regular.woff2
    js/ 28

    View Slide

  32. Tipp
    Tipp: git status -s
    $ git status -s
    A css/bootstrap-theme.css
    A css/bootstrap-theme.css.map
    A css/bootstrap-theme.min.css
    A css/bootstrap-theme.min.css.map
    A css/bootstrap.css
    A css/bootstrap.css.map
    A css/bootstrap.min.css
    A css/bootstrap.min.css.map
    A fonts/glyphicons-halflings-regular.eot
    ?? fonts/glyphicons-halflings-regular.svg
    ?? fonts/glyphicons-halflings-regular.ttf
    ?? fonts/glyphicons-halflings-regular.woff
    ?? fonts/glyphicons-halflings-regular.woff2
    ?? js/ 29

    View Slide

  33. git add js fonts
    $ git add js fonts
    Alternativ:
    $ git add -A
    …fügt alle neuen und veränderten Dateien aus dem Arbeitsverzeichnis zur Staging-Area
    hinzu.
    30

    View Slide

  34. Zum ersten Commit: Schritt 3
    Abbildung 5: Staging ist gefüllt, das Repository ist noch immer leer.
    31

    View Slide

  35. git commit
    $ git commit -m "Bootstrap hinzugefügt"
    [master (Basis-Commit) 86844ff] Bootstrap hinzugefügt
    16 files changed, 10045 insertions(+)
    create mode 100644 css/bootstrap-theme.css
    create mode 100644 css/bootstrap-theme.css.map
    create mode 100644 css/bootstrap-theme.min.css
    create mode 100644 css/bootstrap-theme.min.css.map
    create mode 100644 css/bootstrap.css
    create mode 100644 css/bootstrap.css.map
    create mode 100644 fonts/glyphicons-halflings-regular.eot
    create mode 100644 fonts/glyphicons-halflings-regular.svg
    create mode 100644 fonts/glyphicons-halflings-regular.ttf
    create mode 100644 fonts/glyphicons-halflings-regular.woff
    create mode 100644 fonts/glyphicons-halflings-regular.woff2
    create mode 100644 js/bootstrap.js
    create mode 100644 js/bootstrap.min.js
    create mode 100644 js/npm.js 32

    View Slide

  36. Zum ersten Commit: Schritt 4
    Abbildung 6: Das Repository besitzt ein Commit - Staging ist nun wieder leer.
    33

    View Slide

  37. Das Log Anschauen mit git log
    $ git log
    commit 86844ff2a2b80410783007d6c26ab1d5450f9092
    Author: Sujeevan Vijayakumaran
    Date: Thu Mar 9 10:22:53 2017 +0100
    Bootstrap hinzugefügt
    34

    View Slide

  38. Der erste Commit
    Abbildung 7: Der erste Commit auf dem master-Branch
    35

    View Slide

  39. index.html anlegen und Commit erzeugen
    $ curl -o index.html -L https://svij.org/uploads/git-workshop/index.txt
    $ git add index.html
    $ git commit -m "index.html hinzugefügt"
    36

    View Slide

  40. git log
    $ git log
    commit 4242f75db84dd07c5287ae9ab9845910dce8d0fd
    Author: Sujeevan Vijayakumaran
    Date: Thu Mar 9 11:02:47 2017 +0100
    index.html hinzugefügt
    commit 86844ff2a2b80410783007d6c26ab1d5450f9092
    Author: Sujeevan Vijayakumaran
    Date: Thu Mar 9 10:22:53 2017 +0100
    Bootstrap hinzugefügt
    37

    View Slide

  41. Die ersten beiden Commits
    Abbildung 8: Der ersten beiden Commits auf dem master-Branch
    38

    View Slide

  42. Änderung der index.html
    Neuer Titel:
    Webseite mit Git!
    Begrüßung im H1-Tag:
    Hallo Welt!
    39

    View Slide

  43. Nochmal: git status
    $ git status
    Auf Branch master
    Änderungen, die nicht zum Commit vorgemerkt sind:
    (benutzen Sie "git add ...", um die
    Änderungen zum Commit vorzumerken)
    (benutzen Sie "git checkout -- ...",
    um die Änderungen im Arbeitsverzeichnis zu verwerfen)
    geändert: index.html
    keine Änderungen zum Commit vorgemerkt (benutzen Sie
    "git add" und/oder "git commit -a")
    40

    View Slide

  44. Änderungen ansehen mit git diff
    $ git diff
    diff --git a/index.html b/index.html
    index b965ed1..968f3c7 100644
    --- a/index.html
    +++ b/index.html
    @@ -5,7 +5,7 @@



    - Bootstrap 101 Template
    + Webseite mit Git


    @@ -18,7 +18,7 @@



    - Hello, world!
    + Hallo Welt!


    41

    View Slide

  45. Tipp
    Tipp: Farbige Ausgaben
    $ git config --global color.ui true
    42

    View Slide

  46. Dritter Commit
    $ git add index.html
    $ git commit -m "Titel und Überschrift angepasst."
    [master ef130f4] Titel und Überschrift angepasst.
    1 file changed, 2 insertions(+), 2 deletions(-)
    43

    View Slide

  47. Die ersten drei Commits
    Abbildung 9: Der ersten drei Commits auf dem master-Branch
    44

    View Slide

  48. Mischung aus Änderungen im Staging und im Workspace
    H2- unter H1-Überschrift hinzufügen:
    Endlich lernen wir uns kennen.
    Jetzt ausprobieren:
    $ git diff
    Und anschließend:
    $ git add index.html
    $ git diff
    Was ist der Unterschied?
    45

    View Slide

  49. git diff Modi
    Abbildung 10: Die verschiedenen Modi von git diff zeigen die Unterschiede von den
    unterschiedlichen Schichten an.
    46

    View Slide

  50. Änderung aus Staging-Area herausnehmen
    $ git reset HEAD index.html
    Die Änderung wird hiermit aus der Staging-Area herausgenommen aber nicht gelöscht!
    Dies verrät ein weiteres Diff.
    47

    View Slide

  51. Lokale Änderungen zurücksetzen
    Der Checkout Subbefehl wird zum Arbeiten mit Branches verwendet, in diesem Fall
    werden Änderungen die nicht mindestens in der Staging-Area sind, gelöscht.
    $ git checkout -- index.html
    48

    View Slide

  52. Versionierte Dateien verschieben
    $ git mv alterDateiname neuerDateiname
    Prinzipiell das selbe wie:
    $ mv alterDateiname neuerDateiname
    $ git add neuerDateiname
    $ git rm alterDateiname
    49

    View Slide

  53. Änderungen rückgängig machen
    Reset ←→ Revert
    50

    View Slide

  54. Änderungen rückgängig machen
    Was man nutzt hängt davon ab, in welchem Zustand sich die Änderung befindet.
    Reset:
    • Änderungen in der Staging-Area (zuvor kennengelernt)
    • Commits löschen
    Revert:
    • Commits mit Revert-Commits
    51

    View Slide

  55. Revert
    Aufgaben:
    1. Änderung durchführen
    2. Commit Erstellen
    3. Commit-ID aus Log rausholen
    4. Revert durchführen
    5. Log ansehen
    52

    View Slide

  56. Revert
    $ echo "Die Zeile für den Revert" >> index.html
    $ git commit -am "Zeile hinzugefügt, um diese zu reverten"
    53

    View Slide

  57. Revert
    $ echo "Die Zeile für den Revert" >> index.html
    $ git commit -am "Zeile hinzugefügt, um diese zu reverten"
    $ git log --oneline -2
    06eac50 Zeile hinzugefügt, um diese zu reverten
    ef130f4 Titel und Überschrift angepasst.
    53

    View Slide

  58. Revert
    $ echo "Die Zeile für den Revert" >> index.html
    $ git commit -am "Zeile hinzugefügt, um diese zu reverten"
    $ git log --oneline -2
    06eac50 Zeile hinzugefügt, um diese zu reverten
    ef130f4 Titel und Überschrift angepasst.
    $ git revert 06eac50
    [master b2cb478] Revert "Zeile hinzugefügt, um diese zu reverten"
    1 file changed, 1 deletion(-)
    $ git log --oneline -3
    b2cb478 Revert "Zeile hinzugefügt, um diese zu reverten"
    06eac50 Zeile hinzugefügt, um diese zu reverten
    ef130f4 Titel und Überschrift angepasst.
    53

    View Slide

  59. Reset
    Jetzt sollen die zuvor angelegten Commits auch aus der Historie verschwinden. Das
    geht (u.a.) mit Reset.
    Reset besitzt drei Modi mit jeweils verschiedenen Verhaltensweisen:
    • soft
    • mixed
    • hard
    54

    View Slide

  60. Zwei Commits löschen - Mixed
    Mixed-Modus:
    $ git reset HEAD~2
    $ git log --oneline -3
    Entfernt die Commits und behält die Änderungen im Arbeitsverzeichnis bei.
    55

    View Slide

  61. Soft-Reset
    Zum Ausprobieren wieder eine Änderung durchführen und ein Commit erzeugen!
    $ git reset --soft HEAD~1
    Ein Soft-Reset nimmt den bzw die Commits zurück, behält die Änderungen aber im
    Arbeitsverzeichnis und auch in der Staging-Area bereit.
    56

    View Slide

  62. Hard-Reset
    Zum Ausprobieren wieder eine Änderung durchführen und ein Commit erzeugen!
    $ git reset --hard HEAD~1
    Ein Hard-Reset nimmt den bzw die Commits zurück, behält weder die Änderungen
    noch die Commits.
    57

    View Slide

  63. git reset Modi
    Abbildung 11: Die Unterschide zwischen den verschiedenen Modi.
    58

    View Slide

  64. Referenzierung von Commits
    Verschiedene Arten um Commit zu referenzieren:
    • ef130f4ad4884aaa31ec13431055cb5b3e034235 - vollständige Commit-ID
    • ef130f4 - kurze Commit-ID
    • HEAD~2 - vorletzter Commit von HEAD ausgehend
    • master~2 - vorletzter Commit auf master
    • master@{4} - viertletzter Commit vom aktuellen HEAD von master
    59

    View Slide

  65. Wie Git intern arbeitet

    View Slide

  66. Git Internals
    Abbildung 12: Git speichert die Commits als Snapshots, nicht als Diffs.
    60

    View Slide

  67. Repository initialisieren
    $ mkdir test-repo
    $ cd test-repo
    $ git init
    $ echo "tmp" >> tmp
    61

    View Slide

  68. Blick ins .git Verzeichnis
    $ ls -l .git
    insgesamt 12
    drwxr-xr-x 1 sujee sujee 0 24. Mär 18:48 branches
    -rw-r--r-- 1 sujee sujee 92 24. Mär 18:48 config
    -rw-r--r-- 1 sujee sujee 73 24. Mär 18:48 description
    -rw-r--r-- 1 sujee sujee 23 24. Mär 18:48 HEAD
    drwxr-xr-x 1 sujee sujee 364 24. Mär 18:48 hooks
    drwxr-xr-x 1 sujee sujee 14 24. Mär 18:48 info
    drwxr-xr-x 1 sujee sujee 16 24. Mär 18:48 objects
    drwxr-xr-x 1 sujee sujee 18 24. Mär 18:48 refs
    62

    View Slide

  69. Ein Blick in .git/objects nach dem Commit
    $ tree .git/objects
    .git/objects
    a1
    85acdf314be5d33d3ec9e27965b659a5a3b4f7
    a9
    a5aecf429fd8a0d81fbd5fd37006bfa498d5c1
    db
    35c5d88e2685fe378f7feeb0afb925d4912b80
    info
    pack
    5 directories, 3 files
    63

    View Slide

  70. cat-file auf die Commit-ID
    $ git cat-file -p db35c5d
    tree a185acdf314be5d33d3ec9e27965b659a5a3b4f7
    author Sujeevan Vijayakumaran 1490377819 +0100
    committer Sujeevan Vijayakumaran 1490377819 +0100
    tmp
    64

    View Slide

  71. cat-file auf das tree Objekt
    $ git cat-file -p a185acdf314be5d33d3ec9e27965b659a5a3b4f7
    100644 blob a9a5aecf429fd8a0d81fbd5fd37006bfa498d5c1 tmp
    65

    View Slide

  72. cat-file auf das blob Objekt
    $ git cat-file -p a9a5aecf429fd8a0d81fbd5fd37006bfa498d5c1
    tmp
    66

    View Slide

  73. Git Internals
    Abbildung 13: Vereinfachte Ansicht der der Git-Objekte im Repository mit einem Commit und
    einer Datei.
    67

    View Slide

  74. Zweiter Commit in zweiter Datei
    $ echo "tmp2" >> tmp2
    $ git add tmp2
    $ git commit -m "Commit tmp2"
    [master 56cf088] tmp2
    1 file changed, 1 insertion(+)
    create mode 100644 tmp2
    68

    View Slide

  75. cat-file auf den zweiten Commit
    $ git cat-file -p 56cf088
    tree 27cc440762b0cf85979cccd13af46229d59f0818
    parent db35c5d88e2685fe378f7feeb0afb925d4912b80
    author Sujeevan Vijayakumaran 1490378348 +0100
    committer Sujeevan Vijayakumaran 1490378348 +0100
    tmp2
    69

    View Slide

  76. cat-file auf das neue tree Objekt
    $ git cat-file -p 27cc440762b0cf85979cccd13af46229d59f0818
    100644 blob a9a5aecf429fd8a0d81fbd5fd37006bfa498d5c1 tmp
    100644 blob f0206044e90fd5c77500ec550df0a0be6f0d0c46 tmp2
    70

    View Slide

  77. Git Internals
    Abbildung 14: Vereinfachte Ansicht der Git-Objekte im Repository mit zwei Commits und
    zwei Dateien.
    71

    View Slide

  78. Arbeiten mit Branches

    View Slide

  79. Branches anlegen
    71

    View Slide

  80. Allgemeines
    • Branch lässt sich am besten mit „Zweig“ übersetzen
    • „abzweigen“ vom aktuellen Entwicklungsbranch
    • Pflege von mehreren Entwicklungslinien
    • einfaches Wechseln zwischen den Branches
    • Arbeitsvorgang abhängig vom Entwicklungsprozess
    72

    View Slide

  81. Allgemeines II
    • Branch ist letztendlich ein Zeiger auf einen Commit
    • Zeiger wird bei jedem neuen Commit weitergeschoben
    • HEAD ist i.d.R. der aktuelle ausgecheckte Commit
    • head ist eine Referenz auf ein Commit. (Branch oder Tag)
    73

    View Slide

  82. Drei Commits auf dem Branch master
    74

    View Slide

  83. Drei Commits auf dem Branch master
    75

    View Slide

  84. git branch
    Auflistung der vorhandenen Branches:
    $ git branch
    * master
    76

    View Slide

  85. Neuen Branch anlegen
    Anlage des neuen Branches menu auf Basis von master
    $ git branch menu
    77

    View Slide

  86. Zwei Branches - drei Commits
    78

    View Slide

  87. Branch auschecken
    $ git checkout menu
    Zu Branch 'menu' gewechselt
    79

    View Slide

  88. Nach dem checkout
    80

    View Slide

  89. Branch content anlegen
    $ git checkout -b content
    Zu neuem Branch 'content' gewechselt
    81

    View Slide

  90. Branch content angelegt
    82

    View Slide

  91. Inhalt in content anlegen
    Unterhalb der Überschrift beliebigen Content einfügen, etwa vom
    Lorem-Ipsum-Generator auf loremipsum.de.
    Commit erzeugen mit den Änderungen mit der Message „Lorem-Ipsum Fülltext
    hinzugefügt“.
    83

    View Slide

  92. Neuer Commit auf content
    84

    View Slide

  93. Commit in menu anlegen
    Zum Branch menu wechseln und das Menü hinzufügen.
    (svij.org/uploads/git-workshop/menu.txt)




    Link
    Link




    Anschließend Commit erzeugen. („Bootstrap-Menü hinzugefügt“) 85

    View Slide

  94. Neuer Commit auf menu
    86

    View Slide

  95. Zweiter Commit auf menu anlegen: Links im Menü anpassen
    $ git diff
    diff --git a/index.html b/index.html
    index 478b303..97d97f7 100644
    --- a/index.html
    +++ b/index.html
    @@ -14,8 +14,8 @@



    - Link
    - Link
    + Home
    + Impressum



    87

    View Slide

  96. Neuer Commit auf menu
    88

    View Slide

  97. Branches mergen
    88

    View Slide

  98. Was ist ein Merge?
    • Zusammenführung von (mindestens) zwei Branches
    • Commits bleiben vorhanden
    • Historie bleibt nachvollziehbar
    89

    View Slide

  99. Das Merge 1x1
    • Alles (weiterhin) Lokal
    • Merge-Konflikte können auftreten
    • Man holt sich die Änderungen aus dem anderen Branch in den aktuellen Branch
    herein
    90

    View Slide

  100. content nach master mergen
    $ git checkout master
    Zu Branch 'master' gewechselt
    $ git merge content
    Aktualisiere a74bdcd..7fbaa4c
    Fast-forward
    index.html | 11 ++++++++++
    1 file changed, 11 insertions(+)
    91

    View Slide

  101. content nach master mergen
    Abbildung 15: content wurde nach master gemergt.
    92

    View Slide

  102. git branch
    Gemergte Branches bleiben weiterhin vorhanden!
    $ git branch
    content
    * master
    menu
    93

    View Slide

  103. Branch löschen
    $ git branch -d content
    Branch content entfernt (war 7fbaa4c).
    Mit -d können gemergte Branches gelöscht werden. Mit -D können nicht gemergte
    Branches gelöscht werden.
    94

    View Slide

  104. menu nach master mergen
    $ git merge menu
    Merge branch 'menu'
    # Bitte geben Sie eine Commit-Beschreibung ein, um zu erklären, warum dieser
    # Merge erforderlich ist, insbesondere wenn es einen aktualisierten
    # Upstream-Branch mit einem Thema-Branch zusammenführt.
    #
    # Zeilen beginnend mit '#' werden ignoriert, und eine leere Beschreibung
    # bricht den Commit ab.

    automatischer Merge von index.html
    Merge made by the 'recursive' strategy.
    index.html | 10 ++++++++++
    1 file changed, 10 insertions(+)
    95

    View Slide

  105. menu nach master mergen
    Abbildung 16: menu wurde nach master gemergt.
    96

    View Slide

  106. Ein Blick ins Log
    $ git log -n 2
    commit 0366b41f69884e238db12f05e56f1122bbc11536
    Merge: 7fbaa4c 61e910e
    Author: Sujeevan Vijayakumaran
    Date: Fri Nov 20 19:05:08 2015 +0100
    Merge branch 'menu'
    commit 04baab343670be3ca4fed404adbc416e767821c2
    Author: Sujeevan Vijayakumaran
    Date: Thu Nov 19 18:45:18 2015 +0100
    Menüpunkte Home und Impressum hinzugefügt
    97

    View Slide

  107. Merge-Konflikte
    97

    View Slide

  108. Erzwingen eines Merge-Konflikts
    Folgende Aufgaben:
    1. Neuen Branch titel anlegen
    2. Commit mit Änderung des Titels
    3. Zurück zu master wechseln
    4. Commit mit anderer Änderung des Titels
    5. Mergen
    6. Merge-Konflikt auflösen
    98

    View Slide

  109. Neuen Branch titel anlegen
    Legt den Branch titel auf Basis von master an:
    $ git checkout -b titel master
    Zu neuem Branch 'titel gewechselt'
    99

    View Slide

  110. Commit mit Änderung des Titels auf titel
    Title von „Hallo Git!“ auf „Hallo!“ ändern.
    $ git add index.html
    $ git commit -m "Titel für den Merge-Konflikt"
    [titel 6ba3d6b] Titel für den Merge-Konflikt
    1 file changed, 1 insertion(+), 1 deletion(-)
    100

    View Slide

  111. Commit mit Änderung des Titels auf master
    $ git checkout master
    [index.html anpassen]
    $ git add index.html
    $ git commit -m "Neuer Überschriftstitel"
    [master 3e98ae0] Neuer Überschriftstitel
    1 file changed, 1 insertion(+), 1 deletion(-)
    101

    View Slide

  112. Merge mit Merge-Konflikt
    $ git merge titel
    automatischer Merge von index.html
    KONFLIKT (Inhalt): Merge-Konflikt in index.html
    Automatischer Merge fehlgeschlagen;
    beheben Sie die Konflikte und committen
    Sie dann das Ergebnis.
    102

    View Slide

  113. Status beim offenen Merge-Konflikt
    $ git status
    Auf Branch master
    Sie haben nicht zusammengeführte Pfade.
    (beheben Sie die Konflikte und führen Sie "git commit" aus)
    Nicht zusammengeführte Pfade:
    (benutzen Sie "git add/rm ...", um die Auflösung
    zu markieren) von beiden geändert:
    index.html
    keine Änderungen zum Commit vorgemerkt
    (benutzen Sie "git add" und/oder "git commit -a")
    103

    View Slide

  114. Der Konflikt
    <<<<<<< HEAD
    Hallo!
    =======
    Hallo Merge-Konflikt!
    >>>>>>> titel
    104

    View Slide

  115. Merge-Konflikt nach dem Auflösen
    $ git add index.html
    $ git status
    Auf Branch master
    Alle Konflikte sind behoben, aber Sie sind immer noch beim Merge.
    (benutzen Sie "git commit", um den Merge abzuschließen)
    nichts zu committen, Arbeitsverzeichnis unverändert
    105

    View Slide

  116. Merge-Commit nach dem Merge-Konflikt
    $ git commit
    Merge branch 'titel'
    # Conflicts:
    # index.html
    #
    # Es sieht so aus, als committen Sie einen Merge.
    # Falls das nicht korrekt ist, löschen Sie bitte die Datei
    # .git/MERGE_HEAD
    # und versuchen Sie es erneut.
    # [...]
    # Auf Branch master
    # [...]
    106

    View Slide

  117. Merge-Konflikte in GUI-Programmen
    Lernen Sie auch noch kennen, aber noch nicht an dieser Stelle.
    107

    View Slide

  118. Rebasing
    • gehört ebenfalls zum Branching-Modell von Git
    • beim Rebasing können ebenfalls Commits aus einem anderen Zweig übernommen
    werden
    • kein Merge-Commit
    • geradlinige Versionshistorie
    108

    View Slide

  119. Rebasing
    Aufgaben:
    1. Gebraucht: zwei Commits auf zwei Branches
    2. neuer Branch more_content anlegen
    3. more_content: Verdreifachung des Lorem-Ipsum Textes
    4. master: Menü um ’About me’ Link erweitert
    109

    View Slide

  120. Commit auf neuen Branch more_content
    $ git checkout more_content master
    [Lorem Ipsum Text verdreifacen]
    $ git add index.html
    $ git commit -m "Verdreifachung des Lorem-Ipsum-Textes"
    [more_content 703fc9b] Verdreifachung des Lorem-Ipsum-Texts
    1 file changed, 22 insertions(+)
    110

    View Slide

  121. Commit auf master
    $ git checkout master
    [About me Link hinzufügen…]
    $ git commit -am "Menu um 'About me' Link erweitert"
    111

    View Slide

  122. Ausgangszustand vor dem Rebase
    Abbildung 17: Der Ausgangszustand vor dem Rebase wurde hergestellt.
    112

    View Slide

  123. Das Ziel:
    Ein Zusammenführen beider Branches ohne Merge-Commit.
    112

    View Slide

  124. Verhindern des Merge-Commits
    Abbildung 18: Das soll verhindert werden: ein Merge-Commit in more_content.
    113

    View Slide

  125. Rebase master
    $ git checkout more_content
    $ git rebase master
    Zunächst wird der Branch zurückgespult, um Ihre Änderungen
    darauf neu anzuwenden ...
    Wende an: Verdreifachung des Lorem-Ipsum-Texts
    114

    View Slide

  126. Rebase master durchgeführt
    Abbildung 19: Ein Rebase wurde von more_content auf master durchgeführt.
    115

    View Slide

  127. git log -n 3
    $ git log -n 3
    commit e97e3dcd65e1a8ba93954711a9247ff8fcd6705d
    Author: Sujeevan Vijayakumaran
    Date: Sat Nov 21 14:02:14 2015 +0100
    Verdreifachung des Lorem-Ipsum-Texts
    commit 75c04eb02199d96baa3e928d69cb0b710a0af97c
    Author: Sujeevan Vijayakumaran
    Date: Sat Nov 21 14:25:50 2015 +0100
    Menü um 'About me' Link erweitert
    commit 564ec7ead8b2687b0c6d06ba60a1e575b6ebe607
    Merge: f2d6462 4f04f93
    Author: Sujeevan Vijayakumaran
    Date: Sat Nov 21 11:54:48 2015 +0100
    Merge branch 'titel'
    116

    View Slide

  128. Schönere Historie mit Rebase statt Merge
    Abbildung 20: Das Rebasen von Feature-Branches erzeugt eine schönere Historie als Mergen.
    117

    View Slide

  129. Stash und Clean
    117

    View Slide

  130. Stash
    • eine Art Zwischenlager
    • Änderungen können rein- und rausgeschoben werden
    • häufig nützlich um zwischen Branches zu wechseln
    • einfacher und schneller als WIP-Commits
    • nur lokal
    118

    View Slide

  131. git stash
    Wenn keine Änderungen vorliegen…
    $ git stash
    Keine lokalen Änderungen zum Speichern
    119

    View Slide

  132. git stash
    Aufgaben:
    1. eine Zeile in index.html verändern
    2. beliebige Datei temp anlegen
    3. beide Änderungen in den Stash schieben
    Wie immer hilft: git status und in diesem Fall git stash.
    120

    View Slide

  133. git stash
    Bei Änderungen:
    $ git stash
    Saved working directory and index state WIP on master: bf55e27
    Social-Media Menüpunkt hinzugefügt
    HEAD ist jetzt bei bf55e27 Social-Media Menüpunkt hinzugefügt
    121

    View Slide

  134. git stash
    $ git status
    Auf Branch master
    Unversionierte Dateien:
    (benutzen Sie "git add ...", um die Änderungen zum Commit
    vorzumerken)
    temp
    122

    View Slide

  135. git stash
    $ git add temp
    $ git stash
    Saved working directory and index state WIP on master: bf55e27
    Social-Media Menüpunkt hinzugefügt
    HEAD ist jetzt bei bf55e27 Social-Media Menüpunkt hinzugefügt
    $ git status
    Auf Branch master
    nichts zu committen, Arbeitsverzeichnis unverändert
    123

    View Slide

  136. git stash list
    $ git stash list
    stash@{0}: WIP on master: bf55e27 Social-Media Menüpunkt hinzugefügt
    stash@{1}: WIP on master: bf55e27 Social-Media Menüpunkt hinzugefügt
    124

    View Slide

  137. git stash drop
    $ git stash drop
    Gelöscht refs/stash@{0} (9d21f5c834c461b6a3287986546df077e3e782b2)
    125

    View Slide

  138. git stash pop
    $ git stash pop
    Auf Branch master
    Änderungen, die nicht zum Commit vorgemerkt sind:
    geändert:
    index.html
    keine Änderungen zum Commit vorgemerkt
    Gelöscht refs/stash@{0} (5ad2602567242ed1b3714d44a2da7db60762d5d2)
    126

    View Slide

  139. git clean
    $ mkdir x y z
    $ touch a b c x/x y/y z/z
    $ git status
    [...]
    Unversionierte Dateien:
    (benutzen Sie "git add ...", um die Änderungen zum Commit
    vorzumerken)
    a
    b
    c
    x/
    y/
    z/
    $ git clean
    fatal: clean.requireForce standardmäßig auf "true" gesetzt und weder -i, -n
    noch -f gegeben; "clean" verweigert
    127

    View Slide

  140. git clean -n
    $ git clean -n
    Würde a löschen
    Würde b löschen
    Würde c löschen
    Würde nur die unbeobachteten Dateien, aber nicht die unbeobachteten Ordner löschen.
    128

    View Slide

  141. git clean -f
    $ git clean -f
    Lösche a
    Lösche b
    Lösche c
    -f für Force für das unwiederrufliche Löschen von Dateien.
    129

    View Slide

  142. git clean -df
    $ git clean -df
    Lösche x/
    Lösche y/
    Lösche z/
    Mit -d werden auch Ordner gelöscht.
    Tipp: git clean -fdx
    130

    View Slide

  143. Dateien ignorieren mit .gitignore
    130

    View Slide

  144. Dateitypen ignorieren
    *.dll
    *.so
    *.exe
    131

    View Slide

  145. Dateitypen + Ordner ignorieren
    *.dll
    *.so
    *.exe
    build/
    132

    View Slide

  146. Dateitypen + Ordner ignorieren
    Problematischer wird das Ignorieren eines Ordners mit Ausnahme einer darin
    enthaltenen Datei
    *.dll
    *.so
    *.exe
    build/
    !build/version.h
    Funktioniert so nicht!
    133

    View Slide

  147. Dateitypen + Ordner ignorieren
    Lösung:
    *.dll
    *.so
    *.exe
    build/*
    !build/version.h
    134

    View Slide

  148. Verteilte Repositories

    View Slide

  149. Was bisher geschah…
    • Commits angelegt
    • Branches angelegt
    • Branches gemergt
    • Branches rebased
    • Merge-Konflikte aufgelöst
    Dies geschah noch alles ausschließlich lokal!
    135

    View Slide

  150. Verteilte Git-Repositorys
    Abbildung 21: Jedes Git-Repository ist prinzipiell mit jedem gleichgestellt.
    136

    View Slide

  151. Projekt mit einem Remote-Repository
    136

    View Slide

  152. Erstes Remote-Repository anlegen
    Im Home-Verzeichnis wird ein git Ordner angelegt, wo das Remote-Repository liegen
    soll:
    $ mkdir ~/git
    $ git clone --bare . ~/git/meineWebseite.git
    Klone in Bare-Repository '/home/sujee/git/meineWebseite.git' ...
    Fertig.
    git clone --bare klont das Repository ohne Arbeitsverzeichnis.
    137

    View Slide

  153. Remote-Repository verknüpfen
    Der Subbefehl remote handhabt die Verknüpfungen zwischen lokalen und entfernten
    Repository.
    $ git remote add origin ~/git/meineWebseite.git
    An dieser Stelle erfolgt noch kein Datenaustausch!
    138

    View Slide

  154. Verteilte Git-Repositorys
    Abbildung 22: Das Remote-Repository wurde mit dem lokalen Repository bekannt gemacht.
    139

    View Slide

  155. git remote
    $ git remote
    origin
    140

    View Slide

  156. Remote-Branches holen
    $ git fetch
    Von /home/sujee/git/meineWebseite
    * [neuer Branch] master -> origin/master
    * [neuer Branch] menu -> origin/menu
    * [neuer Branch] more_content -> origin/more_content
    * [neuer Branch] titel -> origin/titel
    Branches aus dem Remote-Repository origin beginnen mit dem Präfix origin/.
    141

    View Slide

  157. Änderungen aus origin/master mergen
    Angenommen, origin/master hat neue Commits:
    $ git merge origin/master
    Achtung: Hier können Merge-Commits entstehen.
    142

    View Slide

  158. Pull: Kombiniertes Fetch und Merge
    Mit pull kann man ein kombiniertes fetch und merge durchführen.
    $ git pull origin master
    143

    View Slide

  159. Verteilte Git-Repositorys
    Abbildung 23: git fetch macht die Branches von origin als zusätzliche Branches verfügbar.
    144

    View Slide

  160. Branches auflisten
    $ git branch
    * master
    menu
    more_content
    titel
    145

    View Slide

  161. Branches auflisten
    $ git branch -a
    * master
    menu
    more_content
    titel
    remotes/origin/master
    remotes/origin/menu
    remotes/origin/more_content
    remotes/origin/titel
    Branches können auch ohne remotes/ ausgecheckt werden.
    146

    View Slide

  162. Neuen lokalen Commit auf master
    • Menü-Link „Social-Media“ hinzufügen
    • Commit anlegen
    • git status
    147

    View Slide

  163. Neuer Commit auf master
    Abbildung 24: master ist origin/master durch den neuen Commit um einen Commit
    voraus.
    148

    View Slide

  164. Neuer Commit auf master
    $ git status
    Auf Branch master
    Ihr Branch ist vor 'origin/master' um 1 Commit.
    (benutzen Sie "git push", um lokale Commits zu publizieren)
    nichts zu committen, Arbeitsverzeichnis unverändert
    149

    View Slide

  165. Änderungen pushen
    $ git push
    fatal: Der aktuelle Branch master hat keinen Upstream-Branch.
    Ohne Parameter versucht git push den aktuellen Branch auf das Remote-Repository zu
    schieben – allerdings nur wenn es konfiguriert wurde.
    150

    View Slide

  166. Upstream Branch konfigurieren und Pushen
    $ git push --set-upstream origin master
    Zähle Objekte: 3, Fertig.
    Delta compression using up to 8 threads.
    Komprimiere Objekte: 100% (3/3), Fertig.
    Schreibe Objekte: 100% (3/3), 414 bytes | 0 bytes/s, Fertig.
    Total 3 (delta 1), reused 0 (delta 0)
    To /home/sujee/git/meineWebseite.git
    af4a589..bf55e27
    master -> master
    Branch master konfiguriert zum Folgen von Remote-Branch master von origin.
    Oder kürzer mit -u.
    151

    View Slide

  167. Nach dem ersten Push
    Abbildung 25: Der neue Commit ist nach dem Push auch auf dem Remote-Repository
    verfügbar.
    152

    View Slide

  168. Änderungen pushen
    $ git push
    Everything up-to-date
    153

    View Slide

  169. Anderen Branch pushen
    $ git push origin more_content
    Everything up-to-date
    154

    View Slide

  170. Push und Pull/Fetch
    Abbildung 26: Mit git push origin $branchname wird der angegebene lokale Branch auf
    das Remote-Repository hochgeladen.
    155

    View Slide

  171. Branch-Management
    155

    View Slide

  172. Branch-Management
    Diverse Branches sind noch vorhanden, die jedoch schon alle gemergt aber nicht mehr
    gebraucht werden.
    $ git checkout master
    $ git branch --merged
    * master
    menu
    more_content
    titel
    --merged liefert alle Branches zurück die in diesem Fall nach master gemergt wurden.
    156

    View Slide

  173. Nicht gemergte Branches auflisten
    Umgekehrt geht es auch:
    $ git branch --no-merged menu
    * master
    more_content
    titel
    157

    View Slide

  174. Gemergte Branches inklusive Remote-Branches
    $ git branch -a --merged master
    * master
    menu
    more_content
    titel
    remotes/origin/master
    remotes/origin/menu
    remotes/origin/more_content
    remotes/origin/titel
    158

    View Slide

  175. Branches löschen
    $ git branch -d menu
    Branch menu entfernt (war 50176be).
    $ git branch -d more_content titel
    Branch more_content entfernt (war e97e3dc).
    Branch titel entfernt (war 4f04f93).
    159

    View Slide

  176. Kontrolle: Sind Remote-Branches noch vorhanden?
    $ git branch -a --merged master
    * master
    remotes/origin/master
    remotes/origin/menu
    remotes/origin/more_content
    remotes/origin/titel
    160

    View Slide

  177. Remote-Branches löschen
    $ git push origin --delete menu
    To /home/sujee/git/meineWebseite.git
    - [deleted] menu
    $ git push origin :titel :more_content
    To /home/sujee/git/meineWebseite.git
    - [deleted] more_content
    - [deleted] titel
    161

    View Slide

  178. Tracking-Branches
    161

    View Slide

  179. Informationen von Remote-Repositories anschauen
    $ git remote show origin
    * Remote-Repository origin
    URL zum Abholen: /home/sujee/git/meineWebseite.git
    URL zum Versenden: /home/sujee/git/meineWebseite.git
    Hauptbranch: master
    Remote-Branch:
    master gefolgt
    Lokaler Branch konfiguriert für 'git pull':
    master führt mit Remote-Branch master zusammen
    Lokale Referenz konfiguriert für 'git push':
    master versendet nach master (aktuell)
    162

    View Slide

  180. Neuen Branch anlegen
    Aufgabe:
    1. neuen Branch new-footer anlegen
    2. Branch pushen
    163

    View Slide

  181. Neuen Klon anlegen
    $ cd ~
    $ git clone ~/git/meineWebseite.git meineWebseite2
    $ cd meineWebseite2
    Frage: Welches Branches besitzt das neu geklonte Repository?
    164

    View Slide

  182. Branches auflisten
    $ git branch
    * master
    Wo ist new-footer?
    165

    View Slide

  183. Alle Branches auflisten
    $ git branch -a
    * master
    remotes/origin/HEAD -> origin/master
    remotes/origin/master
    remotes/origin/new-footer
    166

    View Slide

  184. new-footer auschecken
    $ git checkout new-footer
    Branch new-footer konfiguriert zum Folgen von Remote-Branch new-footer
    von origin.
    Zu neuem Branch 'new-footer' gewechselt
    $ git push
    Everything up-to-date
    167

    View Slide

  185. Checkout mit Tracking-Branch
    Selber Effekt, nur mit anderen Branch-Namen:
    $ git checkout -b footer origin/new-footer
    168

    View Slide

  186. Tracking-Branch unabhängig von origin
    $ git checkout -t origin/new-footer
    169

    View Slide

  187. Projekt mit drei Remote-Repositories
    169

    View Slide

  188. Remote-Repository verknüpfung löschen
    $ git remote rm origin
    Nur die Verknüpfung zum Remote-Repository wird hiermit gelöscht, sonst werden
    keine Daten gelöscht!
    170

    View Slide

  189. Das Ziel
    Abbildung 27: Logischer Aufbau der Remote-Repositories.
    171

    View Slide

  190. Remote-Repositories anlegen
    Aufgaben:
    1. Bare Remote-Repositories origin, er, ich klonen
    2. Remote-Repositories lokal verknüpfen
    3. Remote-Branches fetchen
    172

    View Slide

  191. Bare-Repository Klone anlegen
    $ git clone --bare . ~/git/ich/meineWebseite.git
    Klone in Bare-Repository '/home/sujee/git/ich/meineWebseite.git' ...
    Fertig.
    $ git clone --bare . ~/git/er/meineWebseite.git
    Klone in Bare-Repository '/home/sujee/git/er/meineWebseite.git' ...
    Fertig.
    173

    View Slide

  192. Remote-Repositories verknüpfen
    $ git remote add origin ~/git/ich/meineWebseite.git
    $ git remote add er ~/git/er/meineWebseite.git
    $ git remote add upstream ~/git/meineWebseite.git
    174

    View Slide

  193. Fetch von allen Remote-Repositories
    $ git fetch
    Von /home/sujee/git/ich/meineWebseite
    * [neuer Branch]
    master -> origin/master
    $ git fetch --all
    Fordere an von origin
    Fordere an von upstream
    Von /home/sujee/git/meineWebseite
    * [neuer Branch]
    master -> upstream/master
    Fordere an von er
    Von /home/sujee/git/er/meineWebseite
    * [neuer Branch]
    master -> er/master
    175

    View Slide

  194. Vielen Dank für die Aufmerksamkeit!
    Fragen, Feedback und Fehler gerne per E-Mail an [email protected].
    Blog: svij.org
    Twitter: @svijee
    Copyright 2017 Sujeevan Vijayakumaran
    176

    View Slide