Git Workshop für Einsteiger

Git Workshop für Einsteiger

09487d5e2518b0f18972d70b4641c15f?s=128

Sujeevan Vijayakumaran

August 20, 2017
Tweet

Transcript

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

    2017
  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
  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
  4. Was gibts sonst noch? • Pause etwa alle 60 Minuten

    • Bei Fragen sofort fragen! • Mitmachen ist wichtig für das Verständnis! 3
  5. Was machen wir hier? Einführung in Versionskontrolle Grundlagen Wie Git

    intern arbeitet Arbeiten mit Branches Verteilte Repositories 4
  6. Einführung in Versionskontrolle

  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
  8. Was ist eine Versionsverwaltung? • Verwaltung von Versionen • vortrag_v1,

    vortrag_v2, vortrag_v3,… • vortrag_final • votrag_final_new 6
  9. Was kann versioniert werden? Quellcode Bilder Videos … und vieles

    mehr. 7
  10. Warum eine Versionsverwaltung? • Nachvollziehbarkeit • „Springen“ zwischen Versionen •

    Teamwork Angereichert mit weiteren Informationen: • Wer? (Autor) • Wann? (Datum mit Uhrzeit) • Was? (Änderungsnotiz) 8
  11. Drei Arten der Versionsverwaltung Lokal Zentral Verteilt 9

  12. Lokale Versionsverwaltung • Lediglich lokal • häufig nur einzelne Dateien

    • nur einzelne Person • keine (eingebaute) Datensicherheit • SCCS, RCS 10
  13. Zentrale Versionsverwaltung • CVS, Subversion (svn) • Repository auf zentralen

    Server • Arbeitskopie auf Clients • jede Aktion am Repository nur online 11
  14. Verteilte Versionsverwaltung • Git, Bazaar (bzr), Mercurial (hg) • kompletter

    Klon liegt auf Clients + Server • kein unnötiger Netzwerk-Traffic • höhere Datensicherheit 12
  15. Verteilte Versionsverwaltung 13

  16. Kurzes zur Geschichte • Ursprünglicher Entwickler: Linus Torvalds • 2005

    für den Linux-Kernel • git == Blödmann 14
  17. Grundlagen

  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
  19. Git CLI unter Windows Abbildung 2: Git CLI unter Windows.

    16
  20. „Projekt“ • Lernen durch einfaches Anwendungsbeispiel • Bauen einer einfachen

    statischen Webseite • Projekt beinhaltet ein wenig Arbeiten mit HTML-Code 17
  21. Git Repository anlegen $ mkdir meineWebseite $ cd meineWebseite $

    git init Leeres Git-Repository in ~/meineWebseite/.git/ initialisiert 18
  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
  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 "mail@svij.org" $ cat ~/.gitconfig [user] name = Sujeevan Vijayakumaran email = mail@svij.org Alternativ: $ git config -l 20
  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
  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
  26. Zum ersten Commit: Schritt 1 Abbildung 3: Das Arbeitsverzeichnis ist

    gefüllt, Repository und Staging sind leer. 23
  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
  28. git status - Kein Commit - Staging-Area leer $ git

    status Auf Branch master Initialer Commit Unversionierte Dateien: (benutzen Sie "git add <Datei>...", 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
  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 <Datei>..." 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
  30. Zum ersten Commit: Schritt 2 Abbildung 4: Der css-Ordner wurde

    hinzugefügt, das Repository ist weiterhin noch leer. 27
  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 <Datei>..." 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
  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
  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
  34. Zum ersten Commit: Schritt 3 Abbildung 5: Staging ist gefüllt,

    das Repository ist noch immer leer. 31
  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
  36. Zum ersten Commit: Schritt 4 Abbildung 6: Das Repository besitzt

    ein Commit - Staging ist nun wieder leer. 33
  37. Das Log Anschauen mit git log $ git log commit

    86844ff2a2b80410783007d6c26ab1d5450f9092 Author: Sujeevan Vijayakumaran <mail@svij.org> Date: Thu Mar 9 10:22:53 2017 +0100 Bootstrap hinzugefügt 34
  38. Der erste Commit Abbildung 7: Der erste Commit auf dem

    master-Branch 35
  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
  40. git log $ git log commit 4242f75db84dd07c5287ae9ab9845910dce8d0fd Author: Sujeevan Vijayakumaran

    <mail@svij.org> Date: Thu Mar 9 11:02:47 2017 +0100 index.html hinzugefügt commit 86844ff2a2b80410783007d6c26ab1d5450f9092 Author: Sujeevan Vijayakumaran <mail@svij.org> Date: Thu Mar 9 10:22:53 2017 +0100 Bootstrap hinzugefügt 37
  41. Die ersten beiden Commits Abbildung 8: Der ersten beiden Commits

    auf dem master-Branch 38
  42. Änderung der index.html Neuer Titel: <title>Webseite mit Git!</title> Begrüßung im

    H1-Tag: <h1>Hallo Welt!</h1> 39
  43. Nochmal: git status $ git status Auf Branch master Änderungen,

    die nicht zum Commit vorgemerkt sind: (benutzen Sie "git add <Datei>...", um die Änderungen zum Commit vorzumerken) (benutzen Sie "git checkout -- <Datei>...", 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
  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 @@ <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags --> - <title>Bootstrap 101 Template</title> + <title>Webseite mit Git</title> <!-- Bootstrap --> <link href="css/bootstrap.min.css" rel="stylesheet"> @@ -18,7 +18,7 @@ <![endif]--> </head> <body> - <h1>Hello, world!</h1> + <h1>Hallo Welt!</h1> <!-- jQuery (necessary for Bootstraps JavaScript plugins) --> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> 41
  45. Tipp Tipp: Farbige Ausgaben $ git config --global color.ui true

    42
  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
  47. Die ersten drei Commits Abbildung 9: Der ersten drei Commits

    auf dem master-Branch 44
  48. Mischung aus Änderungen im Staging und im Workspace H2- unter

    H1-Überschrift hinzufügen: <h2>Endlich lernen wir uns kennen.</h2> Jetzt ausprobieren: $ git diff Und anschließend: $ git add index.html $ git diff Was ist der Unterschied? 45
  49. git diff Modi Abbildung 10: Die verschiedenen Modi von git

    diff zeigen die Unterschiede von den unterschiedlichen Schichten an. 46
  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
  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
  52. Versionierte Dateien verschieben $ git mv alterDateiname neuerDateiname Prinzipiell das

    selbe wie: $ mv alterDateiname neuerDateiname $ git add neuerDateiname $ git rm alterDateiname 49
  53. Änderungen rückgängig machen Reset ←→ Revert 50

  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
  55. Revert Aufgaben: 1. Änderung durchführen 2. Commit Erstellen 3. Commit-ID

    aus Log rausholen 4. Revert durchführen 5. Log ansehen 52
  56. Revert $ echo "Die Zeile für den Revert" >> index.html

    $ git commit -am "Zeile hinzugefügt, um diese zu reverten" 53
  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
  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
  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
  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
  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
  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
  63. git reset Modi Abbildung 11: Die Unterschide zwischen den verschiedenen

    Modi. 58
  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
  65. Wie Git intern arbeitet

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

    nicht als Diffs. 60
  67. Repository initialisieren $ mkdir test-repo $ cd test-repo $ git

    init $ echo "tmp" >> tmp 61
  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
  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
  70. cat-file auf die Commit-ID $ git cat-file -p db35c5d tree

    a185acdf314be5d33d3ec9e27965b659a5a3b4f7 author Sujeevan Vijayakumaran <mail@svij.org> 1490377819 +0100 committer Sujeevan Vijayakumaran <mail@svij.org> 1490377819 +0100 tmp 64
  71. cat-file auf das tree Objekt $ git cat-file -p a185acdf314be5d33d3ec9e27965b659a5a3b4f7

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

    tmp 66
  73. Git Internals Abbildung 13: Vereinfachte Ansicht der der Git-Objekte im

    Repository mit einem Commit und einer Datei. 67
  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
  75. cat-file auf den zweiten Commit $ git cat-file -p 56cf088

    tree 27cc440762b0cf85979cccd13af46229d59f0818 parent db35c5d88e2685fe378f7feeb0afb925d4912b80 author Sujeevan Vijayakumaran <mail@svij.org> 1490378348 +0100 committer Sujeevan Vijayakumaran <mail@svij.org> 1490378348 +0100 tmp2 69
  76. cat-file auf das neue tree Objekt $ git cat-file -p

    27cc440762b0cf85979cccd13af46229d59f0818 100644 blob a9a5aecf429fd8a0d81fbd5fd37006bfa498d5c1 tmp 100644 blob f0206044e90fd5c77500ec550df0a0be6f0d0c46 tmp2 70
  77. Git Internals Abbildung 14: Vereinfachte Ansicht der Git-Objekte im Repository

    mit zwei Commits und zwei Dateien. 71
  78. Arbeiten mit Branches

  79. Branches anlegen 71

  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
  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
  82. Drei Commits auf dem Branch master 74

  83. Drei Commits auf dem Branch master 75

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

    master 76
  85. Neuen Branch anlegen Anlage des neuen Branches menu auf Basis

    von master $ git branch menu 77
  86. Zwei Branches - drei Commits 78

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

    79
  88. Nach dem checkout 80

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

    Branch 'content' gewechselt 81
  90. Branch content angelegt 82

  91. Inhalt in content anlegen Unterhalb der <h1> Ü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
  92. Neuer Commit auf content 84

  93. Commit in menu anlegen Zum Branch menu wechseln und das

    Menü hinzufügen. (svij.org/uploads/git-workshop/menu.txt) <nav class="navbar navbar-default" role="navigation"> <div class="container-fluid"> <div class="collapse navbar-collapse"> <ul class="nav navbar-nav"> <li class="active"><a href="#">Link</a></li> <li><a href="#">Link</a></li> </ul> </div> </div> </nav> Anschließend Commit erzeugen. („Bootstrap-Menü hinzugefügt“) 85
  94. Neuer Commit auf menu 86

  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 @@ <div class="container-fluid"> <div class="collapse navbar-collapse"> <ul class="nav navbar-nav"> - <li class="active"><a href="#">Link</a></li> - <li><a href="#">Link</a></li> + <li class="active"><a href="#">Home</a></li> + <li><a href="#">Impressum</a></li> </ul> </div> </div> 87
  96. Neuer Commit auf menu 88

  97. Branches mergen 88

  98. Was ist ein Merge? • Zusammenführung von (mindestens) zwei Branches

    • Commits bleiben vorhanden • Historie bleibt nachvollziehbar 89
  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
  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
  101. content nach master mergen Abbildung 15: content wurde nach master

    gemergt. 92
  102. git branch Gemergte Branches bleiben weiterhin vorhanden! $ git branch

    content * master menu 93
  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
  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
  105. menu nach master mergen Abbildung 16: menu wurde nach master

    gemergt. 96
  106. Ein Blick ins Log $ git log -n 2 commit

    0366b41f69884e238db12f05e56f1122bbc11536 Merge: 7fbaa4c 61e910e Author: Sujeevan Vijayakumaran <mail@svij.org> Date: Fri Nov 20 19:05:08 2015 +0100 Merge branch 'menu' commit 04baab343670be3ca4fed404adbc416e767821c2 Author: Sujeevan Vijayakumaran <mail@svij.org> Date: Thu Nov 19 18:45:18 2015 +0100 Menüpunkte Home und Impressum hinzugefügt 97
  107. Merge-Konflikte 97

  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
  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
  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
  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
  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
  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 <Datei>...", 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
  114. Der Konflikt <<<<<<< HEAD <h1>Hallo!</h1> ======= <h1>Hallo Merge-Konflikt!</h1> >>>>>>> titel

    104
  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
  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
  117. Merge-Konflikte in GUI-Programmen Lernen Sie auch noch kennen, aber noch

    nicht an dieser Stelle. 107
  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
  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
  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
  121. Commit auf master $ git checkout master [About me Link

    hinzufügen…] $ git commit -am "Menu um 'About me' Link erweitert" 111
  122. Ausgangszustand vor dem Rebase Abbildung 17: Der Ausgangszustand vor dem

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

  124. Verhindern des Merge-Commits Abbildung 18: Das soll verhindert werden: ein

    Merge-Commit in more_content. 113
  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
  126. Rebase master durchgeführt Abbildung 19: Ein Rebase wurde von more_content

    auf master durchgeführt. 115
  127. git log -n 3 $ git log -n 3 commit

    e97e3dcd65e1a8ba93954711a9247ff8fcd6705d Author: Sujeevan Vijayakumaran <mail@svij.org> Date: Sat Nov 21 14:02:14 2015 +0100 Verdreifachung des Lorem-Ipsum-Texts commit 75c04eb02199d96baa3e928d69cb0b710a0af97c Author: Sujeevan Vijayakumaran <mail@svij.org> Date: Sat Nov 21 14:25:50 2015 +0100 Menü um 'About me' Link erweitert commit 564ec7ead8b2687b0c6d06ba60a1e575b6ebe607 Merge: f2d6462 4f04f93 Author: Sujeevan Vijayakumaran <mail@svij.org> Date: Sat Nov 21 11:54:48 2015 +0100 Merge branch 'titel' 116
  128. Schönere Historie mit Rebase statt Merge Abbildung 20: Das Rebasen

    von Feature-Branches erzeugt eine schönere Historie als Mergen. 117
  129. Stash und Clean 117

  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
  131. git stash Wenn keine Änderungen vorliegen… $ git stash Keine

    lokalen Änderungen zum Speichern 119
  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
  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
  134. git stash $ git status Auf Branch master Unversionierte Dateien:

    (benutzen Sie "git add <Datei>...", um die Änderungen zum Commit vorzumerken) temp 122
  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
  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
  137. git stash drop $ git stash drop Gelöscht refs/stash@{0} (9d21f5c834c461b6a3287986546df077e3e782b2)

    125
  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
  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 <Datei>...", 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
  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
  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
  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
  143. Dateien ignorieren mit .gitignore 130

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

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

  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
  147. Dateitypen + Ordner ignorieren Lösung: *.dll *.so *.exe build/* !build/version.h

    134
  148. Verteilte Repositories

  149. Was bisher geschah… • Commits angelegt • Branches angelegt •

    Branches gemergt • Branches rebased • Merge-Konflikte aufgelöst Dies geschah noch alles ausschließlich lokal! 135
  150. Verteilte Git-Repositorys Abbildung 21: Jedes Git-Repository ist prinzipiell mit jedem

    gleichgestellt. 136
  151. Projekt mit einem Remote-Repository 136

  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
  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
  154. Verteilte Git-Repositorys Abbildung 22: Das Remote-Repository wurde mit dem lokalen

    Repository bekannt gemacht. 139
  155. git remote $ git remote origin 140

  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
  157. Änderungen aus origin/master mergen Angenommen, origin/master hat neue Commits: $

    git merge origin/master Achtung: Hier können Merge-Commits entstehen. 142
  158. Pull: Kombiniertes Fetch und Merge Mit pull kann man ein

    kombiniertes fetch und merge durchführen. $ git pull origin master 143
  159. Verteilte Git-Repositorys Abbildung 23: git fetch macht die Branches von

    origin als zusätzliche Branches verfügbar. 144
  160. Branches auflisten $ git branch * master menu more_content titel

    145
  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
  162. Neuen lokalen Commit auf master • Menü-Link „Social-Media“ hinzufügen •

    Commit anlegen • git status 147
  163. Neuer Commit auf master Abbildung 24: master ist origin/master durch

    den neuen Commit um einen Commit voraus. 148
  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
  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
  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
  167. Nach dem ersten Push Abbildung 25: Der neue Commit ist

    nach dem Push auch auf dem Remote-Repository verfügbar. 152
  168. Änderungen pushen $ git push Everything up-to-date 153

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

    154
  170. Push und Pull/Fetch Abbildung 26: Mit git push origin $branchname

    wird der angegebene lokale Branch auf das Remote-Repository hochgeladen. 155
  171. Branch-Management 155

  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
  173. Nicht gemergte Branches auflisten Umgekehrt geht es auch: $ git

    branch --no-merged menu * master more_content titel 157
  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
  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
  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
  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
  178. Tracking-Branches 161

  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
  180. Neuen Branch anlegen Aufgabe: 1. neuen Branch new-footer anlegen 2.

    Branch pushen 163
  181. Neuen Klon anlegen $ cd ~ $ git clone ~/git/meineWebseite.git

    meineWebseite2 $ cd meineWebseite2 Frage: Welches Branches besitzt das neu geklonte Repository? 164
  182. Branches auflisten $ git branch * master Wo ist new-footer?

    165
  183. Alle Branches auflisten $ git branch -a * master remotes/origin/HEAD

    -> origin/master remotes/origin/master remotes/origin/new-footer 166
  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
  185. Checkout mit Tracking-Branch Selber Effekt, nur mit anderen Branch-Namen: $

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

  187. Projekt mit drei Remote-Repositories 169

  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
  189. Das Ziel Abbildung 27: Logischer Aufbau der Remote-Repositories. 171

  190. Remote-Repositories anlegen Aufgaben: 1. Bare Remote-Repositories origin, er, ich klonen

    2. Remote-Repositories lokal verknüpfen 3. Remote-Branches fetchen 172
  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
  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
  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
  194. Vielen Dank für die Aufmerksamkeit! Fragen, Feedback und Fehler gerne

    per E-Mail an mail@svij.org. Blog: svij.org Twitter: @svijee Copyright 2017 Sujeevan Vijayakumaran 176