Slide 1

Slide 1 text

@usefulthink t$ git init started... Martin Schuhfuß

Slide 2

Slide 2 text

about me… Martin Schuhfuß / Hamburger (schon immer) / JS-Nerd, octocat-fanboy, Performance-Fetischist / verliebt in unmögliche Aufgaben und elegante Lösungen / Architekt und Entwickler bei spot-media AG (auch schon immer) @usefulthink | github.com/usefulthink

Slide 3

Slide 3 text

und ihr so? / Arbeit mit größeren Teams? / Erfahrung mit Versionsmanagement? / …mit git? / …git auf der Kommandozeile?

Slide 4

Slide 4 text

git started...

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

http://geekandpoke.typepad.com/geekandpoke/2012/07/simply-explained-2.html

Slide 7

Slide 7 text

No content

Slide 8

Slide 8 text

sorry, doesn‘t help.

Slide 9

Slide 9 text

//////////////////////////////////////////////////////////////// ! GIT - the stupid content tracker //////////////////////////////////////////////////////////////// "git" can mean anything, depending on your mood. - random three-letter combination that is pronounceable, and not actually used by any common UNIX command. The fact that it is a mispronunciation of "get" may or may not be relevant. - stupid. contemptible and despicable. simple. Take your pick from the dictionary of slang. - "global information tracker": you're in a good mood, and it actually works for you. Angels sing, and a light suddenly fills the room. - "goddamn idiotic truckload of sh*t": when it breaks Linus Torwalds, git README, initial commit (https://github.com/git/git/blob/master/README)

Slide 10

Slide 10 text

