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

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

    intern arbeitet Arbeiten mit Branches Verteilte Repositories 4
  5. 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
  6. Was ist eine Versionsverwaltung? • Verwaltung von Versionen • vortrag_v1,

    vortrag_v2, vortrag_v3,… • vortrag_final • votrag_final_new 6
  7. Warum eine Versionsverwaltung? • Nachvollziehbarkeit • „Springen“ zwischen Versionen •

    Teamwork Angereichert mit weiteren Informationen: • Wer? (Autor) • Wann? (Datum mit Uhrzeit) • Was? (Änderungsnotiz) 8
  8. Lokale Versionsverwaltung • Lediglich lokal • häufig nur einzelne Dateien

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

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

    Klon liegt auf Clients + Server • kein unnötiger Netzwerk-Traffic • höhere Datensicherheit 12
  11. 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
  12. „Projekt“ • Lernen durch einfaches Anwendungsbeispiel • Bauen einer einfachen

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

    git init Leeres Git-Repository in ~/meineWebseite/.git/ initialisiert 18
  14. 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
  15. 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
  16. git status $ git status Auf Branch master Initialer Commit

    nichts zu committen (Erstellen/Kopieren Sie Dateien und benutzen Sie "git add" zum Versionieren) 21
  17. 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
  18. Zum ersten Commit: Schritt 1 Abbildung 3: Das Arbeitsverzeichnis ist

    gefüllt, Repository und Staging sind leer. 23
  19. 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
  20. 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
  21. 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
  22. Zum ersten Commit: Schritt 2 Abbildung 4: Der css-Ordner wurde

    hinzugefügt, das Repository ist weiterhin noch leer. 27
  23. 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
  24. 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
  25. 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
  26. 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
  27. Zum ersten Commit: Schritt 4 Abbildung 6: Das Repository besitzt

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

    86844ff2a2b80410783007d6c26ab1d5450f9092 Author: Sujeevan Vijayakumaran <[email protected]> Date: Thu Mar 9 10:22:53 2017 +0100 Bootstrap hinzugefügt 34
  29. 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
  30. git log $ git log commit 4242f75db84dd07c5287ae9ab9845910dce8d0fd Author: Sujeevan Vijayakumaran

    <[email protected]> Date: Thu Mar 9 11:02:47 2017 +0100 index.html hinzugefügt commit 86844ff2a2b80410783007d6c26ab1d5450f9092 Author: Sujeevan Vijayakumaran <[email protected]> Date: Thu Mar 9 10:22:53 2017 +0100 Bootstrap hinzugefügt 37
  31. 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
  32. Ä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
  33. 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
  34. 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
  35. git diff Modi Abbildung 10: Die verschiedenen Modi von git

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

    selbe wie: $ mv alterDateiname neuerDateiname $ git add neuerDateiname $ git rm alterDateiname 49
  39. Ä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
  40. Revert Aufgaben: 1. Änderung durchführen 2. Commit Erstellen 3. Commit-ID

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

    $ git commit -am "Zeile hinzugefügt, um diese zu reverten" 53
  42. 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
  43. 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
  44. 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
  45. 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
  46. 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
  47. 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
  48. 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
  49. 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
  50. 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
  51. cat-file auf die Commit-ID $ git cat-file -p db35c5d tree

    a185acdf314be5d33d3ec9e27965b659a5a3b4f7 author Sujeevan Vijayakumaran <[email protected]> 1490377819 +0100 committer Sujeevan Vijayakumaran <[email protected]> 1490377819 +0100 tmp 64
  52. cat-file auf das tree Objekt $ git cat-file -p a185acdf314be5d33d3ec9e27965b659a5a3b4f7

    100644 blob a9a5aecf429fd8a0d81fbd5fd37006bfa498d5c1 tmp 65
  53. Git Internals Abbildung 13: Vereinfachte Ansicht der der Git-Objekte im

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

    tree 27cc440762b0cf85979cccd13af46229d59f0818 parent db35c5d88e2685fe378f7feeb0afb925d4912b80 author Sujeevan Vijayakumaran <[email protected]> 1490378348 +0100 committer Sujeevan Vijayakumaran <[email protected]> 1490378348 +0100 tmp2 69
  56. cat-file auf das neue tree Objekt $ git cat-file -p

    27cc440762b0cf85979cccd13af46229d59f0818 100644 blob a9a5aecf429fd8a0d81fbd5fd37006bfa498d5c1 tmp 100644 blob f0206044e90fd5c77500ec550df0a0be6f0d0c46 tmp2 70
  57. 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
  58. 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
  59. 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
  60. 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
  61. 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
  62. Was ist ein Merge? • Zusammenführung von (mindestens) zwei Branches

    • Commits bleiben vorhanden • Historie bleibt nachvollziehbar 89
  63. 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
  64. 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
  65. 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
  66. 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
  67. Ein Blick ins Log $ git log -n 2 commit

    0366b41f69884e238db12f05e56f1122bbc11536 Merge: 7fbaa4c 61e910e Author: Sujeevan Vijayakumaran <[email protected]> Date: Fri Nov 20 19:05:08 2015 +0100 Merge branch 'menu' commit 04baab343670be3ca4fed404adbc416e767821c2 Author: Sujeevan Vijayakumaran <[email protected]> Date: Thu Nov 19 18:45:18 2015 +0100 Menüpunkte Home und Impressum hinzugefügt 97
  68. 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
  69. Neuen Branch titel anlegen Legt den Branch titel auf Basis

    von master an: $ git checkout -b titel master Zu neuem Branch 'titel gewechselt' 99
  70. 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
  71. 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
  72. 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
  73. 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
  74. 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
  75. 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
  76. 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
  77. 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
  78. 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
  79. Commit auf master $ git checkout master [About me Link

    hinzufügen…] $ git commit -am "Menu um 'About me' Link erweitert" 111
  80. 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
  81. git log -n 3 $ git log -n 3 commit

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

    von Feature-Branches erzeugt eine schönere Historie als Mergen. 117
  83. 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
  84. 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
  85. 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
  86. git stash $ git status Auf Branch master Unversionierte Dateien:

    (benutzen Sie "git add <Datei>...", um die Änderungen zum Commit vorzumerken) temp 122
  87. 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
  88. 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
  89. 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
  90. 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
  91. 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
  92. 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
  93. 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
  94. 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
  95. Was bisher geschah… • Commits angelegt • Branches angelegt •

    Branches gemergt • Branches rebased • Merge-Konflikte aufgelöst Dies geschah noch alles ausschließlich lokal! 135
  96. 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
  97. 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
  98. 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
  99. Änderungen aus origin/master mergen Angenommen, origin/master hat neue Commits: $

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

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

    origin als zusätzliche Branches verfügbar. 144
  102. 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
  103. Neuer Commit auf master Abbildung 24: master ist origin/master durch

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

    nach dem Push auch auf dem Remote-Repository verfügbar. 152
  108. Push und Pull/Fetch Abbildung 26: Mit git push origin $branchname

    wird der angegebene lokale Branch auf das Remote-Repository hochgeladen. 155
  109. 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
  110. Nicht gemergte Branches auflisten Umgekehrt geht es auch: $ git

    branch --no-merged menu * master more_content titel 157
  111. 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
  112. 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
  113. 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
  114. 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
  115. 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
  116. Neuen Klon anlegen $ cd ~ $ git clone ~/git/meineWebseite.git

    meineWebseite2 $ cd meineWebseite2 Frage: Welches Branches besitzt das neu geklonte Repository? 164
  117. Alle Branches auflisten $ git branch -a * master remotes/origin/HEAD

    -> origin/master remotes/origin/master remotes/origin/new-footer 166
  118. 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
  119. 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
  120. Remote-Repositories anlegen Aufgaben: 1. Bare Remote-Repositories origin, er, ich klonen

    2. Remote-Repositories lokal verknüpfen 3. Remote-Branches fetchen 172
  121. 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
  122. 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
  123. 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
  124. 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