Git Verstehen Und Nutzen
Total Page:16
File Type:pdf, Size:1020Kb
Git verstehen und nutzen Stephan Beyer 11. Chemnitzer Linux-Tage 14. M¨arz 2009 (π-Tag) Git 1 / 79 Teil I Einleitung Git 2 / 79 Was ist Git? . ein Versionsverwaltungssystem, oder Software Configuration Management\ (Software-Engineering, " Rational ClearCase, BitKeeper) Source Code Management\ (Darcs) " Source Control Management\ (Wikipedia) " Revision Control System\ (RCS, GNU arch) " Source Code Control System\ (SCCS) " Version Control System\ (CVS, Subversion, Mercurial, " GNU Bazaar, Monotone) Global Information Tracker\ (Linus Torvalds) " Git VCS 3 / 79 Was ist Git? Versionsverwaltung { wozu? Problem Daten ¨andern sich im Laufe der Zeit. Diese Anderungen¨ sollen festgehalten werden. Hilfreich: Wer hat wann was warum ge¨andert? Daten in Programmcode Dateien bspw. Dokumentation Projekten Konfigurationsdateien abstrakt: Objekten Bin¨ardateien Git VCS 4 / 79 Was ist Git? Versionsverwaltung { wozu? F¨ahigkeiten Versionsverwaltung nach Eric S. Raymond Verwaltung von Daten mit Umkehrbarkeit { Zuruckholen¨ bekannter, gespeicherter Zust¨ande, z. B. bei Fehlern oder schlechten Ideen Nebenl¨aufigkeit {F¨ahigkeit, dass viele Personen auch gleichzeitig denselben Code ¨andern durfen,¨ ohne dass Anderungen¨ einer Person einfach verloren gehen Kommentierung { Anderungen¨ k¨onnen kommentiert werden mit Intention, Grunden,¨ Umsetzung, Hinweisen, . Git VCS 5 / 79 Einschub: zwei grobe Begriffe Projekt: Gesamtheit aller Daten (jetzt: Verzeichnisse mit Dateien), die verwaltet werden sollen Repository: dt. Lager, Depot, Repositorium; kurz Repo; ein von einer Versionsverwaltung verwaltetes Projekt Git VCS 6 / 79 Was ist Git? . ein verteiltes oder dezentrales Versionsverwaltungssystem (DVCS): Jeder Nutzer hat eigenes Repo eines Projektes mit der gesamten Geschichte. Jedes Repo kann einen Zustand haben, der sich von den anderen unterscheidet. Neben Git z¨ahlen auch Arch, Bazaar, BitKeeper, Darcs, Mercurial, Monotone zu den DVCS. Git verteilte VCS 7 / 79 Warum Git? einfach zu bedienen (wenn Konzepte verstanden) schnell mittlerweile große Nutzerbasis und Community schnelle Entwicklung viel Support (auch Blogosphere) Google: Results 1 - 20 of about 138,000,000 for git Sachzwang: ein Projekt nutzt Git flexibel und m¨achtig stellt sich nicht in den Weg des Anwenders viele nutzliche¨ Kleinigkeiten Linus schrieb's Git Grunde¨ 8 / 79 Zeitverhalten Daten- und Bildquelle: Why Git is Better Than X ! Git is fast Plot von Google Charts API Abbildung: verschiedene DVCS-Operationen auf Django-Repo (roh: ≈19M) Git Grunde¨ 9 / 79 Nutzerentwicklung Quelle: trends.google.com , 4.3.2009 Abbildung: Google Trends, Suchanfragen Git Grunde¨ 10 / 79 Nutzerentwicklung Quelle: qa.debian.org popcon statistics (inst), 4.3.2009 Abbildung: Debian Popularity Contest, Installationen von (D)VCS Git Grunde¨ 11 / 79 Nutzerentwicklung Quelle: qa.debian.org popcon statistics (vote), 4.3.2009 Abbildung: Debian Popularity Contest, regul¨are Nutzung von (D)VCS Git Grunde¨ 12 / 79 Wer nutzt Git? ALSA Git Rails Android GNU autoconf rox awesome GNU automake Rubinius bucardo GNU coreutils Samba buildd-tools GNU Libtool Slash Cairo GNU TLS swfdec centerim grml SWI-Prolog Cinelerra-CV HAL SysLinux cobbler LilyPond The Mana World Compiz Fusion Linux Thousand Parsec dash Merb uade DBus Mesa3D U-Boot DirectFB netconf VLC ELinks OLPC VLE Erlware OpenVZ Wexus Fedora OpenXPKI WINE fluxbox pacman XMMS2 fontconfig pbuilder X.org fprint Perl 5 xwax Frugalware Phoronix Test Suite yum gEDA Poppler ZeroInstall GHC Prototype ...diese Folien Git Grunde¨ 13 / 79 Teil II Grundlegende Konzepte Git 14 / 79 Konzepte Wichtig fur¨ Grundverst¨andnis: wichtige Objekte: Blobs, Trees, Commits, . Referenzen (Refs): Branches, (leichtgewichtige) Tags, . der Index Git 15 / 79 Objekte in Git Git als inhaltsadressiertes Dateisystem Idee: jedes Objekt hat eindeutigen Namen Name = SHA-1 des Objekts SHA-1 berechnet sich aus Inhalt des Objekts L¨ange 160 Bit (20 Bytes) ) Hexadezimalstring aus 40 Zeichen 2 f0;:::; 9; a;:::; f g Konsequenz: schneller Zugriff in Objektdatenbank nach Namen gleiche Objekte haben gleichen Namen Anderungen¨ am Objekt ¨andern dessen Namen schneller Vergleich von Objekten implizite Integrit¨atsprufung¨ maximal 25620 > 1048 Objekte Git Objekte 16 / 79 Blob-Objekt Daten bzw. Inhalt von Dateien Hello world 802992c4220de19a90767f3000a79a31b98d0df7 #!/bin/sh for i in "$@" do convert "$i" -scale 0.5 "small/$i" done 97d9fed61674aa80332e4d6596b875c66099044d e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 Git Objekte Blobs 17 / 79 Tree-Objekt gibt die Datei- und Verzeichnisstruktur wieder Gebilde aus Blobs und Trees mit Attributen wie Dateinamen und -rechten, Symlinks usw. Dateirechte: eingeschr¨ankt auf Unterscheidung ausfuhrbar¨ / nicht-ausfuhrbar¨ 802992c: 100644 hello e69de29: 100644 empty-file Verzeichnisstruktur: empty a6097b449283b490eb4147ffbf3f920ddbbfdf21 small.sh small/ e69de29: 100644 empty hello 97d9fed: 100755 small.sh empty-file a6097b4: 040000 small 4b15187b78c70255e53857fead9181bbcc22405d Git Objekte Trees 18 / 79 Commit-Objekt besteht aus Committer (Ersteller des Commits) Autor Zeit Parent(s), d. h. Eltern-Commit(s) ! Verweis auf Geschichte Tree-Objekt Zusammenfassung der Anderungen;¨ idealerweise: erste Zeile fasst Anderungen¨ kurz zusammen dann leere Zeile ausfuhrliche¨ Zusammenfassung ggf. spezielle Angaben wir Signed-off-by: am Ende d. h. ein Commit beschreibt, wer wann was warum ge¨andert hat. Git Objekte Commits 19 / 79 Commit-History gerichteter, azyklischer Graph der Commit-Geschichte e0d8d74 d2cb604 fdd8901 b7f63a4 11a4fcf ab32698 52742ac 597429c bf4e171 76b35f0 d83040c d3fa0a1 8054e14 fea8f5c aaf43ff 5bacee0 5013c78 c447413 Git Objekte Commits 20 / 79 Commit-History gerichteter, azyklischer Graph der Commit-Geschichte e0d8d74 d2cb604 fdd8901 b7f63a4 11a4fcf ab32698 52742ac 597429c bf4e171 76b35f0 d83040c d3fa0a1 8054e14 fea8f5c aaf43ff 5bacee0 5013c78 c447413 Git Objekte Commits 20 / 79 Commit-History gerichteter, azyklischer Graph der Commit-Geschichte e0d8d74 d2cb604 fdd8901 b7f63a4 11a4fcf ab32698 52742ac 597429c bf4e171 76b35f0 d83040c d3fa0a1 8054e14 fea8f5c aaf43ff 5bacee0 5013c78 c447413 Git Objekte Commits 20 / 79 Commit-History gerichteter, azyklischer Graph der Commit-Geschichte e0d8d74 d2cb604 fdd8901 b7f63a4 11a4fcf ab32698 52742ac 597429c bf4e171 76b35f0 d83040c d3fa0a1 8054e14 fea8f5c aaf43ff 5bacee0 5013c78 c447413 Git Objekte Commits 20 / 79 Commit-History gerichteter, azyklischer Graph der Commit-Geschichte e0d8d74 d2cb604 fdd8901 b7f63a4 11a4fcf ab32698 52742ac 597429c bf4e171 76b35f0 d83040c d3fa0a1 8054e14 fea8f5c aaf43ff 5bacee0 5013c78 c447413 Git Objekte Commits 20 / 79 Commit-History gerichteter, azyklischer Graph der Commit-Geschichte e0d8d74 d2cb604 fdd8901 b7f63a4 11a4fcf ab32698 52742ac 597429c bf4e171 76b35f0 d83040c d3fa0a1 8054e14 fea8f5c aaf43ff 5bacee0 5013c78 c447413 Git Objekte Commits 20 / 79 Commit-History gerichteter, azyklischer Graph der Commit-Geschichte e0d8d74 d2cb604 fdd8901 b7f63a4 11a4fcf ab32698 52742ac 597429c bf4e171 76b35f0 d83040c d3fa0a1 8054e14 fea8f5c aaf43ff 5bacee0 5013c78 c447413 Git Objekte Commits 20 / 79 Referenzen SHA-1-IDs sind unhandlich, schwer zu merken und semantikarm Referenzen (Refs) sind selbst-definierbare Namen verweisen auf Commits oder auf andere Refs (! symbolische Refs) wichtige Standardreferenz: HEAD { verweist auf aktuellen Commit wichtige Arten\ von Refs: " Tags (! refs/tags/) Branches (! refs/heads/) Remotes (! refs/remotes/) ... heads/master 6ef9349 7af1ce5 heads/work d3fa0a1 remotes/doc/HEAD HEAD c3a4a13 e6df2e5 fea8f5c aaf43ff 5bacee0 tags/v1.0 5013c78 c447413 Git Referenzen 21 / 79 Referenzen SHA-1-IDs sind unhandlich, schwer zu merken und semantikarm Referenzen (Refs) sind selbst-definierbare Namen verweisen auf Commits oder auf andere Refs (! symbolische Refs) wichtige Standardreferenz: HEAD { verweist auf aktuellen Commit wichtige Arten\ von Refs: " Tags (! refs/tags/) Branches (! refs/heads/) Remotes (! refs/remotes/) ... heads/master 6ef9349 7af1ce5 heads/work d3fa0a1 remotes/doc/HEAD HEAD c3a4a13 e6df2e5 fea8f5c aaf43ff 5bacee0 tags/v1.0 5013c78 c447413 Git Referenzen 21 / 79 Einschub: Angabe von Commits { Revisionen Revision benennt ein Commit-Objekt Angabe als SHA-1 Eingabe eines eindeutigen Pr¨afixes genugt¨ mindestens 4 Zeichen oft: 7 Zeichen (beliebte Voreinstellung) Angabe als Ref { Suchreihenfolge: 1 name (HEAD, FETCH HEAD, ORIG HEAD, MERGE HEAD) 2 refs/name 3 refs/tags/name 4 refs/heads/name 5 refs/remotes/name 6 refs/remotes/name/HEAD Angabe uber¨ die Commit-Geschichte Git Einschub: Revisionen 22 / 79 Einschub: Angabe von Commits { Revisionen Revision benennt ein Commit-Objekt Angabe als SHA-1 Eingabe eines eindeutigen Pr¨afixes genugt¨ mindestens 4 Zeichen oft: 7 Zeichen (beliebte Voreinstellung) Angabe als Ref { Suchreihenfolge: 1 name (HEAD, FETCH HEAD, ORIG HEAD, MERGE HEAD) 2 refs/name 3 refs/tags/name 4 refs/heads/name 5 refs/remotes/name 6 refs/remotes/name/HEAD Angabe uber¨ die Commit-Geschichte Git Einschub: Revisionen 22 / 79 Einschub: Angabe von Commits { Revisionen Geschichtstraverse mit der Tilde (~) Sei x eine Revision. x~ bezeichnet den ersten Parent von x x~n bezeichnet den ersten Parent der n-ten Generation HEAD, HEAD~0 c1f7fd2 HEAD HEAD~, HEAD~1 7ce73d1 HEAD~~, HEAD~2 6ef9349 7af1ce5 HEAD~~~, HEAD~3 c3a4a13 e6df2e5 HEAD~~~~, HEAD~4 aaf43ff HEAD~~~~~, HEAD~5 5013c78 Git Einschub: Revisionen 23 / 79 Einschub: Angabe von Commits { Revisionen Geschichtstraverse mit der Tilde (~) Sei x eine Revision. x~ bezeichnet den ersten Parent von x x~n bezeichnet den ersten Parent der n-ten Generation