• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
git started – IPC2012
 

git started – IPC2012

on

  • 738 views

 

Statistics

Views

Total Views
738
Views on SlideShare
738
Embed Views
0

Actions

Likes
0
Downloads
7
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    git started – IPC2012 git started – IPC2012 Presentation Transcript

    • t$ git init started...Martin Schuhfuß@usefulthink
    • 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
    • und ihr so?/ Arbeit mit größeren Teams?/ Erfahrung mit Versionsmanagement?/ …mit git?/ …git auf der Kommandozeile?
    • git started...
    • http://geekandpoke.typepad.com/geekandpoke/2012/07/simply-explained-2.html
    • sorry, doesn‘t help.
    • ////////////////////////////////////////////////////////////////! 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": youre 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)
    • New Oxford American Dictionary Urban Dictionary (http://www.urbandictionary.com/define.php?term=git)
    • „git has taken over where Linux left off separating the geeksinto know-nothings and know-it-alls. I didn‘t really expectanyone to use it because it‘s so hard to use, but that turnsout to be its big appeal.No technology can ever be too arcane or complicated for theblack-t-shirt crowd. Linus Torwalds in einem privaten Interview 2012 (http://typicalprogrammer.com?p=143)
    • Inhalt
    • Inhalt/ Everyday git/ Grundlagen und Hintergründe I. Graphen und Erreichbarkeit II. git-Objekte und Funktionsweise/ Branches und Histories
    • ! 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
    • Everyday gitDas wichtigste zum warmwerden…
    • init / clone git-Repositories einrichten~/src $ mkdir git-test ; cd git-test~/src/git-test $ git init „GIT_DIR“Initialized empty Git repository in ../src/git-test/.git/~/src $ git clone http://github.com/geeksam/do-re-miCloning into do-re-mi...remote: Counting objects: 31, done. Remote-Repositoryremote: Compressing objects: 100% (23/23), done.remote: Total 31 (delta 6), reused 29 (delta 4)Unpacking objects: 100% (31/31), done.
    • config git Konfigurieren~/src/git-test $ git config --global user.name “Vor- und Nachname“~/src/git-test $ git config --global user.email “someone@example.com“~/src/git-test $ git config --global color.ui auto(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
    • config Aliase definieren… ~/src/git-test $ git config --global alias.hist ‘log --oneline --graph --decorate‘ ~/src/git-test $ git hist~/.gitconfig [alias] hist = log --oneline --graph --decorate sdiff = diff --staged st = status ci = commit --all
    • statusÄnderungen und sonstige Status-Informationen des Repositories abfragen. ...oder sich sagen lassen was zu tun ist :) ~/local/src/git-test $ git status # On branch master # # Initial commit # nothing to commit (create/copy files and use "git add" to track)
    • addÄnderungen in den Index aufnehmen und für den nächsten Commit vorsehen.~/src/git-test $ echo "Hallo Welt" > README.md~/src/git-test $ git status# On branch master## Initial commit## Untracked files:# (use "git add <file>..." to include in what will be committed)## README.mdnothing added to commit but untracked files present (use "git add" to track)
    • add machen wir das doch einfach mal...~/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 <file>..." to unstage)## new file: README.md#
    • commit neuen Snapshot erzeugen~/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 (-m: commit-message direkt angeben; andernfalls öffnet sich euer $EDITOR) DISCLAIMER: Um mich kurzzufassen werde ich keine besonders hilfreichen und/oder sinnvollen commit-messages schreiben. Normalerweise sterben Kätzchen durch solche commit-messages.
    • weitere Änderungen~/src/git-test $ git status# On branch master# Changes not staged for commit:# (use "git add <file>..." to update what will be committed)# (use "git checkout -- <file>..." 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 <file>..." to unstage)## modified: README.md#
    • log und diff Änderungen nachvollziehen~/src/git-test $ git logcommit 2eee492f9f9941e18c0c1449dcfeb46c679ae080Author: Martin Schuhfuss <m.schuhfuss@gmail>Date: Fri Jan 6 15:57:59 2012 +0100 first comit~/src/git-test $ echo "Hello World" > README.md~/src/git-test $ git diffdiff --git a/README.md b/README.mdindex b7d6715..557db03 100644--- a/README.md+++ b/README.md@@ -1 +1 @@-Hallo Welt+Hello World Die Befehle git log und git diff sind extrem vielseitig einsetzbar, abhängig davon, mit welchen Parametern und Argumenten sie aufgerufen werden.
    • noch mehr...weitere Befehle für den alltäglichen Gebrauchgit checkout <datei>: Änderungen rückgängig machen undDatei im Arbeitsverzeichnis mit dem letzten Snapshotüberschreiben*.git reset HEAD <datei>: Änderungen im Index / Staging-Bereich rückgängig machen*.git rm <datei>: Dateien löschen und aus dem Indexentfernen* checkout und reset gehören mit zu den mächtigsten der git-Kommandos. Hier beschrieben ist nur einer der einfachsten der Anwendungsfälle.
    • Ein bisschen Theorie Graphen und Erreichbarkeit.
    • http://xkcd.com/657/
    • http://xkcd.com/657/
    • star-wars Das Imperium Die Rückkehr Die dunkle Angriff der Die RacheKrieg der Sterne Bedrohong Klonkrieger schlägt zurück der Jedi-Ritter der Sith 1 2 3 4 5 6 = Nachfolger (Produktionsreihenfolge)
    • star-warsDie dunkle Angriff der Die Rache Das Imperium Die RückkehrBedrohong Klonkrieger Krieg der Sterne der Sith schlägt zurück der Jedi-Ritter 4 5 6 1 2 3 = Nachfolger (Storyline)
    • AUCH ZEITLICHE ABFOLGE IST star-wars NICHT IMMER EINDEUTIG :) DIE PRODUKTIONSREIHENFOLGE MUSS NICHT ZWINGEND DIE REIHENFOLGE SEIN, DIE SPÄTERDie dunkle Angriff der Die Rache Das Imperium Die RückkehrBedrohong Klonkrieger Krieg der Sterne der Sith schlägt zurück der Jedi-Ritter 4 5 6 1 2 3 = Geschichte baut darauf auf
    • Revisions-Graph Referenzen nice_feature Feature für neue Version master erste halbwegs endlich beta d‘oh! neue Versionlauffähige Version gelauncht! Das. Killer. Feature. awesomesauce = wurde darauf aufgebaut
    • Revisions-Graph Erreichbarkeit Ist über keineder Referenzen zu erreichen! nice_feature 4 alter Feature für neue kram Version master 1 2 3 5 6 erste halbwegs endlich beta d‘oh! neue Version lauffähige Version gelauncht! 7 Das. Killer. Feature. master 6–4–5–3–2–1 Die History sieht awesomesauce nice_feature 4–2–1 für jede Referenz anders aus awesomesauce 7–5–3–2–1
    • Wozu das alles? git wird niemals (wirklich nie)irgendetwas löschen, was über eine Referenz erreichbar ist. (Ihr dürft euch jetzt entspannen.)
    • Eintauchengit-Objekte und Funktionsweise
    • SnapshotsCVS/SVN Version 1 Version 2 Version 3 Version 4 Version 5 changes (Deltas) File A Δ1 Δ2 over time File B Δ1 Δ2 File C Δ1 Δ2 Δ3 Git Version 1 Version 2 Version 3 Version 4 Version 5overall-state(exact copy) A A1 A1 A2 A2 at a given time B B B B1 B2 C C1 C2 C2 C3
    • Git Objekte 5a9e02d9… <?php ef129a71… require_once __DIR__./../app/bootstrap.php.cache; require_once __DIR__./../app/AppKernel.php; Tree: fe32a871… use SymfonyComponentHttpFoundationRequest; Parent: a9d81ef3… $kernel = new AppKernel(prod, false); $kernel->loadClassCache(); Author: Martin $kernel->handle(Request::createFromGlobals())->send();Comitter: Martin Awesome commit-message is Blob awesome. Commit fe32a871… blob a501bc92… .htaccess blob 5a9e02d9… app.php blob 7e22a497… app_dev.php tree 2149b94c… css tree f02b2258… images Tree
    • 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 <file>..." 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
    • 2eee49… Git Objekteinitial commit 636af660… 97cd79d8… Hallo Welt blob 636af660… README.md tree 6e6cee32… web 6434aeb7… Tree: 97cd79d8… Parent: 2eee492f… 94d985df… index and styles <!DOCTYPE html> <html> <head> 6e6cee32… <title>Hallo Welt!</title> <link rel="stylesheet" href="st… </head> <body> blob 94d985df… index.html <h1>Hallo Welt!</h1> </body> blob e69de29b… style.css </html> e69de29b… <leer>
    • SHA1 e69de29b… 636af660… <leer> Hallo Welt Absolut und global Eindeutige Ids Egal wo auf der Welt jemand eine leere Datei in einem git-repositoryspeichert – 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.
    • Three Trees working HEAD index directory repositoryDer aktuelle Checkout. Staging-Bereich zur Der HEAD-CommitDies ist das eigentliche Vorbereitung von zeigt auf den letztenProjektverzeichnis und neuen Snapshots bzw. erzeugten Snapshot imenthält die Dateien, mit Commits aktuellen Branch und denen ihr arbeitet. ist immer der Snapshot, der zum Parent des nächsten Commits wird.
    • Three Trees git add <file ...> git commit git rm <file ...> stage create changes snapshotworking HEAD indexdirectory repository unstage changes git reset <file ...> Die Dateien im Working Directory bleiben unverändert, die Änderungen werden aus dem Index entfernt
    • Three Trees Sowohl der Index als auch die Working-Copy werden zurückgesetzt git reset --hard <file ...> working HEAD index directory repository unstage changes git reset <file ...> Die Dateien im Working Directory bleiben unverändert, die Änderungen werden aus dem Index entferntUnter 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.
    • HEAD repository master Beispielworking HEAD indexdirectory repository
    • HEAD repository masterworking HEAD indexdirectory repository README.md Hallo Welt echo “Hallo Welt“ > README.md
    • HEAD repository master 636af6... Hallo Welt blobworking HEAD indexdirectory repository README.md README.md 636af6... git add README.md
    • HEAD repository master 2eee49... fd72bd... 636af6... 2eee49... Tree: fd72bd... blob 636af6... README.md Hallo Welt Author: MartinREADME.md: 636af6... Comitter: Martin tree blob initial commitworking commit HEAD indexdirectory repository README.md README.md README.md 636af6... 636af6... git commit -m ‘initial commit‘
    • HEAD repository master 636af6... 2eee49... Hallo WeltREADME.md: 636af6...working HEAD indexdirectory repository README.md README.md README.md Hello World! Hallo Welt 636af6... 636af6... jetzt ändern wir die README.md…
    • HEAD repository master 7e5411… 636af6... 2eee49... Hello World! Hallo WeltREADME.md: 636af6...working HEAD indexdirectory repository README.md README.md README.md Hello World! 7e5411… 636af6... 636af6... git add README.md
    • HEAD repository master 7e5411… 636af6... 2eee49... f6ba12... Hello World! Hallo WeltREADME.md: 636af6... README.md: 7e5411...working HEAD indexdirectory repository README.md README.md README.md Hello World! 7e5411... 7e5411… 636af6... git commit -m ‘english‘
    • UnterwegsBranches und Histories
    • Szenario HEAD …oder auch: der Commit, HEAD der zum Parent von neuen Commits wird master Branch A B C eine Referenz für eine Commit-Id Commit A, B, C usw. stehen als Platzhalter für die Verweis zum „echten“ Commit-Ids Parent-CommitMit jedem Commit wird die Referenz (master) des aktuellen Branches (vom HEAD angezeigt) automatisch mitbewegt.
    • Branch erstellen master A B C feature HEAD Kurzform:git checkout -b feature git branch feature git checkout feature
    • Branch erstellen masterA B C D feature HEAD git commit …
    • fast-forward merge HEAD master A B C D feature mit git merge --no-ff featurekann verhindert werden, dass fast- kein neuer commit forward merges gemacht werden. Bei einem fast-forward Mit dem Parameter --ff-only merge wird kein separater werden sie erzwungen. merge-commit erzeugt, lediglich der Ziel-Branch git checkout master (master) wird auf die neue Position „Vorgespult“. git merge feature
    • Ein weiterer Commit master A B C D E feature HEAD git checkout feature git commit …
    • Bugfixes… HEAD master F GA B C D E feature git checkout master git commit …
    • Merge! Konflikte ...treten auf, wenn in beiden HEAD Commit-Message:Branches in denselben Bereichen merged branch ‘feature‘ einer Datei Änderungen vorgenommen wurden master F G H C D E feature merge-commit ...hat im Gegensatz zu einem normalen Commit zwei Elternteile und wird aus den Änderungen der beiden Branches kombiniert. git checkout master git merge feature
    • Konflikte vermeiden git rebase master F G D‘ E‘C D E feature ACHTUNG nach dem rebase sind die HEAD git rebase nimmt alle Original-Commits nur noch Änderungen aus einem über ihre Id erreichbar. bestehenden Branch und verschiebt diese an eine andere Position. Die Basis (nearest common ancestor) des feature-Branches wird dabei von C zu G git checkout feature git rebase master
    • ups. irgendwas schief gelaufen?Komisches Zeug auf der Kommandozeile? Irgendwas falsch gemacht?
    • git wird niemals (wirklich nie)irgendetwas löschen, was über eine Referenz erreichbar ist. (Ihr dürft euch jetzt auch wieder entspannen.)
    • Der Rückwärtsgang --abort – Alles zurück auf Anfang~/src/git-test $ $ git rebase masterFirst, rewinding head to replay your work on top of it...Applying: first feature commitUsing index info to reconstruct a base tree...Falling back to patching base and 3-way merge...Auto-merging README.mdCONFLICT (content): Merge conflict in README.mdFailed to merge in the changes.Patch failed at 0001 first feature commitWhen 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
    • Der Vorwärtsgang rebase - Konflikte auflösen~/src/git-test $ $ git rebase masterFirst, rewinding head to replay your work on top of it...Applying: first feature commitUsing index info to reconstruct a base tree... Commit-Message desFalling back to patching base and 3-way merge... fehlgeschlagenen patchesAuto-merging README.mdCONFLICT (content): Merge conflict in README.mdFailed to merge in the changes.Patch failed at 0001 first feature commitWhen 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".
    • Der Vorwärtsgang rebase - Konflikte auflösen~/src/git-test $ git stat# Not currently on any branch.# Changes to be committed:# (use "git reset HEAD <file>..." to unstage)## modified: web/style.css## Unmerged paths:# (use "git reset HEAD <file>..." to unstage)# (use "git add/rm <file>..." as appropriate to mark resolution)## both modified: README.md Jeder Konflikt innerhalb der Datei# wird mit Markierungen versehen.~/src/git-test $ cat README.md Die Datei wird bearbeitet, und der<<<<<<< HEAD Konflikt aufgelöst, wobei dieHallo Welt! MArkierungen entfernt werden.im branch master kommt was dazu...=======Hello World>>>>>>> first feature commit
    • Der Vorwärtsgang rebase - Konflikte auflösen~/src/git-test $ cat README.mdHello Worldim 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 <file>..." to unstage)## modified: README.md# modified: web/style.css#~/src/git-test $ git rebase --continueApplying: first feature commitApplying: second commit (add file)Applying: third commit (changed README.md)
    • moar fun with rebase feature-b HEAD master N O feature-b K L M N‘ O‘ feature-a git rebase master feature-b --onto feature-a from to new base~/src/git-test $ git rebase master feature-b --onto feature-aFirst, 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‘)
    • Schweres Terrain Survival Tips und Werkzeug
    • hilfreiche Befehlegit add --patch: interaktives Staging von Änderungen. Hilft,wenn in einer Datei Änderungen sind, die getrenntvoneinander comitted werden sollen.git commit --amend: den letzen Commit nochmalbearbeiten. Üblicherweise zum Beheben von Tippfehlern inCommit-Messages aber auchgit rebase --interactive: wie commit --amend auf Crack. MitKettensäge*. Erlaubt das beliebige Umstellen undnachträgliche Ändern von Commits. Unfassbar mächtig,aber mit Vorsicht zu genießen (vorher immer ein Tagsetzen, dann kann man sich zumindest wieder retten,wenns was nicht klappt).
    • hilfreiche Befehlegit stash und git stash pop: Mit git stash können alle geradevorhandenen Änderungen „beiseite gelegt“ werden. DasWorking-Directory und der Index werden auf den Stand desHEAD zurückgesetzt. stash pop stellt den beiseite gelegtenStand wieder her.git clean: Räumt unversionierte Dateien aus dem Weg, mitdem Parameter -f werden nur unversionierte Dateienentfernt, mit -d auch die Verzeichnisse.git mergetool: Die UNO oder sowas. Hilft bei derKonfliktlösung.
    • Der hilfreichste Befehl git help
    • Cheat!http://ndpsoftware.com/git-cheatsheet.html (mehr davon unter http://help.github.com/git-cheat-sheets)
    • 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
    • Fragen?
    • Vielen Dank!Feedback: Martin Schuhfußhttps://joind.in/7355 @usefulthink