8. Version Control with Git Jonathan Brachthäuser
Einordnung: Zusammenfassung Anforderungsermittlung - (Nicht- )funktionale Anf. - Anwendungsfälle - Userstories Problem Anforderung Continuous Delivery & Feedback Testing / TDD / BDD Modellierung - UML - OO- Design - Design / Architektur Patterns - SOLID Design Prinzipien - GRASP Lösung Entwurf Realisierung - Programmierrichtlinien - Code Smells - Versionsverwaltung - Continuous Integration - Code Reviews - Pair Programming - Dokumentation 2
Literaturempfehlung Online verfügbar unter: https://git- scm.com/book/en/v2 Onlinetutorials auf: https://try.github.io und http://gitreal.codeschool.com/ Außerdem: Übungsblätter zu git sind auf der Vorlesungsseite zu finden 3
Versionskontrolle
Was ist Versionskontrolle? Ein Versionskontrollsystem (VCS) speichert... den Inhalt aller Dateien eines Projektes... die gesamte Änderungsgeschichte eines Projektes Wer hat wann und warum, welche Dateien wie geändert? 5
Wozu Versionskontrolle? Zurücksetzen des Projektes auf einen früheren Stand Dokumentation der Projektgeschichte und der Beiträge verschiedener Entwickler Parallele Entwicklung an mehreren Entwicklungszweigen Koordination der Arbeit verschiedener Entwickler 6
Begriffe Repository Änderungsgeschichte und Dateiinhalte für alle Versionen Arbeitskopie Kopie aller Dateien einer Version Status Zusammengefasster Unterschied zwischen der Working Copy und dem Repository Diff Unterschiede der Dateien zwischen Repository und Arbeitskopie oder anderer Version Checkout Dateiinhalte einer Version aus Repository in Working Copy kopieren Commit Derzeitigen Stand der Working Copy als neue Version in das Repository übernehmen 7
Begriffe Repository Änderungsgeschichte und Dateiinhalte für alle Versionen Arbeitskopie Kopie aller Dateien einer Version Status Zusammengefasster Unterschied zwischen der Working Copy und dem Repository Diff Unterschiede der Dateien zwischen Repository und Arbeitskopie oder anderer Version Checkout Dateiinhalte einer Version aus Repository in Working Copy kopieren Commit Derzeitigen Stand der Working Copy als neue Version in das Repository übernehmen 8
Begriffe Repository Änderungsgeschichte und Dateiinhalte für alle Versionen Arbeitskopie Kopie aller Dateien einer Version Status Zusammengefasster Unterschied zwischen der Working Copy und dem Repository Diff Unterschiede der Dateien zwischen Repository und Arbeitskopie oder anderer Version Checkout Dateiinhalte einer Version aus Repository in Working Copy kopieren Commit Derzeitigen Stand der Working Copy als neue Version in das Repository übernehmen 9
Wo ist das Repository gespeichert? Lokale Versionskontrollsysteme Local Computer Working Copy Repository File 2 File 1 Version 3 Version 2 Version 1 10
Wo ist das Repository gespeichert? Zentrale Versionskontrollsysteme Computer A Computer B Working Copy Computer C Working Copy File 2 Working Copy File 2 File File 1 2 File 1 File 1 Central VCS Server Repository Version 3 Version 2 Version 1 11
Wo ist das Repository gespeichert? Verteilte Versionskontrollsysteme Server Computer Computer A Repository Version 3... Working Copy File 1... Repository Version 3... Computer B Repository Version 3... Working Copy File 1... 12
Begriffe Repository Änderungsgeschichte und Dateiinhalte für alle Versionen Arbeitskopie Kopie aller Dateien einer Version Status Zusammengefasster Unterschied zwischen der Working Copy und dem Repository Diff Unterschiede der Dateien zwischen Repository und Arbeitskopie oder anderer Version Checkout Dateiinhalte einer Version aus Repository in Working Copy kopieren Commit Derzeitigen Stand der Working Copy als neue Version in das Repository übernehmen 13
Begriffe Repository Änderungsgeschichte und Dateiinhalte für alle Versionen Arbeitskopie Kopie aller Dateien einer Version Status Zusammengefasster Unterschied zwischen der Working Copy und dem Repository Diff Unterschiede der Dateien zwischen Repository und Arbeitskopie oder anderer Version Checkout Dateiinhalte einer Version aus Repository in Working Copy kopieren Commit Derzeitigen Stand der Working Copy als neue Version in das Repository übernehmen 14
Diffs answer = 7 factor = 3 while (answer < 60) { answer *= factor factor += 1 } vorher answer = 7 factor = 2 while (answer < 40) { answer *= factor factor += 1 } nachher 15 answer = 7 -factor = 3 -while (answer < 60) { +factor = 2 +while (answer < 40) { answer *= factor factor += 1 } diff
Was ist im Repository gespeichert? Diff basierte Versionskontrollsysteme Veränderung über die Zeit Version 1 Version 2 Version 3 File A Δ1 File B File C Δ1 Δ2 16
Was ist im Repository gespeichert? Snapshot basierte Versionskontrollsysteme Veränderung über die Zeit Version 1 Version 2 Version 3 File A A1 A1 File B B B File C C1 C2 17
Begriffe Repository Änderungsgeschichte und Dateiinhalte für alle Versionen Arbeitskopie Kopie aller Dateien einer Version Status Zusammengefasster Unterschied zwischen der Working Copy und dem Repository Diff Unterschiede der Dateien zwischen Repository und Arbeitskopie oder anderer Version Checkout Dateiinhalte einer Version aus Repository in Working Copy kopieren Commit Derzeitigen Stand der Working Copy als neue Version in das Repository übernehmen 18
Begriffe Repository Änderungsgeschichte und Dateiinhalte für alle Versionen Arbeitskopie Kopie aller Dateien einer Version Status Zusammengefasster Unterschied zwischen der Working Copy und dem Repository Diff Unterschiede der Dateien zwischen Repository und Arbeitskopie oder anderer Version Checkout Dateiinhalte einer Version aus Repository in Working Copy kopieren Commit Derzeitigen Stand der Working Copy als neue Version in das Repository übernehmen 19
git
Was ist git? Verteiltes Versionskontrollsystem Ursprünglich von Linus Torvalds zur Versionskontrolle des Linux Kernels entwickelt Heute weit verbreitet in Open Source, als auch zur proprietären Entwicklung 21
Wie funktioniert git? Verteilt Snapshot- basiert Effiziente Speicherung durch Hash- Adressierung Index Viele Kommandozeilenbefehle 22
Drei Schritte in Git Git unterscheidet zwischen Working Copy, Staging Area und Repository Computer Working Copy Staging Area Repository Copy project (checkout) Stage changes (add) Confirm (commit) 23
~ mkdir my-prog 24
my-prog ~ mkdir my-prog ~ 25
my-prog ~ mkdir my-prog ~ ~ cd my-prog 26
my-prog ~ ~ cd my-prog ~/my-prog 27
my-prog ~ ~ cd my-prog ~/my-prog git init 28
my-prog.git ~/my-prog git init Initialized empty Git repository in ~/my-prog/.git/ 29
my-prog.git Hello.java ~/my-prog git init Initialized empty Git repository in ~/my-prog/.git/ 30
my-prog.git Hello.java Initialized empty Git repository in ~/my-prog/.git/ ~/my-prog git add Hello.java 31
index Hello.java my-prog.git Hello.java ~ cd my-prog ~/my-prog git add Hello.java ~/my-prog 32
index Hello.java my-prog.git Hello.java ~ ~ cd my-prog ~/my-prog git add Hello.java ~/my-prog git commit -m "Add hello" 33
HEAD 9ad66d3 index tree Hello.java my-prog.git Hello.java ~/my-prog git commit -m "Add hello" [ 9ad66d3] Add hello 1 file changed, 5 insertions (+) 34
HEAD 9ad66d3 index tree Hello.java ~/my-prog git commit -m "Add hello" [ 9ad66d3] Add hello 1 file changed, 5 insertions (+) 35 my-prog.git Hello.java lib Util.java
HEAD 9ad66d3 index tree Hello.java ~/my-prog git add lib/util.java my-prog.git Hello.java lib Util.java 36
HEAD 9ad66d3 tree index Hello.java Hello.java lib Util.java ~/my-prog git add lib/util.java ~/my-prog my-prog.git Hello.java lib Util.java 37
HEAD 9ad66d3 tree index Hello.java Hello.java lib Util.java ~/my-prog git add lib/util.java ~/my-prog git commit -m "Add util" my-prog.git Hello.java lib Util.java 38
HEAD 9ad66d3 tree index f146864 tree Hello.java Hello.java lib Util.java ~/my-prog git commit -m "Add util" [ f146864] Add util 1 file changed, 3 insertions (+) 39 my-prog.git Hello.java lib Util.java
HEAD 9ad66d3 tree index f146864 tree Hello.java Hello.java lib Util.java ~/my-prog git commit -m "Add util" [ f146864] Add util 1 file changed, 3 insertions (+) 40 my-prog.git Hello.java lib Util.java
HEAD 9ad66d3 tree index f146864 tree Hello.java Hello.java lib Util.java ~/my-prog git add Hello.java my-prog.git Hello.java lib Util.java 41
HEAD 9ad66d3 f146864 tree tree index Hello.java Hello.java lib Util.java Hello.java lib Util.java ~/my-prog git add Hello.java ~/my-prog my-prog.git Hello.java lib Util.java 42
HEAD 9ad66d3 f146864 tree tree index Hello.java Hello.java lib Util.java Hello.java lib Util.java ~/my-prog git add Hello.java ~/my-prog git commit -m "Add bye" my-prog.git Hello.java lib Util.java 43
HEAD 9ad66d3 f146864 153b94c tree tree index tree Hello.java Hello.java lib Util.java Hello.java lib Util.java ~/my-prog git commit -m "Add bye" [ 153b94c] Add bye 1 file changed, 1 insertions (+) 44 my-prog.git Hello.java lib Util.java
Demo (init, status, diff, add (- p), diff - - staged, checkout, commit, log)
Die wichtigsten Befehle (1 / 4) git help Liste wichtiger Befehle git help command Hilfe zu einzelnen Befehlen git init Neues Repository initialisieren git add Arbeitskopie Index git checkout Index Arbeitskopie git commit Index Repository 46
Die wichtigsten Befehle (2 / 4) git status Informationen zur Arbeitskopie und HEAD anzeigen git show commit Informationen zu Commit zeigen git reflog Entwicklung von HEAD zeigen git diff Arbeitskopie vs. Index git diff - - staged Index vs. Head git log Änderungsgeschichte zeigen 47
Branches & Merging
~/my-prog 543 HEAD 49
~/my-prog git add ~/my-prog 543 HEAD 50
~/my-prog git add ~/my-prog git commit ~/my-prog 543 6f5 HEAD 51
~/my-prog git add ~/my-prog git commit ~/my-prog git branch experiment ~/my-prog experiment 543 6f5 HEAD 52
~/my-prog git add ~/my-prog git commit ~/my-prog git branch experiment ~/my-prog git checkout experiment experiment 543 6f5 HEAD 53
~/my-prog git checkout experiment ~/my-prog HEAD experiment 543 6f5 54
~/my-prog git checkout experiment ~/my-prog git add ~/my-prog HEAD experiment 543 6f5 55
~/my-prog git checkout experiment ~/my-prog git add ~/my-prog git commit ~/my-prog HEAD experiment b43 543 6f5 56
~/my-prog git checkout experiment ~/my-prog git add ~/my-prog git commit ~/my-prog git add ~/my-prog HEAD experiment b43 543 6f5 57
HEAD experiment ~/my-prog git checkout experiment ~/my-prog git add ~/my-prog git commit ~/my-prog git add ~/my-prog git commit ~/my-prog b43 aa4 543 6f5 58
HEAD experiment ~/my-prog git checkout experiment ~/my-prog git add ~/my-prog git commit ~/my-prog git add ~/my-prog git commit ~/my-prog git checkout b43 aa4 543 6f5 59
~/my-prog git checkout ~/my-prog experiment b43 aa4 543 6f5 HEAD 60
~/my-prog git checkout ~/my-prog git add ~/my-prog experiment b43 aa4 543 6f5 HEAD 61
~/my-prog git checkout ~/my-prog git add ~/my-prog git commit ~/my-prog experiment b43 aa4 543 6f5 c85 HEAD 62
~/my-prog git checkout ~/my-prog git add ~/my-prog git commit ~/my-prog git add ~/my-prog experiment b43 aa4 543 6f5 c85 HEAD 63
experiment ~/my-prog git checkout ~/my-prog git add ~/my-prog git commit ~/my-prog git add ~/my-prog git commit ~/my-prog b43 aa4 543 6f5 c85 3be HEAD 64
experiment ~/my-prog git checkout ~/my-prog git add ~/my-prog git commit ~/my-prog git add ~/my-prog git commit ~/my-prog git merge experiment b43 aa4 543 6f5 c85 3be HEAD 65
~/my-prog git merge experiment ~/my-prog experiment b43 aa4 543 6f5 a23 c85 3be HEAD 66
~/my-prog git merge experiment ~/my-prog git add ~/my-prog experiment b43 aa4 543 6f5 a23 c85 3be HEAD 67
~/my-prog git merge experiment ~/my-prog git add ~/my-prog git commit ~/my-prog experiment b43 aa4 543 6f5 a23 153 c85 3be HEAD 68
Merge Konflikte Merge Konflikte treten auf, wenn die gleiche Datei in den beiden Branches auf konflingierende Weise geändert wurden. Führt zu Pausieren des Mergevorgangs Beide Änderungen sind in der Konfliktdatei enthalten Die Konfliktdatei muss manuell editiert werden Danach kann der Merge fortgesetzt werden <<<<<<< HEAD:index.html <div id="footer">contact : email.support@github.com</div> ======= <div id="footer"> please contact us at support@github.com </div> >>>>>>> iss53:index.html 69
Demo 2 (branch, checkout commit, merge, cherrypick, blame)
Die wichtigsten Befehle (3 / 4) git checkout commit Commit Index / Arbeitskopie git rm Datei aus Index und Arbeitskopie löschen git merge Mehrere Branches zusammenführen git cherrypick Einzelnen Commit an aktuellen Branch dranhängen git blame Letzte Änderung an Datei Zeile für Zeile anzeigen 71
Arbeiten im Team
Verteilte Versionskontrolle mit Server Ein zentrales Repository ermöglicht vereinfachten Austausch Server Computer A Repository Version 3... Working Copy File 1... Repository Version 3... Computer B Repository Version 3... Working Copy File 1... 73
Begriffe Remote Repository Fetch Push Ein externes Repository im Netzwek / Internet Die lokale Kopie des Remote Repositories im eigenen Repo aktualisieren Die lokale Kopie des Remote Repositories zum externen Repo hochladen Remote Branch Referenz auf einen Branch in einem Remote Repository Remote Tracking Branch Remote Branch, welcher automatisch aktualisiert wird Tracking Branch Lokale Kopie eines Remote Tracking Branches mit einer Referenz auf den "Upstream Branch" 74
Begriffe Remote Repository Fetch Push Ein externes Repository im Netzwek / Internet Die lokale Kopie des Remote Repositories im eigenen Repo aktualisieren Die lokale Kopie des Remote Repositories zum externen Repo hochladen Remote Branch Referenz auf einen Branch in einem Remote Repository Remote Tracking Branch Remote Branch, welcher automatisch aktualisiert wird Tracking Branch Lokale Kopie eines Remote Tracking Branches mit einer Referenz auf den "Upstream Branch" 75
Begriffe Remote Repository Fetch Push Ein externes Repository im Netzwek / Internet Die lokale Kopie des Remote Repositories im eigenen Repo aktualisieren Die lokale Kopie des Remote Repositories zum externen Repo hochladen Remote Branch Referenz auf einen Branch in einem Remote Repository Remote Tracking Branch Remote Branch, welcher automatisch aktualisiert wird Tracking Branch Lokale Kopie eines Remote Tracking Branches mit einer Referenz auf den "Upstream Branch" 76
Begriffe Remote Repository Fetch Push Ein externes Repository im Netzwek / Internet Die lokale Kopie des Remote Repositories im eigenen Repo aktualisieren Die lokale Kopie des Remote Repositories zum externen Repo hochladen Remote Branch Referenz auf einen Branch in einem Remote Repository Remote Tracking Branch Remote Branch, welcher automatisch aktualisiert wird Tracking Branch Lokale Kopie eines Remote Tracking Branches mit einer Referenz auf den "Upstream Branch" 77
Begriffe Remote Repository Fetch Push Ein externes Repository im Netzwek / Internet Die lokale Kopie des Remote Repositories im eigenen Repo aktualisieren Die lokale Kopie des Remote Repositories zum externen Repo hochladen Remote Branch Referenz auf einen Branch in einem Remote Repository Remote Tracking Branch Remote Branch, welcher automatisch aktualisiert wird Tracking Branch Lokale Kopie eines Remote Tracking Branches mit einer Referenz auf den "Upstream Branch" 78
Begriffe Remote Repository Fetch Push Ein externes Repository im Netzwek / Internet Die lokale Kopie des Remote Repositories im eigenen Repo aktualisieren Die lokale Kopie des Remote Repositories zum externen Repo hochladen Remote Branch Referenz auf einen Branch in einem Remote Repository Remote Tracking Branch Remote Branch, welcher automatisch aktualisiert wird Tracking Branch Lokale Kopie eines Remote Tracking Branches mit einer Referenz auf den "Upstream Branch" 79
Begriffe Remote Repository Fetch Push Ein externes Repository im Netzwek / Internet Die lokale Kopie des Remote Repositories im eigenen Repo aktualisieren Die lokale Kopie des Remote Repositories zum externen Repo hochladen Remote Branch Referenz auf einen Branch in einem Remote Repository Remote Tracking Branch Remote Branch, welcher automatisch aktualisiert wird Tracking Branch Lokale Kopie eines Remote Tracking Branches mit einer Referenz auf den "Upstream Branch" 80
~/project git clone me@git.company.com:project git.company.com 543 6f5 My Computer 81
~/project git clone me@git.company.com:project ~/project git.company.com 543 6f5 My Computer origin/ 543 6f5 HEAD 82
~/project git add ~/project git commit ~/project git.company.com 543 6f5 My Computer origin/ 543 6f5 HEAD 83
~/project git add ~/project git commit ~/project git.company.com 543 6f5 My Computer origin/ 543 6f5 c85 HEAD 84
~/project git add ~/project git commit ~/project git.company.com 543 6f5 My Computer origin/ 543 6f5 c85 3be HEAD 85
Jemand anderes arbeitet parallel und aktualisiert das Remote Repository vor uns git.company.com 543 6f5 My Computer origin/ 543 6f5 c85 3be HEAD 86
Jemand anderes arbeitet parallel und aktualisiert das Remote Repository vor uns git.company.com 543 6f5 b43 My Computer origin/ 543 6f5 c85 3be HEAD 87
Jemand anderes arbeitet parallel und aktualisiert das Remote Repository vor uns git.company.com 543 6f5 b43 aa4 My Computer origin/ 543 6f5 c85 3be HEAD 88
~/project git fetch ~/project git.company.com 543 6f5 b43 aa4 My Computer b43 aa4 origin/ 543 6f5 c85 3be HEAD 89
~/project git merge origin/ ~/project git.company.com 543 6f5 b43 aa4 My Computer b43 aa4 origin/ 543 6f5 c85 3be a23 HEAD 90
~/project git push origin : ~/project git.company.com 543 6f5 b43 aa4 c85 3be a23 My Computer b43 aa4 origin/ 543 6f5 c85 3be a23 HEAD 91
Rebase Workflow
experiment ~/my-prog git checkout ~/my-prog git add ~/my-prog git commit ~/my-prog git add ~/my-prog git commit ~/my-prog git checkout experiment b43 aa4 543 6f5 c85 3be HEAD 93
~/my-prog git checkout experiment ~/my-prog git rebase HEAD experiment b43 aa4 543 6f5 c85 3be 94
~/my-prog git checkout experiment ~/my-prog git rebase ~/my-prog HEAD experiment f21 834 543 6f5 c85 3be 95
~/my-prog git checkout experiment ~/my-prog git rebase ~/my-prog git checkout ~/my-prog experiment f21 834 543 6f5 c85 3be HEAD 96
~/my-prog git checkout experiment ~/my-prog git rebase ~/my-prog git checkout ~/my-prog git merge experiment experiment f21 834 543 6f5 c85 3be HEAD 97
~/my-prog git checkout experiment ~/my-prog git rebase ~/my-prog git checkout ~/my-prog git merge experiment ~/my-prog experiment 543 6f5 c85 3be f21 834 HEAD 98
~/my-prog git checkout experiment ~/my-prog git rebase ~/my-prog git checkout ~/my-prog git merge experiment ~/my-prog git branch -d experiment ~/my-prog 543 6f5 c85 3be f21 834 HEAD 99
Demo 3 (clone, fetch, push, pull, rebase)
Die wichtigsten Befehle (4 / 4) git clone url Remote Repo Lokales Repo git fetch remote Remote Tracking Branches des lokalen Repos aktualisieren git push remote branch Lokales Repo Remote Repo git pull Bei Tracking Branches: Abkürzung für git fetch; git merge git rebase branch Die Commits vom aktuellen Branch in Diffs umwandeln und den angegebenen Branch als Basis verwenden 101
Probeklausur
Tutorinnen & Tutoren gesucht für Info 1