2. Marcel Eichner
@ephigenia
Seit 2000 PHP- & Frontend-
Entwickler
Founder und CxO von
foo(bugs)
3. Git ([ɡɪt], engl. Blödmann) ist eine freie
Software zur verteilten Versionsverwaltung
von Dateien, die von Linus Torwvalds
ursprünglich für die Quellcode-Verwaltung
des Linux-Kernels entwickelt wurde.
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. Geschwindigkeit
• (fast) Alle Operationen
lokal
• .git Verzeichnis nur auf
root Ebene
• http://git-scm.com/
about/small-and-fast
7. Dezentralität
• Klon des kompletten Repositories lokal
• ermöglicht andere Workflows
• lokales branchen, commiten, reverten etc.
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)
15. git status
Anzeigen 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. Staging
Eine oder mehrere bestimmte Dateien stagen
$ git add index.html
$ git add *.html
Alle Änderungen stagen (inklusive gelöschter Dateien)
$ git add --all
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. Shortcut: Stage & Commit
Alle Ä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. Remote Repo klonen
git 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.
25. Branch Merging
In 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
29. Log
Log 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. Log Extended
Anzeige des Baum-graphen im Log
$ git log --graph
Filter 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.html
commit message filter
$ git log --grep="fixed"
31. tag
Den aktuellen branch und stand taggen
$ git tag "release-2012-11-06_12-30-12"
Alle Tags listen
$ git tag
32. blame
Blame 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
Änderung
Blame zu einem bestimmten Zeitpunkt
$ git blame index.html [REVISION]
33. help
$ git [command] --help
NAME
git-blame - Show what revision and author last modified each line of a file
SYNOPSIS
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 last
modified the line. Optionally, start annotating from the given revision.
The command can also limit the range of lines annotated.
34. Zwischenablage
Alle Änderungen in die Zwischenablage des lokalen git Repositories schieben
$ git stash
Änderungen wieder zurückholen
$ git stash apply
Liste aller Objekte in Zwischenablage
$ git stash list
Spezifischen Eintrag (2. Eintrag) aus Zwischenablage wieder herstellen
$ git stash apply stash@{1}
35. Ignorieren
Projekt-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. Sub-Modules
• Vergleichbar mit Subversion-
Externals
• Geklontes Submodule verhält sich
wie ein eigenes Git Repository
• DRY (Komponenten, Plugins etc.)