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
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
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
$ 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
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
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
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
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
welchem Zustand sich die Änderung befindet. Reset: • Änderungen in der Staging-Area (zuvor kennengelernt) • Commits löschen Revert: • Commits mit Revert-Commits 51
$ 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
$ 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
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
• „abzweigen“ vom aktuellen Entwicklungsbranch • Pflege von mehreren Entwicklungslinien • einfaches Wechseln zwischen den Branches • Arbeitsvorgang abhängig vom Entwicklungsprozess 72
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
'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
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
index.html KONFLIKT (Inhalt): Merge-Konflikt in index.html Automatischer Merge fehlgeschlagen; beheben Sie die Konflikte und committen Sie dann das Ergebnis. 102
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
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
# 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
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
Änderungen, die nicht zum Commit vorgemerkt sind: geändert: index.html keine Änderungen zum Commit vorgemerkt Gelöscht refs/stash@{0} (5ad2602567242ed1b3714d44a2da7db60762d5d2) 126
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
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
titel remotes/origin/master remotes/origin/menu remotes/origin/more_content remotes/origin/titel Branches können auch ohne remotes/ ausgecheckt werden. 146
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
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
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
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
[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