git - eine praktische Einführung

11,641 views

Published on

Eine praktische Einführung in git.

Published in: Technology
0 Comments
6 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
11,641
On SlideShare
0
From Embeds
0
Number of Embeds
1,512
Actions
Shares
0
Downloads
0
Comments
0
Likes
6
Embeds 0
No embeds

No notes for slide

git - eine praktische Einführung

  1. 1. Eine praktische Einführung
  2. 2. Marcel Eichner @ephigeniaSeit 2000 PHP- & Frontend- Entwickler Founder und CxO von foo(bugs)
  3. 3. Git ([ɡɪt], engl. Blödmann) ist eine freieSoftware zur verteilten Versionsverwaltungvon Dateien, die von Linus Torwvaldsursprünglich für die Quellcode-Verwaltungdes Linux-Kernels entwickelt wurde.
  4. 4. Wieso git?• Klein und schnell!• Schnelles Branching & Merging• Verteilte Repositories (indirekter Backup)• Freie, offene Software• Daten-Sicherheit durch Content-Hashes http://git-scm.com/about/
  5. 5. Geschwindigkeit• (fast) Alle Operationen lokal• .git Verzeichnis nur auf root Ebene• http://git-scm.com/ about/small-and-fast
  6. 6. Eigenschaften
  7. 7. Dezentralität• Klon des kompletten Repositories lokal• ermöglicht andere Workflows• lokales branchen, commiten, reverten etc.
  8. 8. Hashes statt Nummern• dezentrale Architektur erlaubt keine fortlaufende Revions-Nummerierung• Inhalte zählen mehr als Struktur• Identifizierung einzelner Commits über Content-Hashes (SHA-1)
  9. 9. Nicht-lineare EntwicklungRechner 1 A B Branch Master Remote 1 2 3 Head remote/master (origin)Rechner 2 X Y
  10. 10. Vier Ebenen Remote Repository pushpullclone Local Repository commit Stage checkout add Working Directory
  11. 11. Praxis
  12. 12. KonfigurationEinstellung für Identifikation in git $ git config --global user.name "Marcel Eichner" $ git config --global user.email "marcel.eichner@foobugs.com" # ~/.gitconfig [user] name = Marcel Eichner email = marcel.eichner@foobugs.com
  13. 13. Repository erstellenLokales Repository erstellen $ mkdir myrepo $ cd myrepo $ git init Initialized empty Git repository in ../myrepo/.git
  14. 14. Arbeiten ...$ echo "Hello World" > index.html
  15. 15. git statusAnzeigen aller geänderten und gelöschten Dateien $ git status # On branch master # # Initial commit # # Changes to be committed: # (use "git rm --cached <file>..." to unstage) # # new file: index.html # # 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: index.html
  16. 16. StagingEine oder mehrere bestimmte Dateien stagen $ git add index.html $ git add *.htmlAlle Änderungen stagen (inklusive gelöschter Dateien) $ git add --all
  17. 17. CommitÄnderungen in Stage mit einer Nachricht ins lokale Repo comitten $ command git commit -m "My first commit" [master 7626937] changed 1 files changed, 1 insertions(+), 1 deletions(-)
  18. 18. Shortcut: Stage & CommitAlle Änderungen stagen und sofort commiten $ git commit -a -m "My Message" [master 7626937] changed 1 files changed, 1 insertions(+), 1 deletions(-)Letzte Commit-Message editieren $ git commit --amend
  19. 19. Remote Repo klonengit remote repository in den Ordner "mydir" klonen $ git clone git@192.168.123.212:testing.git mydir Cloning into mydir... remote: Counting objects: 3, done. remote: Total 3 (delta 0), reused 0 (delta 0) Receiving objects: 100% (3/3), done.
  20. 20. Commits hochschiebenAlle commits zum Remote pushen $ git push origin master # Counting objects: 5, done. # Writing objects: 100% (3/3), 272 bytes, done. # Total 3 (delta 0), reused 0 (delta 0) # To git@192.168.123.212:testing.git # edfec50..2fc284e master -> masterAllgemeine Syntax $ git push [remote-name] [remote-branch-name]
  21. 21. BranchingBranch anlegen und auschecken $ git branch my-rad-feature $ git checkout my-rad-feature Switched to branch my-rad-feature $ echo "My Branch is different" > index.html $ git commit -a -m "changed content to my branch"
  22. 22. Branches listenAlle verfügbaren lokalen branches anzeigen $ git branch master * my-rad-featureAlle verfügbaren branches anzeigen (lokal & remote) $ git branch -a master * my-rad-feature remotes/origin/HEAD -> origin/master remotes/origin/master
  23. 23. Branch -> Remote"my-rad-feature"-Branch ins Remote schieben $ git push origin my-rad-feature Counting objects: 6, done. Delta compression using up to 4 threads. Compressing objects: 100% (2/2), done. Writing objects: 100% (6/6), 482 bytes, done. Total 6 (delta 0), reused 0 (delta 0) To git@192.168.123.212:testing.git * [new branch] my-rad-feature -> my-rad-feature
  24. 24. Änderungen holenAlle Änderungen vom Repository holen $ git pull remote: Counting objects: 7, done. remote: Compressing objects: 100% (4/4), done. remote: Total 4 (delta 2), reused 0 (delta 0) Updating 361303d..f2cd831 Fast forward index.html | 1 + 1 files changed, 1 insertions(+), 0 deletions(-)
  25. 25. Branch MergingIn den Merge-Ziel-Branch wechseln und mergen # assume we are in branch "my-rad-feature" and everything commited $ git checkout master Switched to branch master $ git merge my-rad-feature Updating edfec50..2bc1785 Fast-forward Än de r u nge n s in dn index.html | 2 +- Re mo te S e r ve r. o ch n ich t au f de m Da 1 files changed, 1 insertions(+), 1 deletions(-) mus s m a n imm m it s ie do rt la n de n e r n o ch e inm a l git push o rigin mast aus füh re n ! er
  26. 26. WiederherstellenGelöschte Datei wieder herstellen $ git checkout index.html
  27. 27. git remoteLocales Repository mit dem Remote verbinden $ git remote add origin git@192.168.123.212:testing.git $ git push origin master Counting objects: 3, done. Writing objects: 100% (3/3), 231 bytes, done. Total 3 (delta 0), reused 0 (delta 0) To git@192.168.123.212:testing.git * [new branch] master -> master
  28. 28. weitere nützliche Befehle
  29. 29. LogLog des gesamten Repositories anzeigen $ git log commit edfec504eb864dc667f3f5b9d301617036d15f3a Author: Marcel Eichner <marcel.eichner@foobugs.com> Date: Thu Jun 7 15:37:26 2012 +0200 My First Commit
  30. 30. Log ExtendedAnzeige des Baum-graphen im Log $ git log --graphFilter nach Zeit & Autor $ git log --before="2 weeks ago" --after="2012-04-01" --author="Marcel Eichner"Log einer Datei mit Inhalt Merge $ git log -p index.htmlcommit message filter $ git log --grep="fixed"
  31. 31. tagDen aktuellen branch und stand taggen $ git tag "release-2012-11-06_12-30-12"Alle Tags listen $ git tag
  32. 32. blameBlame für eine Datei $ git blame index.html 2fc284e5 (Marcel Eichner 2012-06-07 15:43:47 +0200 1) Hello World it’s me!Revision Hash Committer Datum der ÄnderungBlame zu einem bestimmten Zeitpunkt $ git blame index.html [REVISION]
  33. 33. help$ git [command] --helpNAME git-blame - Show what revision and author last modified each line of a fileSYNOPSIS git blame [-c] [-b] [-l] [--root] [-t] [-f] [-n] [-s] [-e] [-p] [-w] [--incremental][-L n,m] [-S <revs-file>] [-M] [-C] [-C] [-C] [--since=<date>] [--abbrev=<n>] [<rev> | --contents <file> | --reverse <rev>] [--] <file>DESCRIPTION Annotates each line in the given file with information from the revision which lastmodified the line. Optionally, start annotating from the given revision. The command can also limit the range of lines annotated.
  34. 34. ZwischenablageAlle Änderungen in die Zwischenablage des lokalen git Repositories schieben $ git stashÄnderungen wieder zurückholen $ git stash applyListe aller Objekte in Zwischenablage $ git stash listSpezifischen Eintrag (2. Eintrag) aus Zwischenablage wieder herstellen $ git stash apply stash@{1}
  35. 35. IgnorierenProjekt-Spezifische ignores $ cat .gitignore # specific files in all directories .DS_Store # wildcards *.tmp # ignore whole directories tmp/**/*globale .gitignore $ git config --global core.excludesfile ~/.gitignore
  36. 36. Sub-Modules• Vergleichbar mit Subversion- Externals• Geklontes Submodule verhält sich wie ein eigenes Git Repository• DRY (Komponenten, Plugins etc.)
  37. 37. Submodul hinzufügen$ git submodule add https://github.com/jeresig/jquery.hotkeys.gitpublic/js/vendor/jquery.hotkeys.gitCloning into public/js/vendor/jquery.hotkeys.git...remote: Counting objects: 171, done.remote: Compressing objects: 100% (79/79), done.remote: Total 171 (delta 104), reused 155 (delta 91)Receiving objects: 100% (171/171), 170.27 KiB | 204 KiB/s, done.Resolving deltas: 100% (104/104), done.
  38. 38. Hooks• Beispielscripte werden automatisch in .git/hooks erstellt• Client-Side Post-/Pre-Commit• Server-Side Post-/Pre-Push
  39. 39. Hook-Beispiele• E-Mail-Notification bei Push• IRC / Jabber-Nachrichten bei Push• PHPUnit Tests automatisch ausführen beim Commit• PHPLint Syntax-Check beim Commit
  40. 40. git-svn• Subversion Repository mit git nutzen• Geschwindigkeit von git für SVN repositories• Merging, Branching wie man es aus git gewohnt ist
  41. 41. Branching-Strategie
  42. 42. http://nvie.com/posts/a-successful-git-branching-model/
  43. 43. Ressourcen
  44. 44. Free Book: http://progit.org
  45. 45. Internet-Hilfe• Git-Homepage http://git-scm.com• Git-Kurs http://git.or.cz/course/• Every day git http://mgorski.net/2011/dev/everyday-git• Git Ready http://gitready.com/
  46. 46. Tools & SaaS
  47. 47. git gui / gitk
  48. 48. Travis - CI
  49. 49. Fragen?• E-Mail: marcel.eichner@foobugs.com• Twitter: @ephigenia

×