Having fun with GIT Chris Wewerka Software Development Specialist chris@ twitter.com/longliveenduro plus.google.com/s/chris wewerka
GIT Agenda Verteilte Versionskontrollen - Facts Git Crashkurs Git und SVN Tools und IDE-Integration GitHub
Verteilte Versionskontrolle verteilte Welt verteilte Repositories Erst einmal: kein zentrales Repo mehr kein zentraler Server Lokales Repository ist ein vollwertiges Repository es enthält alle Informationen (Historie) Alle üblichen Repo-Operationen arbeiten lokal Commit Taggen
Verteilte Versionskontrolle Bekannteste Vertreter GIT Mercurial Bazaar Kostenlose OpenSource Repos bei GitHub Kostenlose OpenSource Repos bei Googlecode
Vorteile von GIT http://afrikareisen.info/afrikanische-wild-tiere/raubwild-gepard.htm
Vorteile von GIT Hohe Geschwindigkeit Zentrale Versionssysteme wie SVN gehen immer über das Netzwerk Verteilte Systeme verwenden das Netz nur für den Austausch von Changesets Lokales History-Compare Lokales Taggen/Branchen Lokaler Commit
Vorteile von GIT Unabhängigkeit vom Netz Committen von mehreren Changesets z.b. für verschiedene Features auch ohne Netzwerkverbindung möglich (z.b. Laptop) Lokaler Commit, trotz rotem Jenkins-Job Kann auch genutzt werden, um lokal zu committen auch wenn der Build gebrochen ist, um am nächsten Feature arbeiten zu können für Projekte mit Regel No Commit to broken Build except for Build-Fixer Sync erfolgt später, wenn Build wieder grün In Subversion nicht möglich!
Vorteile Branches + Refactoring + Subversion =
Vorteile von GIT Mergen funktioniert auch mit Refactoring sehr gut! Subversion's Redbook zum Thema Mergen und Moven / Renamen mit Branches: This scenario doesn't work so well right now and is considered one of Subversion's current weak spots aus http://svnbook.red-bean.com/en/1.6/svn-book.html#svn.branchmerge.advanced.moves Tree Conflicts!
Ältere SVN Versionen verlieren die Änderungen vom Trunk: SVN 1.6: immer noch Tree Conflicts für jede umbenannte / verschobene Datei!
Vorteile von GIT Vereinfachung des Austauschens von Sourcecodeänderungen, Beispiel: Erzeugen eines vollwertigen Clones auf Github und Googlecode Einfacher Austausch mit dem Projektowner über den Clone mittels push/pull/merge In SVN müsste man mit Patchfiles per Email arbeiten, da man als Nicht-Projekt-Member kein eigenes Repo hat in das man einchecken kann. Kann man nutzen um im Team direkt mit Kollegen Änderungen auszutauschen, ohne über ein zentrales Repo zu gehen Für Code der z.b. noch nicht reif für alle ist
Nachteile von GIT Keine aktuelleste Version, da Peer-to-Peer Lösung: ein gemeinsames Sync-Repo einführen Wird dann auch von JENKINS verwendet Komplexe Versionsnummern Ähnlich UUIDs Keine fortlaufende Nummer möglich Abhilfe: Tags und Tools verwenden
Mercurial - GIT Warum verwende ich GIT und nicht Mercurial? GIT lässt sich sehr gut mit Subversion zusammen verwenden SVN Unterstützung von Mercurial ist davon weit entfernt
Projekte mit GIT Projekte / Firmen die GIT verwenden: Git Linux Kernel Perl Eclipse Gnome KDE Qt Ruby on Rails Android PostgreSQL Debian X.org Lokalisten.de
Crashkurs Creating and Commiting $ cd (project-directory) $ git init $ (add some files) $ git add. $ git commit -m 'Initial commit' $ git status
Crashkurs Branch git branch Listet Branches auf git branch <branchname> Erzeugt vom aktuellen Branch einen neuen Branch git checkout -b <branchname> Erzeugt vom aktuellen Branch einen neuen Branch und wechselt auf den Branch git checkout <branchname> Wechselt zum Branch
GIT Crashkurs - Mergen Merge Rebase: GIT merge Standard: Eigener Commit für den Merge Merge von Branches, wie wenn die Quellbranches nie existiert hätten == Linearisierung der Commits von beiden Branches Kein eigener Commit für den Rebase
GIT Crashkurs GIT tracked Inhalte nicht Files z.b. rename detection anhand von Ähnlichkeit des Contents Vorteile Nachteil Kein spezielles Kommando nötig für Move & Rename (vgl. SVN und Mercurial mit eigenem Move, bzw. Copy-Delete) Praktisch für Austausch von Änderungen per Plaintext (Mail etc.) Der Algorithmus kann ständig erweitert und verbessert werden ohne Änderungen am Repo Vgl. Probleme mit der Umsetzung von Mergetracking in SVN Funktioniert nur wenn die Files ausreichend ähnlich bleiben
GIT Crashkurs Remote Repositories git push: Sync des eigenen Repos zu einem entferntem Repo git pull: Sync von einem entferntem Repo zum lokalen Repo
GIT stages Aus http://de.gitready.com/beginner/2009/01/21/pushing-and-pulling.html
GIT im Projekt Best Practice: Master GIT Repo einrichten auf dem alle Entwickler pullen/pushen Continuous Integration verwendet dann dieses Master Repo
GIT versus SVN? http://www.dpchallenge.com/image.php?image_id=865535 Für GIT im Projekt beten?
GIT SVN SVN Repo clonen (wie git clone) inkl. aller SVN Branches: git svn clone --stdlayout http://svnurl Dauer: einige Stunden bei großen Repos mit hohen Revisionnummern, da git sein komplettes eigenes Repo lokal aus den SVN Commits rekonstruiert Etwas ändern und lokal in git committen git commit Änderungen der Anderen am SVN Repo holen git svn rebase Eigene Änderungen in's SVN committen (die vorher mit git committet wurden) und auf HEAD updaten: git svn dcommit
GIT SVN & SVN Branches Arbeiten mit SVN Branches 1. git branch -a : Liste von remote/{branchname} SVN Branches 2. git checkout -b local-branchname branchname SVN Branch remote/branchname tracken, d.h. Remote SVN branch als lokalen GIT Branch local-branchname verwenden 3. Auf SVN Branch arbeiten und wie gewohnt (dann auf SVN Branch) dcomitten Mergen zwischen SVN Branches in GIT: Evtl. Lieber SVN Client/SVN checkout verwenden, mergen und danach in GIT Branches updaten Work in Progress: hier funktioniert schon mehr als hier beschrieben
GIT SVN & lokale GIT Branches Arbeiten mit lokalen GIT Branches git checkout -b branchname : lokalen GIT Branch anlegen HACK...HACK..HACK (z.b. Feature XY auf lokalem Branch entwicklen) und wenn fertig: git rebase - no-ff branchname master : Änderungen vom lokalen GIT Branch auf Master, d.h. SVN Trunk übertragen (oder ggf. anderer SVN getrackter Branch) git svn dcommit : Änderungen zum SVN Repo übertragen Vorsicht bei git merge von lokalen GIT Branches zu SVN Branches Da nicht alle Mergefähigkeiten/Möglichkeiten von GIT in SVN abbildbar sind Wenn unbedingt gewünscht: vorher nachlesen was zu tun ist Anfängertipp: Statt git merge immer nur git rebase verwenden! Das ist SAFE!
GIT SVN Trotz notwendiger Vorsicht bei Branches zwischen GIT und SVN: GIT-SVN ist der ideale Weg um GIT-Knowhow aufzubauen Rezept: Erstmal einfach starten, nicht gleich alle Features wollen und einsetzen Empfehlung: Zuerst nur mit SVN Trunk arbeiten, committen (dcommitten) und git Kommandos dabei lernen
Umstieg von SVN auf GIT User Mapping Datei anlegen und einfach das von git svn clone erzeugte Repo verwenden Erzeugt GIT Repo mit vollständiger Historie http://www.jonmaddox.com/2008/03/05/cleanly-migrate-yoursubversion-repository-to-a-git-repository/
GIT - weitere coole Features Charly Pagès doing a Holyman, forty8.com
GIT - weitere coole Features Stashing: sichern der aktuellen Änderungen und restore des ursprünglichen Zustandes Use Case: kurzes zur-seite-legen der aktuellen Arbeit, wenn kein Checkin gemacht werden kann/soll Squashen / History Rewrite Noch lokale Commits zu einem Commit zusammenführen Nicht bei Änderungen durchführen die schon in eine remote Repo gepusht wurden
GIT - weitere coole Features Git bisect Commit der Bug eingeführt hat mit binärer Suche finden $ git bisect start $ git bisect good v2.6.18 $ git bisect bad master Bisecting: 3537 revisions left to test after this [65934a9a028b88e83e2b0f8b36618fe503349f8e] BLOCK: Make USB storage depend on SCSI rather than selecting it [try #6] $ git bisect bad Bisecting: 1769 revisions left to test after this [7eff82c8b1511017ae605f0c99ac275a7e21b867] i2c-core: Drop useless bitmaskings
GIT - weitere coole Features git reflog Alle Aktionen auf dem gesamten lokalen Repo (alle Branches) ansehen oder zurücknehmen
Tools & Windows-Support Git auf Windows msysgit git mit cygwin Eclipse: EGIT Standalone: SmartGIT (kommerziell) TortoiseGIT (Windows) Etliche grafische Tools
GITHUB GIT Protocol HTTP git remote add origin git@github.com:breadfan/githubtest.git git remote add origin http://github.com/breadfan/githubtest.git git push -u origin master git pull origin Branch fehlt? git push --all
Danke, und viel Spaß mit GIT! Chris Wewerka Software Development Specialist chris@ twitter.com/longliveenduro plus.google.com/s/chris wewerka