New Oxford American Dictionary Urban Dictionary (http://www.urbandictionary.com/define.php?term=git)

Slide 11

Slide 11 text

Linus Torwalds in einem privaten Interview 2012 (http://typicalprogrammer.com?p=143) git has taken over where Linux left off separating the geeks into know-nothings and know-it-alls. I didn‘t really expect anyone to use it because it‘s so hard to use, but that turns out to be its big appeal. No technology can ever be too arcane or complicated for the black-t-shirt crowd. „

Slide 12

Slide 12 text

Inhalt

Slide 13

Slide 13 text

Inhalt / Everyday git / Grundlagen und Hintergründe I. Graphen und Erreichbarkeit II. git-Objekte und Funktionsweise / Branches und Histories

Slide 14

Slide 14 text

! Inhalt / Warum Git? (siehe http://whygitisbetterthanx.com/) / Umgang mit grafischen Tools und IDE- Integration (ich bin bash-freund, seid es auch) / Viele, viele Varianten und mögliche Parameter der Git-Befehle

Slide 15

Slide 15 text

Everyday git Das wichtigste zum warmwerden…

Slide 16

Slide 16 text

init / clone ~/src $ mkdir git-test ; cd git-test ~/src/git-test $ git init Initialized empty Git repository in ../src/git-test/.git/ git-Repositories einrichten „GIT_DIR“ ~/src $ git clone http://github.com/geeksam/do-re-mi Cloning into 'do-re-mi'... remote: Counting objects: 31, done. remote: Compressing objects: 100% (23/23), done. remote: Total 31 (delta 6), reused 29 (delta 4) Unpacking objects: 100% (31/31), done. Remote-Repository

Slide 17

Slide 17 text

config ~/src/git-test $ git config --global user.name “Vor- und Nachname“ ~/src/git-test $ git config --global user.email “[email protected]“ ~/src/git-test $ git config --global color.ui auto git Konfigurieren (wird der Parameter --global weggelassen, wird die Konfiguration nur für das aktuelle Repository angepasst) Die globale Konfiguration von Git wird in der Datei ~/.gitconfig (ini- Format) im Home-Verzeichnis gespeichert, lokale Konfiguration findet sich im Projektverzeichnis unter .git/config

Slide 18

Slide 18 text

config ~/src/git-test $ git config --global alias.hist \ ‘log --oneline --graph --decorate‘ ~/src/git-test $ git hist Aliase definieren… [alias] hist = log --oneline --graph --decorate sdiff = diff --staged st = status ci = commit --all ~/.gitconfig

Slide 19

Slide 19 text

status ~/local/src/git-test $ git status # On branch master # # Initial commit # nothing to commit (create/copy files and use "git add" to track) Änderungen und sonstige Status-Informationen des Repositories abfragen. ...oder sich sagen lassen was zu tun ist :)

Slide 20

Slide 20 text

add ~/src/git-test $ echo "Hallo Welt" > README.md ~/src/git-test $ git status # On branch master # # Initial commit # # Untracked files: # (use "git add ..." to include in what will be committed) # # README.md nothing added to commit but untracked files present (use "git add" to track) Änderungen in den Index aufnehmen und für den nächsten Commit vorsehen.

Slide 21

Slide 21 text

add ~/src/git-test $ git add README.md ~/src/git-test $ git status # On branch master # # Initial commit # # Changes to be committed: # (use "git rm --cached ..." to unstage) # # new file: README.md # machen wir das doch einfach mal...

Slide 22

Slide 22 text

commit ~/src/git-test $ git commit -m 'first commit' [master (root-commit) dc69a36] first commit 1 files changed, 1 insertions(+), 0 deletions(-) create mode 100644 README.md neuen Snapshot erzeugen DISCLAIMER: Um mich kurzzufassen werde ich keine besonders hilfreichen und/oder sinnvollen commit-messages schreiben. Normalerweise sterben Kätzchen durch solche commit-messages. (-m: commit-message direkt angeben; andernfalls öffnet sich euer $EDITOR)

Slide 23

Slide 23 text

weitere Änderungen ~/src/git-test $ git status # On branch master # Changes not staged for commit: # (use "git add ..." to update what will be committed) # (use "git checkout -- ..." to discard changes in working directory) # # modified: README.md # no changes added to commit (use "git add" and/or "git commit -a") ~/src/git-test $ git add README.md ; git status # On branch master # Changes to be committed: # (use "git reset HEAD ..." to unstage) # # modified: README.md #

Slide 24

Slide 24 text

log und diff ~/src/git-test $ git log commit 2eee492f9f9941e18c0c1449dcfeb46c679ae080 Author: Martin Schuhfuss Date: Fri Jan 6 15:57:59 2012 +0100 first comit ~/src/git-test $ echo "Hello World" > README.md ~/src/git-test $ git diff diff --git a/README.md b/README.md index b7d6715..557db03 100644 --- a/README.md +++ b/README.md @@ -1 +1 @@ -Hallo Welt +Hello World Änderungen nachvollziehen Die Befehle git log und git diff sind extrem vielseitig einsetzbar, abhängig davon, mit welchen Parametern und Argumenten sie aufgerufen werden.

Slide 25

Slide 25 text

noch mehr... weitere Befehle für den alltäglichen Gebrauch git checkout : Änderungen rückgängig machen und Datei im Arbeitsverzeichnis mit dem letzten Snapshot überschreiben*. git reset HEAD : Änderungen im Index / Staging- Bereich rückgängig machen*. git rm : Dateien löschen und aus dem Index entfernen * checkout und reset gehören mit zu den mächtigsten der git-Kommandos. Hier beschrieben ist nur einer der einfachsten der Anwendungsfälle.

Slide 26

Slide 26 text

Ein bisschen Theorie Graphen und Erreichbarkeit.

Slide 27

Slide 27 text

http://xkcd.com/657/

Slide 28

Slide 28 text

http://xkcd.com/657/

Slide 29

Slide 29 text

Krieg der Sterne Die Rache der Sith Das Imperium schlägt zurück Die Rückkehr der Jedi-Ritter Die dunkle Bedrohong Angriff der Klonkrieger 1 2 3 4 5 6 = Nachfolger (Produktionsreihenfolge) star-wars

Slide 30

Slide 30 text

Krieg der Sterne Die Rache der Sith Das Imperium schlägt zurück Die Rückkehr der Jedi-Ritter Die dunkle Bedrohong Angriff der Klonkrieger 1 2 3 4 5 6 = Nachfolger (Storyline) star-wars

Slide 31

Slide 31 text

Krieg der Sterne AUCH ZEITLICHE ABFOLGE IST NICHT IMMER EINDEUTIG :) DIE PRODUKTIONSREIHENFOLGE MUSS NICHT ZWINGEND DIE REIHENFOLGE SEIN, DIE SPÄTER Die Rache der Sith Das Imperium schlägt zurück Die Rückkehr der Jedi-Ritter Die dunkle Bedrohong Angriff der Klonkrieger 1 2 3 4 5 6 = Geschichte baut darauf auf star-wars

Slide 32

Slide 32 text

erste halbwegs lauffähige Version Feature für neue Version beta endlich gelauncht! d‘oh! neue Version = wurde darauf aufgebaut Das. Killer. Feature. master nice_feature Revisions-Graph Referenzen awesomesauce

Slide 33

Slide 33 text

erste halbwegs lauffähige Version Feature für neue Version beta endlich gelauncht! d‘oh! neue Version Das. Killer. Feature. master nice_feature Revisions-Graph Erreichbarkeit awesomesauce 1 2 3 4 5 6 7 master 6 – 4 – 5 – 3 – 2 – 1 nice_feature 4 – 2 – 1 awesomesauce 7 – 5 – 3 – 2 – 1 alter kram Ist über keine der Referenzen zu erreichen! Die History sieht für jede Referenz anders aus

Slide 34

Slide 34 text

Wozu das alles? git wird niemals (wirklich nie) irgendetwas löschen, was über eine Referenz erreichbar ist. (Ihr dürft euch jetzt entspannen.)

Slide 35

Slide 35 text

Eintauchen git-Objekte und Funktionsweise

Slide 36

Slide 36 text

Snapshots CVS/SVN File A Δ1 File B File C Version 1 Version 2 Version 3 Version 4 Version 5 Δ2 Δ1 Δ2 Δ1 Δ2 Δ3 A B C Version 1 Version 2 Version 3 Version 4 Version 5 A1 B C1 A1 B C2 A2 B1 C2 A2 B2 C3 overall-state (exact copy) at a given time changes (Deltas) over time Git

Slide 37

Slide 37 text

Git Objekte 5a9e02d9… loadClassCache(); $kernel->handle(Request::createFromGlobals())->send(); fe32a871… blob a501bc92… .htaccess blob 5a9e02d9… app.php blob 7e22a497… app_dev.php tree 2149b94c… css tree f02b2258… images ef129a71… ef129a71… Tree: Parent: Author: Comitter: fe32a871… a9d81ef3… Martin Martin Awesome commit-message is awesome. Awesome commit-message is awesome. Commit Tree Blob

Slide 38

Slide 38 text

Git Objekte ~/src/git-test $ tree . !"" README.md #"" web !"" index.html #"" style.css ~/src/git-test $ git add . ~/src/git-test $ git stat # On branch master # Changes to be committed: # (use "git reset HEAD ..." to unstage) # # new file: web/index.html # new file: web/style.css # ~/src/git-test $ git commit -m ‘index and styles‘ [master 6434aeb] index and styles 1 files changed, 10 insertions(+), 0 deletions(-) create mode 100644 web/index.html create mode 100644 web/style.css

Slide 39

Slide 39 text

Git Objekte 636af660… Hallo Welt 97cd79d8… blob 636af660… README.md tree 6e6cee32… web 6434aeb7… 6434aeb7… Tree: Parent: 97cd79d8… 2eee492f… index and styles index and styles 2eee49… initial commit 6e6cee32… blob 94d985df… index.html blob e69de29b… style.css 94d985df… Hallo Welt!

Slide 40

Slide 40 text

SHA1 636af660… Hallo Welt e69de29b… Egal wo auf der Welt jemand eine leere Datei in einem git-repository speichert – mit welchem Betriebssystem und welcher git-Version auch immer – diese Datei wird immer denselben SHA1-Hash (e69de29bb2d1d6434b8b29ae775ad8c2e48c5391) erhalten. Aufgrund der tatsächlichen Länge der SHA1-Hashes (160 bit / 2160 mögliche Kombinationen) ist es faktisch ausgeschlossen, dass zwei unterschiedliche Dateien mit denselben SHA1-Wert erhalten. Absolut und global Eindeutige Ids

Slide 41

Slide 41 text

Three Trees working directory index HEAD repository Der aktuelle Checkout. Dies ist das eigentliche Projektverzeichnis und enthält die Dateien, mit denen ihr arbeitet. Staging-Bereich zur Vorbereitung von neuen Snapshots bzw. Commits Der HEAD-Commit zeigt auf den letzten erzeugten Snapshot im aktuellen Branch und ist immer der Snapshot, der zum Parent des nächsten Commits wird.

Slide 42

Slide 42 text

unstage changes Three Trees working directory index stage changes create snapshot git add <file ...> git rm <file ...> git commit git reset <file ...> Die Dateien im Working Directory bleiben unverändert, die Änderungen werden aus dem Index entfernt HEAD repository

Slide 43

Slide 43 text

Three Trees working directory index HEAD repository git reset --hard <file ...> unstage changes git reset <file ...> Die Dateien im Working Directory bleiben unverändert, die Änderungen werden aus dem Index entfernt Unter dem Titel „reset demystified“ gibt auf progit.org (http://progit.org/2011/07/11/reset.html) eine hervorragende Erklärung zu der genauen Funktionsweise von reset und checkout. Sowohl der Index als auch die Working-Copy werden zurückgesetzt

Slide 44

Slide 44 text

working directory index HEAD repository repository master HEAD Beispiel

Slide 45

Slide 45 text

Hallo Welt working directory index HEAD repository repository master HEAD README.md echo “Hallo Welt“ > README.md

Slide 46

Slide 46 text

636af6... working directory index HEAD repository repository master HEAD README.md git add README.md README.md 636af6... Hallo Welt blob

Slide 47

Slide 47 text

working directory index HEAD repository repository master HEAD README.md git commit -m ‘initial commit‘ 636af6... README.md 636af6... README.md README.md: 636af6... 2eee49... master 2eee49... Tree: fd72bd... Author: Martin Comitter: Martin initial commit fd72bd... blob 636af6... README.md 636af6... Hallo Welt commit tree blob

Slide 48

Slide 48 text

Hallo Welt working directory index HEAD repository repository master HEAD README.md 636af6... README.md 636af6... README.md README.md: 636af6... 2eee49... master jetzt ändern wir die README.md… Hello World! README.md 636af6... Hallo Welt

Slide 49

Slide 49 text

Hello World! working directory index HEAD repository repository master HEAD README.md 636af6... README.md 636af6... README.md README.md: 636af6... 2eee49... master git add README.md 636af6... Hallo Welt 7e5411… README.md 7e5411… Hello World!

Slide 50

Slide 50 text

Hello World! working directory index HEAD repository repository README.md 636af6... README.md 7e5411... README.md README.md: 636af6... 2eee49... git commit -m ‘english‘ 636af6... Hallo Welt 7e5411… Hello World! README.md: 7e5411... f6ba12... 7e5411… README.md master HEAD master

Slide 51

Slide 51 text

Unterwegs Branches und Histories

Slide 52

Slide 52 text

A HEAD master master B C Szenario Commit Branch Verweis zum Parent-Commit HEAD …oder auch: der Commit, der zum Parent von neuen Commits wird eine Referenz für eine Commit-Id A, B, C usw. stehen als Platzhalter für die „echten“ Commit-Ids Mit jedem Commit wird die Referenz (master) des aktuellen Branches (vom HEAD angezeigt) automatisch mitbewegt.

Slide 53

Slide 53 text

A B C git branch feature git checkout feature Branch erstellen master Kurzform: git checkout -b feature HEAD feature

Slide 54

Slide 54 text

A B C git commit … Branch erstellen D master HEAD feature

Slide 55

Slide 55 text

feature A B C git checkout master git merge feature fast-forward merge D HEAD master kein neuer commit Bei einem fast-forward merge wird kein separater merge-commit erzeugt, lediglich der Ziel-Branch (master) wird auf die neue Position „Vorgespult“. mit git merge --no-ff feature kann verhindert werden, dass fast- forward merges gemacht werden. Mit dem Parameter --ff-only werden sie erzwungen.

Slide 56

Slide 56 text

A B C git checkout feature git commit … Ein weiterer Commit D E master HEAD feature

Slide 57

Slide 57 text

A B C D E HEAD master feature git checkout master git commit … Bugfixes… F G

Slide 58

Slide 58 text

C D E feature git checkout master git merge feature Merge! F G HEAD master H merge-commit ...hat im Gegensatz zu einem normalen Commit zwei Elternteile und wird aus den Änderungen der beiden Branches kombiniert. Commit-Message: merged branch ‘feature‘ Konflikte ...treten auf, wenn in beiden Branches in denselben Bereichen einer Datei Änderungen vorgenommen wurden

Slide 59

Slide 59 text

master D E C F G Konflikte vermeiden git rebase D‘ E‘ git checkout feature git rebase master HEAD feature git rebase nimmt alle Änderungen aus einem bestehenden Branch und verschiebt diese an eine andere Position. Die Basis (nearest common ancestor) des feature-Branches wird dabei von C zu G ACHTUNG nach dem rebase sind die Original-Commits nur noch über ihre Id erreichbar.

Slide 60

Slide 60 text

ups. irgendwas schief gelaufen? Komisches Zeug auf der Kommandozeile? Irgendwas falsch gemacht?

Slide 61

Slide 61 text

No content

Slide 62

Slide 62 text

git wird niemals (wirklich nie) irgendetwas löschen, was über eine Referenz erreichbar ist. (Ihr dürft euch jetzt auch wieder entspannen.)

Slide 63

Slide 63 text

Der Rückwärtsgang --abort – Alles zurück auf Anfang ~/src/git-test $ $ git rebase master First, rewinding head to replay your work on top of it... Applying: first feature commit Using index info to reconstruct a base tree... Falling back to patching base and 3-way merge... Auto-merging README.md CONFLICT (content): Merge conflict in README.md Failed to merge in the changes. Patch failed at 0001 first feature commit When you have resolved this problem run "git rebase --continue". If you would prefer to skip this patch, instead run "git rebase --skip". To check out the original branch and stop rebasing run "git rebase --abort". ~/src/git-test $ git rebase --abort

Slide 64

Slide 64 text

Der Vorwärtsgang rebase - Konflikte auflösen ~/src/git-test $ $ git rebase master First, rewinding head to replay your work on top of it... Applying: first feature commit Using index info to reconstruct a base tree... Falling back to patching base and 3-way merge... Auto-merging README.md CONFLICT (content): Merge conflict in README.md Failed to merge in the changes. Patch failed at 0001 first feature commit When you have resolved this problem run "git rebase --continue". If you would prefer to skip this patch, instead run "git rebase --skip". To check out the original branch and stop rebasing run "git rebase --abort". Commit-Message des fehlgeschlagenen patches

Slide 65

Slide 65 text

~/src/git-test $ git stat # Not currently on any branch. # Changes to be committed: # (use "git reset HEAD ..." to unstage) # # modified: web/style.css # # Unmerged paths: # (use "git reset HEAD ..." to unstage) # (use "git add/rm ..." as appropriate to mark resolution) # # both modified: README.md # ~/src/git-test $ cat README.md <<<<<<< HEAD Hallo Welt! im branch master kommt was dazu... ======= Hello World >>>>>>> first feature commit Jeder Konflikt innerhalb der Datei wird mit Markierungen versehen. Die Datei wird bearbeitet, und der Konflikt aufgelöst, wobei die MArkierungen entfernt werden. rebase - Konflikte auflösen Der Vorwärtsgang

Slide 66

Slide 66 text

~/src/git-test $ cat README.md Hello World im branch master kommt was dazu... ~/src/git-test $ git add README.md ~/src/git-test $ git stat # Not currently on any branch. # Changes to be committed: # (use "git reset HEAD ..." to unstage) # # modified: README.md # modified: web/style.css # ~/src/git-test $ git rebase --continue Applying: first feature commit Applying: second commit (add file) Applying: third commit (changed README.md) rebase - Konflikte auflösen Der Vorwärtsgang

Slide 67

Slide 67 text

N O master K L M feature-a moar fun with rebase git rebase master feature-b --onto feature-a O‘ N‘ feature-b HEAD feature-b ~/src/git-test $ git rebase master feature-b --onto feature-a First, rewinding head to replay your work on top of it... Applying: first commit on branch feature-b (N $ N‘) Applying: second commit on branch feature-b (O $ O‘) from to new base

Slide 68

Slide 68 text

Schweres Terrain Survival Tips und Werkzeug

Slide 69

Slide 69 text

hilfreiche Befehle git add --patch: interaktives Staging von Änderungen. Hilft, wenn in einer Datei Änderungen sind, die getrennt voneinander comitted werden sollen. git commit --amend: den letzen Commit nochmal bearbeiten. Üblicherweise zum Beheben von Tippfehlern in Commit-Messages aber auch git rebase --interactive: wie commit --amend auf Crack. Mit Kettensäge*. Erlaubt das beliebige Umstellen und nachträgliche Ändern von Commits. Unfassbar mächtig, aber mit Vorsicht zu genießen (vorher immer ein Tag setzen, dann kann man sich zumindest wieder retten, wenns was nicht klappt).

Slide 70

Slide 70 text

hilfreiche Befehle git stash und git stash pop: Mit git stash können alle gerade vorhandenen Änderungen „beiseite gelegt“ werden. Das Working-Directory und der Index werden auf den Stand des HEAD zurückgesetzt. stash pop stellt den beiseite gelegten Stand wieder her. git clean: Räumt unversionierte Dateien aus dem Weg, mit dem Parameter -f werden nur unversionierte Dateien entfernt, mit -d auch die Verzeichnisse. git mergetool: Die UNO oder sowas. Hilft bei der Konfliktlösung.

Slide 71

Slide 71 text

Der hilfreichste Befehl git help

Slide 72

Slide 72 text

http://ndpsoftware.com/git-cheatsheet.html Cheat! (mehr davon unter http://help.github.com/git-cheat-sheets)

Slide 73

Slide 73 text

Online-Hilfe / http://progit.org / http://marklodato.github.com/visual-git-guide / http://book.git-scm.com / http://think-like-a-git.net / http://gitimmersion.com

Slide 74

Slide 74 text

Fragen?

Slide 75

Slide 75 text

Vielen Dank! Martin Schuhfuß @usefulthink Feedback: https://joind.in/7355