Home
PDF Datei - Student Information
Contents
1. Der initiale Aufwand lohnt sich aber auf l ngere Sicht da die meisten zuk nftigen Operationen dann schnell und offline erfolgen Trotzdem gibt es Situationen in denen es besser ist einen oberfl chlichen Klon mit der depth Option zu erstellen Das geht wesentlich schneller aber der resultierende Klon hat nur eingeschr nkte Funktionalit t A 7 Unbest ndige Projekte Git wurde geschrieben um schnell zu sein im Hinblick auf die Gr e der Anderungen Leute machen kleine Anderungen von Version zu Version Ein einzeiliger Bugfix hier eine neue Funktion da verbesserte Kommentare und so weiter Aber wenn sich Deine Dateien zwischen aufeinanderfolgenden 5I Anhang A Git s M ngel Versionen gravierend ndern dann wird zwangsl ufig mit jedem Commit Dein Verlauf um die Gr e des gesamten Projekts wachsen Es gibt nichts was irgendein Versionsverwaltungssystem dagegen machen kann aber der Standard Git Anwender leidet mehr darunter weil normalerweise der ganze Verlauf geklont wird Die Ursachen f r die gro en Unterschiede sollten ermittelt werden Vielleicht k nnen Dateiformate ge ndert werden Kleinere Bearbeitungen sollten auch nur minimale nderungen an so wenig Dateien wie m glich bewirken Vielleicht ist eher eine Datenbank oder Sicherungs Archivierungsl sung gesucht nicht ein Versionsverwaltungssystem Ein Versionsverwaltungssystem zum Beispiel ist eine ungeeignete L sung um Fotos zu verwalten die periodisch
2. h tte es die drei letzten Commits nicht gegeben w hrend Deine Dateien unver ndert erhalten bleiben Siehe auf der Git Hilfeseite f r einige Anwendungsbeispiele Aber wie kannst Du zur ck in die Zukunft Die vergangenen Commits wissen nichts von der Zukunft Wenn Du den SHAI Schl ssel vom originalen HEAD hast dann git reset 1b6d Aber stell Dir vor Du hast ihn niemals notiert Keine Sorge F r solche Anweisungen sichert Git den original HEAD als Bezeichner mit dem Namen ORIG_HEAD und Du kannst gesund und munter zur ckkehren mit git reset ORIG_HEAD 7 6 KOPF Jagd M glicherweise reicht ORIG_HEAD nicht aus Vielleicht hast Du gerade bemerkt dass Du einen kapitalen Fehler gemacht hast und nun musst Du zu einem uralten Commit in einem l nst vergessenen Branch zur ck Standardm ig beh lt Git einen Commit f r mindesten zwei Wochen sogar wenn Du Git anweist den Branch zu zerst ren in dem er enthalten ist Das Problem ist den entsprechenden SHA1 Wert zu finden Du kannst Dir alle SHA1 Werte in git objects vornehmen und ausprobieren ob Du den gesuchten Commit findest Aber es gibt einen viel einfacheren Weg Git speichert jeden errechneten SHA1 Wert eines Commits in git logs Das Unterverzeichnis refs enth lt den Verlauf aller Aktivit ten auf allen Branches w hrend HEAD alle SHA1 Werte enth lt die 38 Kapitel 7 Git f r Fortgeschrittene jemals diese Bezeichnung hatten Die letztere kann verwendet w
3. siehe KOPF Jagd oben Standardm ig bleiben die Daten mindestens zwei Wochen erhalten Clean Verschiedene git Anweisungen scheitern weil sie Konflikte mit unversionierten Dateien vermuten Wenn Du sicher bist dass alle unversionierten Dateien und Verzeichnisse entbehrlich sind dann l sche diese gnadenlos mit git clean f d Beim n chsten Mal werden diese l stigen Anweisung gehorchen 7 9 Verhindere schlechte Commits Dumme Fehler verschmutzen meine Repositories Am schrecklichsten sind fehlende Dateien wegen eines vergessenen git add Kleinere Verfehlungen sind Leerzeichen am Zeilenende und ungel ste merge Konflikte obwohl sie harmlos sind w nschte ich sie w rden nie in der ffentlichkeit erscheinen Wenn ich doch nur eine Trottelversicherung abgeschlossen h tte durch Verwendung eines hook der mich bei solchen Problemen alarmiert cd git hooks cp pre commit sample pre commit Older Git versions chmod x pre commit Nun bricht Git einen Commit ab wenn es berfl ssige Leerzeichen am Zeilenende oder ungel ste merge Konflikte entdeckt F r diese Anleitung h tte ich vielleicht am Anfang des pre commit hook folgendes hinzugef gt zum Schutz vor Zerstreutheit if git ls files o grep txt then echo FAIL Untracked txt files exit 1 41 Kapitel 7 Git f r Fortgeschrittene fa Viele Git Operationen unterstiitzen hooks siehe git help hooks Wir haben den Beispiel hook post upda
4. Anwendung wirst Du allm hlich verstehen wie die Tricks funktionieren und wie Du die Rezepte auf Deinen Bedarf zuschneiden kannst bersetzungen e Vereinfachtes Chinesisch blynn gitmagic intl zh_cn von JunJie Meng und JiangWei Zu Traditionellem Chinesisch blynn gitmagic intl zh_tw konvertiert via cconv f UTF8 CN t UTF8 TW e Franz sich blynn gitmagic intl fr von Alexandre Garel Paul Gaborit und Nicolas Deram Auch gehostet unter itaapy http tutoriels itaapy com e Deutsch blynn gitmagic intl de von Benjamin Bellee und Armin Stebich Auch gehostet unter Armin s Website http gitmagic lordofbikes de e Italienisch blynn gitmagic intl it von Mattia Rigotti e Portugiesisch http www slideshare net slide_user magia git von Leonardo Siqueira Rodrigues ODT Version http www slideshare net slide_user magia git verso odt e Russisch blynn gitmagic intl ru von Tikhon Tarnavsky Mikhail Dymskov und anderen e Spanisch blynn gitmagic intl es von Rodrigo Toledo und Ariset Llerena Tapia e Vietnamesisch blynn gitmagic intl vi von Tr lt 7847 gt n Ng lt 7885 gt c Quan Auch gehostet unter seiner Website http vnwildman users sourceforge net gitmagic html Andere Ausgaben Einzelne Webseite book html reines HTML ohne CSS PDF Datei book pdf druckerfreundlich e Debian Packet http packages debian org gitmagic Ubuntu Packet http packages ubuntu com git
5. Gewagte Kunstst cke Heutzutage macht es Git dem Anwender schwer versehentlich Daten zu zerst ren Aber wenn man wei was man tut kann man die Schutzma nahmen der h ufigsten Anweisungen umgehen Checkout Nicht versionierte nderungen lassen checkout scheitern Um trotzdem die nderungen zu zerst ren und einen vorhandenen Commit abzurufen benutzen wir die force Option git checkout f HEAD Auf der anderen Seite wenn Du einen speziellen Pfad f r checkout angibst gibt es keine Sicherheits berpr fungen mehr Der angegebene Pfad wird stillschweigend berschrieben Sei vorsichtig wenn Du checkout auf diese Weise benutzt Reset Reset versagt auch wenn unversionierte Anderungen vorliegen Um es zu erzwingen verwende git reset hard 1b6d 40 Kapitel 7 Git f r Fortgeschrittene Branch Branches zu l schen scheitert ebenfalls wenn dadurch nderungen verloren gehen Um das L schen zu erzwingen gib ein git branch D dead_branch instead of d Ebenso scheitert der Versuch einen Branch durch ein move zu berschreiben wenn das einen Datenverlust zur Folge hat Um das Verschieben zu erzwingen gib ein git branch M source target instead of m Anders als bei checkout und reset verschieben diese beiden Anweisungen das Zerst ren der Daten Die nderungen bleiben im git Unterverzeichnis gespeichert und k nnen wieder hergestellt werden wenn der entsprechende SHA1 Wert aus git logs ermittelt wird
6. Zweige sich austauschen sollen Einige Entwickler setzen sich nachhaltig f r die Unantastbarkeit der Chronik ein mit allen Fehlern Nachteilen und M ngeln Andere denken dass Zweige vorzeigbar gemacht werden sollten bevor sie auf die ffentlichkeit losgelassen werden Git versteht beide Gesichtspunkte Wie Clonen Branchen und Mergen ist das Umschreiben der Chronik lediglich eine weitere St rke die Git Dir bietet Es liegt an Dir diese Weise zu nutzen 5 1 Ich nehme alles zur ck Hast Du gerade commitet aber Du h ttest gerne eine andere Beschreibung eingegeben Dann gib ein git commit amend um die letzte Beschreibung zu ndern Du merkst dass Du vergessen hast eine Datei hinzuzuf gen F hre git add aus um sie hinzuzuf gen und dann die vorhergehende Anweisung Du willst noch ein paar nderungen zu deinem letzten Commit hinzuf gen Dann mache diese nderungen und gib ein git commit amend a 5 2 und noch viel mehr Nehmen wir jetzt an das vorherige Problem ist zehnmal schlimmer Nach einer l ngeren Sitzung hast Du einen Haufen Commits gemacht Aber Du bist mit der Art der Organisation nicht gliicklich und einige Commits k nnten etwas umformuliert werden Dann gib ein git rebase i HEAD 10 und die letzten zehn Commits erscheinen in Deinem bevorzugten EDITOR Auszug aus einem Beispiel pick 5c6eb73 Link repo or cz hinzugeftigt pick a3lla64 Analogien in Arbeite wie Du willst umorganisiert
7. gib ein git tag f letztesbundle HEAD und erstelle neue Aktualisierungsbundles mit git bundle create neuesbundle HEAD letztesbundle 31 Kapitel 6 Multiplayer Git 6 4 Patches Das globale Zahlungsmittel Patches sind die Klartextdarstellung Deiner nderungen die von Computern und Menschen gleicherma en einfach verstanden werden Dies verleiht ihnen eine universelle Anziehungskraft Du kannst einen Patch Entwicklern schicken ganz egal was f r ein Versionsverwaltungssystem sie benutzen Solange Deine Mitstreiter ihre eMails lesen k nnen k nnen sie auch Deine nderungen sehen Auch auf Deiner Seite ist alles was Du brauchst ein eMail Konto es gibt keine Notwendigkeit ein Online Git Repository aufzusetzen Erinnere Dich an das erste Kapitel git diff lb6d gt mein patch gibt einen Patch aus der zur Diskussion einfach in eine eMail eingefiigt werden kann In einem Git Repository gib ein git apply lt mein patch um den Patch anzuwenden In einer offizielleren Umgebung wenn Autorennamen und eventuell Signaturen aufgezeichnet werden sollen erstelle die entsprechenden Patches nach einem bestimmten Punkt durch Eingabe von git format patch 1b6d Die resultierenden Dateien k nnen an git send email bergeben werden oder von Hand verschickt werden Du kannst auch eine Gruppe von Commits angeben git format patch 1b6d HEAD Auf der Empf ngerseite speichere die eMail in eine Da
8. ig Iren ist menschlich und so kann es vorkommen dass Du zur ck zu Teil I willst um einen Fehler zu beheben Wenn Du Gl ck hast oder sehr gut bist Kannst Du die n chsten Zeilen berspringen git checkout master Gehe zur ck zu Teil I fix_problem git commit a Commite die L sung git checkout teil2 Gehe zur ck zu Teil II monn wn git merge master Merge die L sung Schlie lich Teil I ist zugelassen Gehe zur ck zu Teil I Ver ffentliche deine Dateien Merge in Teil II git checkout master submit files git merge teil2 git branch d teil2 mn r mn wn L sche den Branch teil2 Nun bist Du wieder im master Branch mit Teil II im Arbeitsverzeichnis Es ist einfach diesen Trick auf eine beliebige Anzahl von Teilen zu erweitern Es ist genauso einfach r ckwirkend zu branchen angenommen Du merkst zu sp t dass vor sieben Commits ein Branch erforderlich gewesen w re Dann tippe git branch m master teil2 Umbenennen des Branch master zu teil2 git branch master HEAD 7 Erstelle neuen master 7 Commits voraus Der master Branch enth lt nun Teil I und der tei12 Branch enth lt den Rest Wir befinden uns in letzterem Branch wir haben master erzeugt ohne dorthin zu wechseln denn wir wollen im teil2 weiterarbeiten Das ist un blich Bisher haben wir unmittelbar nach dem Erstellen in einen Branch gewechselt wie in git checkout HE
9. machen git clone git repo or cz gitmagic git cd gitmagic mkdir tlh tlh ist das IETF Sprachk rzel f r Klingonisch cd tlh cp en intro txt edit intro txt bersetze diese Datei mn In np In In wn und das machst du f r jede txt Datei Bearbeite das Makefile und f ge das Sprachk rzel zur Variable TRANSLATIONS hinzu Nun kannst Du Deine Arbeit jederzeit wie folgt berpr fen make tlh firefox book tlh index html Committe Deine Anderungen oft und wenn Du fertig bist gib bitte Bescheid GitHub hat eine Schnittstelle die das erleichtert Erzeuge Deinen eigene Fork vom gitmagic Projekt pushe Deine Anderungen dann gib mir Bescheid Deine Anderungen zu mergen 54
10. rde der Anwender dar ber informiert dass noch keine Commits gemacht wurden anstelle mit einem fatalen Fehler zu beenden Das gilt stellvertretend f r andere Anweisungen Jeder initiale Commit ist dann stillschweigend ein Abk mmling dieses Null Commits Leider gibt es noch ein paar Problemf lle Wenn mehrere Branches mit unterschiedlichen initialen Commits zusammengef hrt und dann ein Rebase gemacht wird ist ein manuelles Eingreifen erforderlich A 11 Eigenarten der Anwendung F r die Commits A und B h ngt die Bedeutung der Ausdr cke A B und A B davon ab ob eine Anweisung zwei Endpunkte erwartet oder einen Bereich Siehe git help diff und git help rev parse 53 Anhang B Diese Anleitung bersetzen Ich empfehle folgende Schritte um diese Anleitung zu bersetzen damit meine Skripte einfach eine HTML und PDF Version erstellen k nnen Au erdem k nnen so alle bersetzungen in einem Repository existieren Clone die Quelltexte dann erstelle ein Verzeichnis mit dem Namen des IETF Sprachk rzel der bersetzten Sprache siehe den W3C Artikel ber Internationalisierung http www w3 org International articles language tags Overview en php Zum Beispiel Englisch ist en Japanisch ist ja Kopiere alle txt Dateien aus dem en Verzeichnis in das neue Verzeichnis und bersetze diese Um zum Beispiel die Anleitung auf Klingonisch http de wikipedia org wiki Klingonische_Sprache zu bersetzen musst du folgendes
11. von einer Webcam gemacht werden Wenn die Dateien sich tats chlich konstant ver ndern und sie wirklich versioniert werden m ssen ist es eine M glichkeit Git in zentralisierter Form zu verwenden Jeder kann oberfl chliche Klone erstellen die nur wenig oder gar nichts vom Verlauf des Projekts enthalten Nat rlich sind dann viele Git Funktionen nicht verf gbar und nderungen m ssen als Patches bermittelt werden Das funktioniert wahrscheinlich ganz gut wenn auch unklar ist warum jemand die Versionsgeschichte von wahnsinnig instabilen Dateien braucht Ein anderes Beispiel ist ein Projekt das von Firmware abh ngig ist welche die Form einer gro en Bin rdatei annimmt Der Verlauf der Firmware interessiert den Anwender nicht und nderungen lassen sich schlecht komprimieren so bl hen Firmwarerevisionen die Gr e des Repository unn tig auf In diesem Fall sollte der Quellcode der Firmware in einem Git Repository gehalten werden und die Bin rdatei au erhalb des Projekts Um das Leben zu vereinfachen k nnte jemand ein Skript erstellen das Git benutzt um den Quellcode zu klonen und rsync oder einen oberfl chlichen Klon f r die Firmware A 8 Globaler Z hler Verschiedene Versionsverwaltungssysteme unterhalten einen Z hler der mit jedem Commit erh ht wird Git referenziert nderungen anhand ihres SHA1 Hash was in vielen F llen besser ist Aber einige Leute sind diesen Z hler gew hnt Zum Gl ck ist es einfach Skrip
12. zu sehen oder um eine Datei zum Bearbeiten zu ffnen Zentralisierte Systeme schlie en es aus offline zu arbeiten und ben tigen teurere Netzwerkinfrastruktur vor allem wenn die Zahl der Entwickler steigt Am wichtigsten ist dass alle Operationen bis zu einem gewissen Grad langsamer sind in der Regel bis zu dem Punkt wo Anwender erweiterte Anweisungen scheuen bis sie absolut notwendig sind In extremen F llen trifft das auch auf die grundlegenden 28 Kapitel 5 Geschichtsstunde Anweisungen zu Wenn Anwender langsame Anweisungen ausf hren m ssen sinkt die Produktivit t da der Arbeitsfluss unterbrochen wird Ich habe diese Ph nomen aus erster Hand erfahren Git war das erste Versionsverwaltungssystem das ich benutzt habe Ich bin schnell in die Anwendung hineingewachsen und betrachtete viele Funktionen als selbstverst ndlich Ich habe einfach vorausgesetzt dass andere Systeme hnlich sind die Auswahl eines Versionsverwaltungssystems sollte nicht anders sein als die Auswahl eines Texteditors oder Internetbrowser Ich war geschockt als ich sp ter gezwungen war ein zentralisiertes System zu benutzen Eine unzuverl ssige Internetverbindung st rt mit Git nicht sehr aber sie macht die Entwicklung unertr glich wenn sie so zuverl ssig wie ein lokale Festplatte sein sollte Zus tzlich habe ich mich dabei ertappt bestimmte Anweisungen zu vermeiden um die damit verbundenen Wartezeiten zu vermeiden und das hat mich letztendlic
13. 1544956a8653c0f58dc151275c Author Alice lt alice example com gt Date Thu Jan 1 00 00 00 1970 0000 Initial commit Die ersten paar Zeichen eines Hashwert reichen aus um einen Commit zu identifizieren alternativ benutze kopieren und einfiigen fiir den kompletten Hashwert Gib ein git reset hard 766f um den Stand eines bestimmten Commits wieder herzustellen und alle nachfolgenden Anderungen fiir immer zu l schen Ein anderes Mal willst Du nur kurz zu einem lteren Stand springen In diesem Fall gib folgendes ein git checkout 82f5 Damit springst Du in der Zeit zur ck beh ltst aber neuere nderungen Aber wie bei Zeitreisen in einem Science Fiction Film wenn Du jetzt etwas nderst und commitest gelangst Du in eine alternative Realit t denn Deine nderungen sind anders als beim fr heren Commit Diese alternative Realit t hei t Branch und wir kommen sp ter darauf zur ck F r jetzt merke Dir git checkout master bringt Dich wieder in die Gegenwart Um zu verhindern dass sich Git beschwert solltest Du vor einem Checkout alle Anderungen commiten oder reseten Kapitel 2 Erste Schritte Um wieder die Computerspielanalogie anzuwenden git reset hard Lade einen alten Stand und l sche alle Spielst nde die neuer sind als der jetzt geladene e git checkout Lade einen alten Spielstand aber wenn Du weiterspielst wird der Spielstand von den fr her gesicherten Spielst nden abweichen Jeder S
14. AD 7 b master erzeug inen Branch und wechsle zu ihm 4 6 Mischmasch Reorganisieren Vielleicht magst Du es alle Aspekte eines Projekts im selben Branch abzuarbeiten Du willst deine laufenden Arbeiten fiir Dich behalten und andere sollen Deine Commits nur sehen wenn Du sie hiibsch organisiert hast Beginne ein paar Branches git branch sauber Erzeuge einen Branch f r gesduberte Commits git checkout b mischmasch Erzeuge und wechsle in den Branch zum Arbeiten Fahre fort alles zu bearbeiten Behebe Fehler f ge Funktionen hinzu erstelle tempor ren Code und so weiter und commite Deine Anderungen oft Dann 21 Kapitel 4 Branch Magie git checkout bereinigt git cherry pick mischmasch wendet den Urahn des obersten Commit des mischmasch Branch auf den bereinigt Branch an Durch das Herauspicken der Rosinen kannst Du einen Branch konstruieren der nur endg ltigen Code enth lt und zusammengeh rige Commits gruppiert hat 4 7 Branches verwalten Ein Liste aller Branches bekommst Du mit git branch Standardm ig beginnst Du in einem Branch namens master Einige pl dieren daf r den master Branch unangetastet zu lassen und f r seine Arbeit einen neuen Branch anzulegen Die d und m Optionen erlauben dir Branches zu l schen und zu verschieben umzubenennen Siehe git help branch Der master Branch ist ein n tzlicher Brauch Andere k nnen davon ausgehen dass De
15. Git Magic Ben Lynn August 2007 Git Magic Ben Lynn August 2007 Inhaltsverzeichnis VOrWOHt EE vi USR vi PAN RK EE Vii 1 RO TI 1 Fleet Spiel gedeien een iin AE RS 1 1 2 Versionsverwaltune nu een an BEReH ENEE ee 1 1 3 Verteilte Kontrolle nebenbei ei E nbsstn oh 2 1 4 Ein dummer Aberglaube ana Ren nun E a a le 2 ES Merce Konflikte EE 3 RG OC Neis bd OVATOS NNUU PS AONANONV KERN PSS VAE KESESER 4 2 TS tand Sehere E E NEEE TEA ANOEIE 4 2 2 Hinzuf gen L schen Umbenennen essseseeesesessrssessrtstresrrssrssttstestessessrssresresressrssrsseesresressessees 4 2 3 Fortgeschrittenes R ckg ngig macheniWiederherstellen sensor seen 5 24 R ckg ngig machen CERN sis EHER ns Rips 6 29 Chanpelog erstellen virran e eier Hessens 6 2 6 D teien her nterladen u sauna sa nn ge en ee Dan sg 7 2 1 Das Neueste vom Neuen 2 Rays E S 7 2 8 Einfaches Ver ffentlichen u e22252 een Ban Eed subse vevcnevsdessees 7 2 9 Was habe Ich getan 2 0 EE EES eeh een 8 ZU RRE 8 3 Rund ums Clonen eeseseesssneesnenesnenesnenennenennenennenennenenesnenesnenssnenennenennenennenennenenesnenesnenesnesennesennenennenenesnenenn 10 3 1 CHmp ter synchronisieren nicieni iren suei perinne aee Er EEE se ps ns 10 3 2 Klassische Quellcodeverwaltung iii sisiisesseirsisirisiectrseesirsrssostsitrikos seksis aits stesi essor orri stie 10 3 3 Ee EE E EE 12 3 4 Nackte Repositories ees as Seet ask RR 12 EE 12 EE CN 12 3 7 Ultimat
16. L sweet LF aa823728ea7d592acc69b36875a482cdf3fd5c8d ist Wobei SP ein Leerzeichen ist NUL ist ein Nullbyte und LF ist ein Zeilenumbruch Das kannst Du durch die Eingabe von printf blob 6 000sweet n shalsum kontrollieren Git ist assoziativ Dateien werden nicht nach Ihren Namen gespeichert sondern eher nach dem SHA1 Hash Wert der Daten welche sie enthalten in einer Datei die wir als Blob Objekt bezeichnen Wir k nnen uns den SHA1 Hash Wert als eindeutige Identnummer des Dateiinhalts vorstellen was sinngem bedeutet dass die Dateien ber ihren Inhalt adressiert werden Das f hrende blob 6 ist lediglich ein Vermerk der sich aus dem Objekttyp und seiner L nge in Bytes zusammensetzt er vereinfacht die interne Verwaltung So konnte ich einfach vorhersagen was Du sehen wirst Der Dateiname ist irrelevant nur der Dateiinhalt wird zum Erstellen des Blob Objekt verwendet 45 Kapitel 8 Aufgedeckte Geheimnisse Du wirst Dich fragen was mit identischen Dateien ist Versuche Kopien Deiner Datei hinzuzuf gen mit beliebigen Dateinamen Der Inhalt von git objects bleibt der selbe ganz egal wieviele Dateien Du hinzuf gst Git speichert den Dateiinhalt nur ein einziges Mal brigens die Dateien in git objects sind mit zlib komprimiert Du solltest sie also nicht direkt anschauen Filtere sie durch zpipe d http www zlib net zpipe c oder gib ein git cat file p aa823728ea7d592acc69b36875a482cdf3fd5c8d was Dir
17. als nur einen einfachen Flaschen ffner bei dir zu haben 1 5 Merge Konflikte F r diesen Punkt ist unsere Computerspielanalogie ungeeignet Stattdessen stellen wir uns wieder vor wir editieren ein Dokument Stell dir vor Alice f gt eine Zeile am Dateianfang hinzu und Bob eine am Dateiende Beide laden ihre nderungen hoch Die meisten Systeme w hlen automatisch eine vern nftige Vorgehensweise akzeptiere beide nderungen und f ge sie zusammen damit flie en beide nderungen in das Dokument mit ein Nun stell Dir vor beide Alice und Bob machen nderungen in der selben Zeile Dann ist es unm glich ohne menschlichen Eingriff fortzufahren Die zweite Person welche die Datei hoch l dt wird ber einen Merge Konflikt informiert und muss entscheiden welche nderung bernommen wird oder die ganze Zeile berarbeiten Es k nnen noch weitaus kompliziertere Situationen entstehen Versionsverwaltungssysteme behandeln die einfacheren F lle selbst und berlassen die schwierigen uns Menschen blicherweise ist deren Verhalten einstellbar Kapitel 2 Erste Schritte Bevor wir uns in ein Meer von Git Befehlen st rzen schauen wir uns ein paar einfache Beispiele an Trotz ihrer Einfachheit sind alle davon wichtig und n tzlich Um ehrlich zu sein in meinen ersten Monaten mit Git brauchte ich nicht mehr als in diesem Kapitel beschrieben steht 2 1 Stand sichern Hast Du gravierende nderungen vor Nur zu aber speichere D
18. as Zusammenf gen Mergen ist schwierig Mit Git ist Mergen so einfach dass Du gar nicht merkst wenn es passiert Tats chlich sind wir dem Mergen schon lange begegnet Die pull Anweisung holt fetch eigentlich die Commits und verschmilzt merged diese dann mit dem aktuellen Branch Wenn Du keine lokalen Anderungen hast dann ist merge eine schnelle Weiterleitung ein Ausnahmefall ahnlich dem Abrufen der letzten Version eines zentralen Versionsverwaltungssystems Wenn Du aber Anderungen hast wird Git diese automatisch mergen und Dir Konflikte melden Normalerweise hat ein Commit genau einen Eltern Commit n mlich den vorhergehenden Commit Das Mergen mehrerer Branches erzeugt einen Commit mit mindestens zwei Eltern Das wirft die Frage auf 19 Kapitel 4 Branch Magie Welchen Commit referenziert HEAD 10 tats chlich Ein Commit kann mehrere Eltern haben welchem folgen wir also Es stellt sich heraus dass diese Notation immer den ersten Elternteil w hlt Dies ist erstrebenswert denn der aktuelle Branch wird zum ersten Elternteil w hrend eines Merge h ufig bist Du nur von nderungen betroffen die Du im aktuellen Branch gemacht hast als von den nderungen die von anderen Branches eingebracht wurden Du kannst einen bestimmten Elternteil mit einem Caret Zeichen referenzieren Um zum Beispiel die Logs vom zweiten Elternteil anzuzeigen git log HEAD 2 Du kannst die Nummer f r den ersten Elternteil weglassen Um zu
19. as hei t auch dass sie jeden SHA1 Hash Wert der Tree Objekte ndern m ssen welche dieses Objekt referenzieren und demzufolge alle SHA1 Hash Werte der Commit Objekte welche diese Tree Objekte beinhalten zus tzlich zu allen Abk mmlingen dieses Commits Das bedeutet auch dass sich der SHA 1 Hash Wert des offiziellen HEAD von dem des manipulierten Repository unterscheidet Folgen wir dem Pfad der differierenden SHA1 Hash Werte finden wir die verst mmelte Datei wie auch den Commit in dem sie erstmals auftauchte Kurz gesagt so lange die 20 Byte welche den SHA1 Hash Wert des letzen Commit repr sentieren sicher sind ist es unm glich ein Git Repository zu f lschen Was ist mit Git s ber hmten F higkeiten Branching Merging Tags Nur Kleinigkeiten Der aktuelle HEAD wird in der Datei git HEAD gehalten welche den SHA1 Hash Wert eines Commit Objekts enth lt Der SHA1 Hash Wert wird w hrend eines Commit aktualisiert genauso bei vielen anderen 48 Kapitel 8 Aufgedeckte Geheimnisse Anweisungen Branches sind fast das selbe sie sind Dateien in git refs heads Tags ebenso sie stehen in git refs tags aber sie werden durch einen Satz anderer Anweisungen aktualisiert 49 Anhang A Git s M ngel Ein paar Git Probleme habe ich bisher unter den Teppich gekehrt Einige lassen sich einfach mit Skripten und Hooks l sen andere erfordern eine Reorganisation oder Neudefinition des gesamten Projekt und f r die wenigen verble
20. bestehend aus dem Dateityp dem Dateinamen und einem SHA1 Hash Wert In unserem Beispiel ist der Dateityp 100644 was bedeutet dass rose eine normale Datei ist und der SHA1 Hash Wert entspricht dem Blob Objekt welches den Inhalt von rose enth lt Andere m gliche Dateitypen sind ausf hrbare Programmdateien symbolische Links oder Verzeichnisse Im letzten Fall zeigt der SHA1 Hash Wert auf ein Tree Objekt Wenn Du filter branch aufrufst bekommst Du alte Objekte welche nicht l nger ben tigt werden Obwohl sie automatisch ber Bord geworfen werden wenn ihre Gnadenfrist abgelaufen ist wollen wir sie nun l schen damit wir unserem Beispiel besser folgen k nnen rm r git refs original git reflog expir expire now all git prune F r reale Projekte solltest Du solche Anweisungen blicherweise vermeiden da Du dadurch Datensicherungen zerst rst Wenn Du ein sauberes Repository willst ist es am besten einen neuen Klon anzulegen Sei auch vorsichtig wenn Du git direkt manipulierst was wenn zeitgleich ein Git Kommando ausgef hrt wird oder pl tzlich der Strom ausf llt Generell sollten Referenzen mit git update ref d gel scht werden auch wenn es gew hnlich sicher ist refs original von Hand zu l schen 8 9 Commits Wir haben nun zwei von drei Objekten erkl rt Das dritte ist ein Commit Objekt Sein Inhalt h ngt von der Commit Beschreibung ab wie auch vom Zeitpunkt der Erstellung Damit alles zu unserem Beispiel pas
21. chen Du m chtest ein Projekt zu Git umziehen Wenn es mit einem der bekannteren Systeme verwaltet wird besteht die M glichkeit dass schon jemand ein Skript geschrieben hat das die gesamte Chronik f r Git exportiert Anderenfalls sieh dir git fast import an das Text in einem speziellen Format einliest um eine Git Chronik von Anfang an zu erstellen Normalerweise wird ein Skript das diese Anweisung benutzt hastig zusammengeschustert und einmalig ausgef hrt um das Projekt in einem einzigen Lauf zu migrieren Erstelle zum Beispiel aus folgendem Listing eine tempor re Datei z B tmp history commit refs heads master committer Alice lt alice example com gt Thu 01 Jan 1970 00 00 00 0000 data lt lt EOT Initial commit EOT M 100644 inline hello c data lt lt EOT include lt stdio h gt int main printf Hallo Welt n return 0 26 Kapitel 5 Geschichtsstunde commit refs heads master committer Bob lt bob example com gt Tue 14 Mar 2000 01 59 26 0800 data lt lt EOT Ersetze printf mit write EOT M 100644 inline hello c data lt lt EOT include lt unistd h gt int main write 1 Hallo Welt n 14 return 0 Dann erstelle ein Git Repository aus dieser tempor ren Datei durch Eingabe von mkdir project cd project git init git fast import date format rfc2822 lt tmp history Die aktuellste Version des Projekts kannst Du abrufen checkout mi
22. das Objekt im Klartext anzeigt 8 8 Trees Aber wo sind die Dateinamen Sie m ssen irgendwo gespeichert sein Git kommt beim Commit dazu sich um die Dateinamen zu k mmern git commit Schreib ine Bemerkung find git objects type f Du solltest nun drei Objekte sehen Dieses mal kann ich Dir nicht sagen wie die zwei neuen Dateien hei en weil es zum Teil vom gew hlten Dateiname abh ngt den Du ausgesucht hast Fahren wir fort mit der Annahme Du hast eine Datei rose genannt Wenn nicht kannst Du den Verlauf so umschreiben dass es so aussieht als h ttest Du es git filter branch tree filter im DEIN_DATEINAME rose find git objects type f Nun m sstest Du die Datei git objects 05 b217bb859794d08bb9e4 7 04cbda4b207fbe9 sehen denn das ist der SHA1 Hash Wert ihres Inhalts tree SP 32 NUL 100644 rose NUL 0xaa823728ea7d592acc69b36875a482cdf 3fd5c8d Pr fe ob diese Datei tats chlich dem obigen Inhalt entspricht durch Eingabe von echo 05b217bb859794408bb9Ye4f7f04cbda4b207fbe9 git cat file batch Mit zpipe ist es einfach den SHA1 Hash Wert zu pr fen zpipe d lt git objects 05 b217bb859794d08bb9e4fF7 04cbhda4b207fbe9 shalsum Die SHA1 Hash Wert Pr fung mit cat file ist etwas kniffliger da dessen Ausgabe mehr als die rohe unkomprimierte Objektdatei enth lt 46 Kapitel 8 Aufgedeckte Geheimnisse Diese Datei ist ein Tree Objekt eine Liste von Datens tzen
23. e Datenbank 8 3 Intelligenz Woher wei Git dass Du eine Datei umbenannt hast obwohl Du es ihm niemals explizit mitgeteilt hast Sicher Du hast vielleicht git mv benutzt aber das ist exakt das selbe wie git rm gefolgt von git add Git st bert Umbenennungen und Kopien zwischen aufeinander folgenden Versionen heuristisch auf Vielmehr kann es sogar Codebl cke erkennen die zwischen Dateien hin und her kopiert oder verschoben wurden Jedoch kann es nicht alle F lle abdecken aber es leistet ordentliche Arbeit und diese Eigenschaft wird immer besser Wenn es bei Dir nicht funktioniert versuche Optionen zur aufwendigeren Erkennung von Kopien oder erw ge einen Upgrade 8 4 Indizierung F r jede berwachte Datei speichert Git Informationen wie deren Gr e ihren Erstellzeitpunkt und den Zeitpunkt der letzten Bearbeitung in einer Datei die wir als Index kennen Um zu ermitteln ob eine Datei ver ndert wurde vergleicht Git den aktuellen Status mit dem im Index gespeicherten Stimmen diese Daten berein kann Git das Lesen des Dateiinhalts berspringen Da das Abfragen des Dateistatus erheblich schneller ist als das Lesen der Datei kann Git wenn Du nur ein paar Dateien ver ndert hast seinen Status im Nu aktualisieren Wir haben fr her festgestellt dass der Index ein Bereitstellungsraum ist Warum kann ein Haufen von Dateistatusinformationen ein Bereitstellungsraum sein Weil die add Anweisung Dateien in die Git Datenbank bef rde
24. e der Dateien und des Git Repository zu erstellen Von jetzt an wird git commit a git pull anderer computer pfad zu dateien HEAD den Zustand der Dateien des anderen Computer auf den bertragen an dem Du gerade arbeitest Solltest Du k rzlich konkurrierende nderungen an der selben Datei vorgenommen haben l sst Git Dich das wissen und Du musst erneut commiten nachdem Du die Konflikte aufgel st hast 3 2 Klassische Quellcodeverwaltung Erstelle ein Git Repository f r Deine Dateien git init git add git commit m Erster Commit Auf dem zentralen Server erstelle ein bare Repository in irgendeinem Ordner mkdir proj git cd proj git 10 Kapitel 3 Rund ums Clonen git init bare touch proj git git daemon export ok Wenn n tig starte den Git D mon git daemon detach er k nnte schon laufen F r Git Hostingdienste folge den Anweisungen zum Erstellen des zun chst leeren Git Repository Normalerweise f llt man ein Formular auf einer Website aus bertrage push dein Projekt auf den zentralen Server mit git push zentraler server pfad zu proj git HEAD Um die Quellcodes abzurufen gibt ein Entwickler folgendes ein git clone zentraler server pfad zu proj git Nach dem Bearbeiten sichert der Entwickler die nderungen lokal git commit a Um auf die aktuelle Server Version zu aktualisieren git pull Irgendwelche Merge Konflikte sollten dann aufg
25. einen aktuellen Stand vorher lieber nochmal ab git init git add git commit m Mein rste Sicherung Falls deine Anderungen schief gehen kannst du jetzt die alte Version wiederherstellen git reset hard Um den neuen Stand zu sichern git commit a m Eine andere Sicherung 2 2 Hinzufugen Loschen Umbenennen Bisher kiimmert sich Git nur um Dateien die existierten als Du das erste Mal git add ausgefiihrt hast Wenn Du Dateien oder Verzeichnisse hinzufiigst musst du Git das mitteilen git add readme txt Dokumentation Ebenso wenn Git Dateien vergessen soll git rm ramsch h veraltet c git rm r belastendes material Git l scht diese Dateien f r Dich falls Du es noch nicht getan hast Eine Datei umzubenennen ist das selbe wie sie zu l schen und unter neuem Namen hinzuzuf gen Git benutzt hierzu die Abk rzung git mv welche die gleiche Syntax wie mv hat Zum Beispiel git mv fehler c feature c Kapitel 2 Erste Schritte 2 3 Fortgeschrittenes R ckg ngig machen Wiederherstellen Manchmal m chtest Du einfach zur ckgehen und alle nderungen ab einem bestimmten Zeitpunkt verwerfen weil sie falsch waren Dann git log zeigt Dir eine Liste der bisherigen Commits und deren SHA1 Hashwerte commit 766 9881690d240ba334153047649b8b8f11c664 Author Bob lt bob example com gt Date Tue Mar 14 01 59 26 2000 0800 Ersetze printf mit write commit 82f5ea346a2e65
26. el st und erneut commitet werden git commit a Um die lokalen nderungen in das zentrale Repository zu bertragen git push Wenn inzwischen neue nderungen von anderen Entwicklern beim Hauptserver eingegangen sind schl gt Dein push fehl Aktualisiere das lokale Repository erneut mit pull l se eventuell aufgetretene Merge Konflikte und versuche es nochmal Entwickler brauchen SSH Zugriff f r die vorherigen pull und push Anweisungen Trotzdem kann jedermann die Quelltexte einsehen durch Eingabe von git clone git zentraler server pfad zu proj git Das urspr ngliche Git Protokoll hnelt HTTP Es gibt keine Authentifizierung also kann jeder das Projekt abrufen Folglich ist standardm ig das Pushen per Git Protokoll verboten 11 Kapitel 3 Rund ums Clonen 3 3 Geheime Quellen F r ein Closed Source Projekt lasse die touch Anweisung weg und stelle sicher dass niemals eine Datei namens git daemon export ok erstellt wird Das Repository kann nun nicht mehr ber das Git Protokol abgerufen werden nur diejenigen mit SSH Zugriff k nnen es einsehen Wenn alle Repositories geschlossen sind ist es unn tig den Git D mon laufen zu lassen da jegliche Kommunikation ber SSH l uft 3 4 Nackte Repositories Ein nacktes bare Repository wird so genannt weil es kein Arbeitsverzeichnis hat Es enth lt nur Dateien die normalerweise im git Unterverzeichnis versteckt sind Mit anderen Worten es verwaltet die Ge
27. el en 31 6 5 Entschuldigung wir sind umgezogen en 32 6 0 Entfernte Branches es a aan Egger de 33 6 7 Mehtere Remotes 252i nn innen ae Anahi ee ns 34 6 8 Meine Einstellungen 4 2 2 RER ER RIaR Inn Sp gobs seb steoracestaces 34 7 Git f r Fortgeschrittene crsossussossnssnsnnsnsorsonsnssnsnnsnnsnnsnssnnnnnsnsnnsnnsnnsonsnssnnnnssnsnnsnnsnnsnnsossnsnnssnsnnsnnsnnee 36 7 1 Quelleod ver fientlichen 22 u2uu2222 dE ea nina 36 7 2 E EE 36 7 3 Mein Commit ist zu era O meinemphasis ommit emphasis stzugro 7 4 Der Index Git s Beretstellungeraum 02 2nnennennennonnnennonsennennnennennennnennensn en 37 7 Verliere nicht Demer KOPE 2 22 22 2 222 A es Eege Sera dere haven ana 38 1 0 KOPF Jao dist sans heen eon atta nee a een Ane Re ae aaa 38 TI AUF Git paei a aaa ec ee ee oe e 39 1 8 Gewagte Kunstst cke 2 2 2 482er EEEEE ES SEESE ERES ETS Ee SES ETa E SORS RERS 40 7 9 Verhindere schlechte Commits ienser eene aaee RE E E E E a EIE RE SeS 41 8 Aufgedeckte Geheimnisse uesssnsennsonsennsonssonsnnensnsnnsnnsenssnnsnnssnnssnnsnnsnnennssnnsnnssonssnssnnssnesnssnnsnnsnnnsnnne 43 8 1 Unsiehtb rkeiti amp 3 0um2 2 000 Ries ars Eed Ae ege 43 Tote ee 43 83 Intellis amp n2 E 44 SA mdi Zerg tio oe sense sb I he 44 8 5 ES EE 44 8 6 Die Obiektdatenbank AAA 44 8 7 Blobs ae sat HE ie Nemesis degd rech Ee TEE EE OT 45 RE 46 8D COMMIS anni ein as tts Fe ada eee A pesca hingen Zenger Sdt de 47 8 10 V
28. ele dieser erstaunlichen Anweisung Du kannst auch Commits aufteilen Du kannst sogar Branches in einem Repository umorganisieren 25 Kapitel 5 Geschichtsstunde 5 4 Chronik umschreiben Gelegentlich brauchst Du Versionsverwaltung vergleichbar dem Wegretuschieren von Personen aus einem offiziellen Foto um diese in stalinistischer Art aus der Geschichte zu l schen Stell Dir zum Beispiel vor Du willst ein Projekt ver ffentlichen aber es enth lt eine Datei die aus irgendwelchen Gr nden privat bleiben muss Vielleicht habe ich meine Kreditkartennummer in einer Textdatei notiert und diese versehentlich dem Projekt hinzugef gt Die Datei zu l schen ist zwecklos da ber ltere Commits auf sie zugegriffen werden k nnte Wir m ssen die Datei aus allen Commits entfernen git filter branch tree filter fm sehr geheime Datei HEAD Siehe git help filter branch wo dieses Beispiel erkl rt und eine schnellere Methode vorstellt wird Allgemein filter branch l sst Dich gro e Bereiche der Chronik mit einer einzigen Anweisung ver ndern Danach beschreibt der Ordner git refs original den Zustand der Lage vor der Operation Pr fe ob die filter branch Anweisung getan hat was Du wolltest dann l sche dieses Verzeichnis bevor Du weitere filter branch Operationen durchf hrst Zuletzt ersetze alle Clones Deines Projekts mit Deiner berarbeiteten Version falls Du sp ter mit ihnen interagieren m chtest 5 5 Geschichte ma
29. ellungsraum Git tauscht selten Daten direkt zwischen Deinem Projekt und seiner Versionsgeschichte aus Vielmehr schreibt Git die Daten zuerst in den Index danach kopiert es die Daten aus dem Index an ihren eigentlichen Bestimmungsort Zum Beispiel ist commit a eigentlich ein zweistufiger Prozess Der erste Schritt erstellt einen Schnappschuss des aktuellen Status jeder berwachten Datei im Index Der zweite Schritt speichert dauerhaft den Schnappschuss der sich nun im Index befindet Ein Commit ohne die a Option f hrt nur den zweiten Schritt aus und macht nur wirklich Sinn wenn zuvor eine Anweisung angewendet wurde welche den Index ver ndert wie zum Beispiel git add Normalerweise k nnen wir den Index ignorieren und so tun als w rden wir direkt aus der Versionsgeschichte lesen oder in sie schreiben In diesem Fall wollen wir aber mehr Kontrolle also manipulieren wir den Index Wir erstellen einen Schnappschuss einiger aber nicht aller unser 37 Kapitel 7 Git f r Fortgeschrittene nderungen im Index und speichern dann diesen sorgf ltig zusammengestellten Schnappschuss permanent 7 5 Verliere nicht Deinen KOPF Der HEAD Bezeichner ist wie ein Cursor der normalerweise auf den j ngsten Commit zeigt und mit jedem neuen Commit voranschreitet Einige Git Anweisungen lassen Dich ihn manipulieren Zum Beispiel git reset HEAD 3 bewegt den HEAD Bezeichner drei Commits zuriick Dadurch agieren nun alle Git Anweisungen als
30. em alles in einem einzigen Repository halten willst 50 Anhang A Git s M ngel A 4 Wer macht was Einige Versionsverwaltungssysteme zwingen Dich explizit eine Datei auf irgendeine Weise f r die Bearbeitung zu kennzeichnen Obwohl es extrem l stig ist wenn es die Kommunikation mit einem zentralen Server erfordert so hat es doch zwei Vorteile 1 Unterschiede sind schnell gefunden weil nur die markierten Dateien untersucht werden m ssen 2 Jeder kann herausfinden wer sonst gerade an einer Datei arbeitet indem er beim zentralen Server anfragt wer die Datei zum Bearbeiten markiert hat Mit geeigneten Skripten kannst Du das auch mit Git hinkriegen Das erfordert aber die Mitarbeit der Programmierer denn sie miissen die Skripte auch aufrufen wenn sie eine Datei bearbeiten A 5 Dateihistorie Da Git die nderungen ber das gesamte Projekt aufzeichnet erfordert die Rekonstruktion des Verlaufs einer einzelnen Datei mehr Aufwand als in Versionsverwaltungssystemen die einzelne Dateien berwachen Die Nachteile sind blicherweise gering und werden gern in Kauf genommen da andere Operationen daf r unglaublich effizient sind Zum Beispiel ist git checkout schneller als cp a und projektweite Unterschiede sind besser zu komprimieren als eine Sammlung von nderungen auf Dateibasis A 6 Der erster Klon Einen Klon zu erstellen ist aufwendiger als in anderen Versionsverwaltungssystemen wenn ein l ngerer Verlauf existiert
31. en git log gt ChangeLog 2 6 Dateien herunterladen Eine Kopie eines mit Git verwalteten Projekts bekommst du mit git clone git server pfad zu dateien Um zum Beispiel alle Dateien zu bekommen die ich zum Erzeugen dieser Seiten benutze git clone git git or cz gitmagic git Es gibt gleich noch viel mehr ber den clone Befehl zu sagen 2 7 Das Neueste vom Neuen Wenn Du schon eine Kopie eines Projektes hast kannst Du es auf die neuste Version aktualisieren mit git pull 2 8 Einfaches Ver ffentlichen Angenommen Du hast ein Skript geschrieben und m chtest es anderen zug nglich machen Du k nntest sie einfach bitten es von Deinem Computer herunterzuladen aber falls sie das tun w hrend Du experimentierst oder das Skript verbesserst k nnten sie in Schwierigkeiten geraten Genau deswegen gibt es Releasezyklen Entwickler arbeiten regelm ig an einem Projekt ver ffentlichen den Code aber nur wenn sie ihn f r vorzeigbar halten Um dies in Git zu tun gehe ins Verzeichnis in dem das Skript liegt git init git add git commit m Erster Stand Dann sage Deinen Nutzern git clone dein computer pfad zum skript Kapitel 2 Erste Schritte um Dein Skript herunterzuladen Das setzt voraus dass sie einen SSH Zugang haben Falls nicht f hre git deamon aus und sage den Nutzern folgendes git clone git dein computer pfad zum skript Ab jetzt immer wenn Dein Skript reif f r eine V
32. en der diesen Unterschied darstellt und diesen dann auf D anwenden git diff BA git apply 2 Da die Dateien im Repository unter dem Commit A gespeichert sind k nnen wir sie wieder herstellen git checkout A foo c bar h 3 Wir k nnen den Commit von A auf B als nderung betrachten die wir r ckg ngig machen wollen git revert B Welche L sung ist die beste Die welche Dir am besten gef llt Es ist einfach mit Git das zu bekommen was Du willst und oft f hren viele Wege zum Ziel Kapitel 3 Rund ums Clonen In lteren Versionsverwaltungssystemen ist checkout die Standardoperation um Dateien zu bekommen Du bekommst einen Haufen Dateien eines bestimmten Sicherungsstands In Git und anderen verteilten Versionsverwaltungssystemen ist clone die Standardaktion Um Dateien zu bekommen erstellst Du einen Clone des gesamten Repository Oder anders gesagt Du spiegelst den zentralen Server Alles was man mit dem zentralen Repository tun kann kannst Du auch mit deinem Clone tun 3 1 Computer synchronisieren Es ist akzeptabel f r Datensicherungen und einfaches Synchronisieren mit tarball Archiven oder rsync zu arbeiten Aber manchmal arbeite ich an meinem Laptop dann an meinem Desktop PC und die beiden haben sich inzwischen nicht austauschen k nnen Erstelle ein Git Repository und commite Deine Dateien auf dem einen Rechner Dann auf dem anderen git clone anderer computer pfad zu dateien um eine zweite Kopi
33. er ffentlichung ist git commit a m N chster Stand und Deine Nutzer k nnen ihr Skript aktualisieren mit git pull Deine Nutzer werden nie mit Versionen in Kontakt kommen von denen Du es nicht willst Nat rlich funktioniert der Trick f r fast alles nicht nur Skripts 2 9 Was habe ich getan Finde heraus was Du seit dem letzten Commit getan hast git diff Oder seit Gestern git diff gestern Oder zwischen irgendeiner Version und der vorvorletzten git diff 1b6d master 2 Jedes mal ist die Ausgabe ein Patch der mit git apply eingespielt werden kann Versuche auch git whatchanged since 2 weeks ago Um mir die Geschichte eines Repositories anzuzeigen benutze ich h ufig qgit http sourceforge net projects qgit da es eine schicke Benutzeroberfl che hat oder tig http jonas nitro dk tig eine Konsolenanwendung die sehr gut ber langsame Verbindungen funktioniert Alternativ kannst Du einen Webserver installieren mit git instaweb dann kannst Du mit jedem Webbrowser darauf zugreifen Kapitel 2 Erste Schritte 2 10 bung A B C D sind 4 aufeinander folgende Commits B ist identisch mit A au er dass einige Dateien gel scht wurden Wir m chten die Dateien in D wieder hinzuf gen aber nicht in B Wie machen wir das Es gibt mindestens 3 L sungen Angenommen wir sind bei D 1 Der Unterschied zwischen A und B sind die gel schten Dateien Wir k nnen einen Patch erstell
34. er als mein Chef gt meinedatei txt git init git add git commit m Erster Stand minim wn 17 Kapitel 4 Branch Magie Wir haben ein Git Repository erstellt das eine Textdatei mit einer bestimmten Nachricht enth lt Nun gib ein git checkout b chef scheinbar hat sich danach nichts ge ndert echo Mein Chef ist kl ger als ich gt meinedatei txt git commit a m Ein anderer Stand Es sieht aus als h tten wir unsere Datei berschrieben und commitet Aber es ist eine Illusion Tippe git checkout master wechsle zur Originalversion der Datei und Simsalabim Die Textdatei ist wiederhergestellt Und wenn der Chef in diesem Verzeichnis herumschn ffelt tippe git checkout chef wechsle zur Version die der Chef ruhig sehen kann Du kannst zwischen den beiden Versionen wechseln so oft du willst und du kannst unabh ngig voneinander in jeder Version nderungen commiten 4 2 Schmutzarbeit Sagen wir Du arbeitest an einer Funktion und Du musst warum auch immer drei Versionen zur ckgehen um ein paar print Anweisungen einzuf gen damit Du siehst wie etwas funktioniert Dann git commit a git checkout HE AD 3 E Nun kannst Du berall wild tempor ren Code hinzuf gen Du kannst diese nderungen sogar commiten Wenn Du fertig bist git checkout master um zur urspriinglichen Arbeit zuriickzukehren Beachte dass alle Anderungen die nicht commitet sind tibernommen werde
35. erden um SHA1 Werte von Commits zu finden die sich in einem Branch befanden der versehentlich gestutzt wurde Die reflog Anweisung bietet eine benutzerfreundliche Schnittstelle zu diesen Logdateien Versuche git reflog Anstatt SHA1 Werte aus dem reflog zu kopieren und einzuf gen versuche git checkout 10 minutes ago Oder rufe den f nftletzten Commit ab mit git checkout 5 Siehe in der Specifying Revisions Sektion von git help rev parse fiir mehr Vielleicht m chtest Du eine langere Gnadenfrist fiir todgeweihte Commits konfigurieren Zum Beispiel git config gc pruneexpire 30 days bedeutet ein gel schter Commit wird nur dann endg ltig verloren sein nachdem 30 Tage vergangen sind und git ge ausgef hrt wurde Du magst vielleicht auch das automatische Ausf hren von git ge abstellen git config oc auto 0 wodurch Commits nur noch gel scht werden wenn Du git ge manuell aufrufst 7 7 Auf Git bauen In echter UNIX Sitte erlaubt es Git s Design dass es auf einfache Weise als Low Level Komponente von anderen Programmen benutzt werden kann wie zum Beispiel grafischen Benutzeroberfl chen und Internetanwendungen alternative Kommandozeilenanwendungen Patch Werkzeugen Import und Konvertierungswerkzeugen und so weiter Sogar einige Git Anweisungen selbst sind nur winzige Skripte wie Zwerge auf den Schultern von Riesen Mit ein bisschen Handarbeit kannst Du Git anpassen damit es Deinen Anfo
36. etwas Zeit sparen Nachfolgend findest Du ein paar Rezepte die ich in der Vergangenheit gebraucht habe 7 1 Quellcode ver ffentlichen Bei meinen Projekten verwaltet Git genau die Dateien die ich archivieren und f r andere Benutzer ver ffentlichen will Um ein tarball Archiv des Quellcodes zu erzeugen verwende ich den Befehl git archiv format tar prefix proj 1 2 3 HEAD 7 2 Commite Anderungen Git mitzuteilen welche Dateien man hinzugef gt gel scht und umbenannt hat ist f r manche Projekte sehr miihsam Stattdessen kann man folgendes eingeben git add git add u Git wird sich die Dateien im aktuellen Verzeichnis ansehen und sich die Details selbst erarbeiten Anstelle des zweiten Befehl kann man auch git commit a ausf hren falls man an dieser Stelle ohnehin comitten m chte Siehe git help ignore um zu sehen wie man Dateien definiert die ignoriert werden sollen Man kann das aber auch in einem einzigen Schritt ausf hren mit git 1s files d m o z xargs 0 git update index add remov Die z und 0 Optionen verhindern unerw nschte Nebeneffekte durch Dateinamen mit ungew hnlichen Zeichen Da diese Anweisung aber auch zu ignorierende Dateien hinzuf gt kann man noch die x oder X Option hinzuf gen 7 3 Mein Commit ist zu gro Hast Du es zu lange vers umt zu comitten Hast Du so versessen programmiert dass Du dar ber die Quellcodeverwaltung vergessen hast Machst Du eine Serie v
37. ffline bleiben bis Du mit anderen kommunizieren willst Du hast die absolute Kontrolle ber das Schicksal Deiner Dateien denn Git kann jederzeit einfach einen gesicherten Stand aus git wiederherstellen 8 2 Integrit t Die meisten Leute verbinden mit Kryptographie die Geheimhaltung von Informationen aber ein genau so wichtiges Ziel ist es Informationen zu sichern Die richtige Anwendung von kryptographischen Hash Funktionen kann einen versehentlichen oder b sartigen Datenverlust verhindern Einen SHA1 Hash Wert kann man sich als eindeutige 160 Bit Identit tsnummer f r jegliche Zeichenkette vorstellen welche Dir in Deinem ganzen Leben begegnen wird Sogar mehr als das jegliche Zeichenfolge die alle Menschen ber mehrere Generationen verwenden Ein SHA1 Hash Wert selbst ist eine Zeichenfolge von Bytes Wir k nnen SHA1 Hash Werte aus Zeichenfolgen generieren die selbst SHA1 Hash Werte enthalten Diese einfache Beobachtung ist berraschend n tzlich suche nach hash chains Wir werden sp ter sehen wie Git diese nutzt um effizient die Datenintegrit t zu garantieren Kurz gesagt Git h lt Deine Daten in dem git objects Unterverzeichnis wo Du anstelle von 43 Kapitel 8 Aufgedeckte Geheimnisse normalen Dateinamen nur Identit tsnummern findest Durch die Verwendung von Identit tsnummern als Dateiname zusammen mit ein paar Sperrdateien und Zeitstempeltricks macht Git aus einem einfachen Dateisystem eine effiziente und robust
38. garniert mit Sperrdateien und Synchronisation f r Stabilit t Tats chlich beschreibt dies die fr heste Version von Git Nichtsdestotrotz abgesehen von geschickten Verpackungstricks um Speicherplatz zu sparen und geschickten Indizierungstricks um Zeit zu sparen wissen wir nun wie Git gewandt ein Dateisystem in eine Datenbank verwandelt das perfekt f r eine Versionsverwaltung geeignet ist Angenommen wenn irgendeine Datei in der Objektdatenbank durch einen Laufwerksfehler zerst rt wird dann wird sein SHA1 Hash Wert nicht mehr mit seinem Inhalt bereinstimmen und uns sagen wo das Problem liegt Durch Bilden von SHA1 Hash Werten aus den SHA1 Hash Werten anderer Objekte erreichen wir Integrit t auf allen Ebenen Commits sind elementar das hei t ein Commit kann niemals nur Teile einer nderung speichern wir k nnen den SHA1 Hash Wert eines Commits erst dann berechnen und speichern nachdem wir bereits alle relevanten Tree Objekte Blob Objekte und Eltern Commits gespeichert haben Die Objektdatenbank ist immun gegen unerwartete Unterbrechungen wie zum Beispiel einen Stromausfall Wir k nnen sogar den hinterh ltigsten Gegnern widerstehen Stell Dir vor jemand will den Inhalt einer Datei ndern die in einer lteren Version eines Projekt liegt Um die Objektdatenbank intakt aussehen zu lassen m ssten sie au erdem den SHA 1 Hash Wert des korrespondierenden Blob Objekt ndern da die Datei nun eine ge nderte Zeichenfolge enth lt D
39. h davon abgehalten meinem gewohnten Arbeitsablauf zu folgen Wenn ich eine langsame Anweisung auszuf hren hatte wurde durch die Unterbrechung meiner Gedankeng nge dem Arbeitsfluss ein unverh ltnism iger Schaden zugef gt W hrend des Wartens auf das Ende der Serverkommunikation tat ich etwas anderes um die Wartezeit zu berbr cken zum Beispiel E Mails lesen oder Dokumentation schreiben Wenn ich zur urspr nglichen Arbeit zur ckkehrte war die Operation l ngst beendet und ich vergeudete noch mehr Zeit beim Versuch mich zu erinnern was ich getan habe Menschen sind nicht gut im Kontextwechsel Da war auch ein interessanter Tragik der Allmende http de wikipedia org wiki Tragik_der_Allmende Effekt Netzwerk berlastungen erahnend verbrauchten einzelne Individuen f r diverse Operationen mehr Netzwerkbandbreite als erforderlich um zuk nftige Engp sse zu vermeiden Die Summe der Bem hungen verschlimmerte die berlastungen was einzelne wiederum ermutigte noch mehr Bandbreite zu verbrauchen um noch l ngere Wartezeiten zu verhindern 29 Kapitel 6 Multiplayer Git Anfangs benutzte ich Git bei einem privaten Projekt bei dem ich der einzige Entwickler war Unter den Befehlen im Zusammenhang mit Git s verteilter Art brauchte ich nur pull und clone damit konnte ich das selbe Projekt an unterschiedlichen Orten halten Sp ter wollte ich meinen Code mit Git ver ffentlichen und nderungen von Mitstreitern einbinden Ich muss
40. hg git Erweiterung ein Git Projekt automatisch die Benutzer von Mercurial mit einbezieht Die Erweiterung kann auch ein Mercurial Repository in ein Git Repository umwandeln indem man in ein leeres Repository pushed Einfacher geht das mit dem hg fast export sh Skript welches es hier gibt git clone git repo or cz fast export git Zum Konvertieren gib in einem leeren Verzeichnis ein git init hg fast export sh r hg repo nachdem Du das Skript zu deinem PATH hinzugef gt hast 3 11 Bazaar Wir erw hnen auch kurz Bazaar weil es nach Git und Mercurial das bekannteste freie verteilte Versionsverwaltungssystem ist Bazaar hat den Vorteil des R ckblicks da es relativ jung ist seine Entwickler konnten aus Fehlern der Vergangenheit lernen und kleine historische Unwegbarkeiten umgehen Au erdem waren sich die Entwickler der Popularit t und Interoperabilit t mit anderen Versionsverwaltungssystemen bewusst 15 Kapitel 3 Rund ums Clonen Eine bzr git Erweiterung l sst Anwender von Bazaar einigerma en mit Git Repositories arbeiten Das tailor Programm konvertiert Bazaar Repositories zu Git Repositories und kann das forlaufend tun w hrend bzr fast export f r einmalige Konvertierungen besser geeignet ist 3 12 Warum ich Git benutze Ich habe urspr nglich Git gew hlt weil ich geh rt habe dass es die unvorstellbar un berschaubaren Linux Kernel Quellcodes verwalten kann Ich hatte noch keinen Grund zu wechseln Git ha
41. ibenden Beeintr chtigungen kannst Du nur auf eine L sung warten Oder noch besser anpacken und mithelfen A 1 SHA1 Schw che Mit der Zeit entdecken Kryptographen immer mehr Schw chen an SHAI Schon heute w re f r finanzkr ftige Unternehmen es technisch machbar Hash Kollisionen zu finden In ein paar Jahren hat vielleicht schon ein ganz normaler Heim PC ausreichend Rechenleistung um ein Git Reopsitory unbemerkt zu korrumpieren Hoffentlich stellt Git auf eine bessere Hash Funktion um bevor die Forschung SHA1 komplett unn tz macht A 2 Microsoft Windows Git unter Microsoft Windows kann frustrierend sein e Cygwin http cygwin com eine Linux hnliche Umgebung f r Windows enth lt eine Windows Portierung von Git http cygwin com packages git Git unter MSys http code google com p msysgit ist eine Alternative die sehr wenig Laufzeitunterstiitzung erfordert jedoch bediirfen einige Kommandos noch einer Uberarbeitung A 3 Dateien ohne Bezug Wenn Dein Projekt sehr gro ist und viele Dateien enth lt die in keinem direkten Bezug stehen trotzdem aber h ufig ge ndert werden kann Git nachteiliger sein als andere Systeme weil es keine einzelnen Dateien berwacht Git berwacht immer das ganze Projekt was normalerweise schon von Vorteil ist Eine L sung ist es Dein Projekt in kleinere St cke aufzuteilen von denen jedes nur die in Beziehung stehenden Dateien enth lt Benutze git submodule wenn Du trotzd
42. in Repository einen Branch mit diesem Namen hat und dass er die offizielle Version enth lt Auch wenn Du den master Branch umbenennen oder ausl schen K nntest Kannst Du diese Konvention aber auch respektieren 4 8 Tempor re Branches Nach einer Weile wirst Du feststellen dass Du regelm ig kurzlebige Branches erzeugst meist aus dem gleichen Grund jeder neue Branch dient lediglich dazu den aktuellen Stand zu sichern damit Du kurz zu einem alten Stand zur ck kannst um eine vorrangige Fehlerbehebung zu machen oder irgendetwas anderes Es ist vergleichbar mit dem kurzzeitigen Umschalten des Fernsehkanals um zu sehen was auf dem anderen Kanal los ist Doch anstelle ein paar Kn pfe zu dr cken machst du create checkout merge und delete von tempor ren Branches Gl cklicherweise hat Git eine Abk rzung daf r die genauso komfortabel ist wie eine Fernbedienung git stash Das sichert den aktuellen Stand an einem tempor ren Ort stash Versteck und stellt den vorherigen Stand wieder her Dein Arbeitsverzeichnis erscheint wieder exakt in dem Zustand wie es war bevor Du 22 Kapitel 4 Branch Magie anfingst zu editieren Nun kannst Du Fehler beheben nderungen vom zentralen Repository holen pull und so weiter Wenn Du wieder zur ck zu Deinen nderungen willst tippe git stash apply Es kann sein dass Du Konflikte aufl sen musst Du kannst mehrere stashes haben und diese unterschiedlich handhaben Siehe gi
43. in Server alle gespeicherten Spiele sonst niemand Jeder Spieler hatte nur ein paar gespeicherte Spiele auf seinem Rechner Wenn ein Spieler einen Fortschritt machen wollte musste er den aktuellsten Stand vom Hauptserver herunterladen eine Weile spielen sichern und den Stand dann wieder auf den Server laden damit irgendjemand ihn nutzen kann Was wenn ein Spieler aus irgendeinem Grund einen alten Spielstand will Vielleicht ist der aktuell gesicherte Spielstand nicht mehr l sbar weil jemand in der dritten Ebene vergessen hat ein Objekt aufzunehmen und sie versuchen den letzten Spielstand zu finden ab dem das Spiel wieder l sbar ist Oder sie wollen zwei Spielst nde vergleichen um festzustellen wie viel ein Spieler geleistet hat Es gibt viele Gr nde warum man einen lteren Stand sehen will aber das Ergebnis ist das selbe Man muss vom Hauptserver das alte gespeicherte Spiel anfordern Je mehr gespeicherte Spiele ben tigt werden desto mehr Kommunikation ist erforderlich Die neue Generation der Versionsverwaltungssysteme zu denen Git geh rt werden verteilte Systeme genannt und k nnen als eine Verallgemeinerung der zentralisierten Systeme verstanden werden Wenn Spieler vom Hauptserver herunterladen erhalten sie jedes gespeichertes Spiel nicht nur das zuletzt gespeicherte Es ist als ob der Hauptserver gespiegelt wird Dieses erste Cloning kann teuer sein vor allem wenn eine lange Geschichte existiert aber auf Dauer wird e
44. ist eine andere Git Hosting Seite bevorzugt f r Open Source Projekte http github com hostet Open Source Projekte kostenlos und geschlossene Projekte gegen Geb hr Vielen Dank an alle diese Seiten f r das Hosten dieser Anleitung 2 Lizenz Diese Anleitung ist unter der GNU General Public License Version 3 http www gnu org licenses gpl 3 0 html ver ffentlicht Nat rlich wird der Quelltext in einem Git Repository gehalten und kann abgerufen werden durch git clone git repo or cz gitmagic git Erstellt gitmagic Verzeichnis oder von einem der Mirrorserver git clone git github com blynn gitmagic git git clone git gitorious org gitmagic mainline git vii Kapitel 1 Einleitung Ich benutze eine Analogie um in die Versionsverwaltung einzuf hren F r eine vern nftigere Erkl rung siehe den Wikipedia Artikel zur Versionsverwaltung http de wikipedia org wiki Versionsverwaltung 1 1 Arbeit ist Spiel Ich spiele Computerspiele schon fast mein ganzes Leben Im Gegensatz dazu habe ich erst als Erwachsener damit begonnen Versionsverwaltungssysteme zu benutzen Ich vermute dass ich damit nicht alleine bin und der Vergleich hilft vielleicht dabei die Konzepte einfacher zu erkl ren und zu verstehen Stelle Dir das Bearbeiten deines Codes oder Deiner Dokumente wie ein Computerspiel vor Wenn Du gut vorangekommen bist willst Du das Erreichte sichern Um das zu tun klickst Du auf auf Speichern in Deinem vert
45. ive Datensicheung A 13 3 8 Multitasking mit Lichtgeschwindigkeit nme 13 3 9 Versionsverwaltung im Untergrund 00 0 eee ceeceeceseeseeeeceeeseeeesecaeesacsaeceeceseeseeeeecaessaesaeenees 14 3 102 Mercunal 5 dereen EE ge cate ses onsite es 14 SD BER EE EE 15 3 12 Warum ich Git benutze 2r 2u80 288 8020818 BER RR SR EENS EE In a 16 KT 17 4 1 Die Chef Taster 50er mark sie Bean een 17 SS E EE 18 4 3 Schnelle Fehlerbeheb ng 3 2222 cee iste DEENEN is EIER IS essen 19 4 4 EE 19 4 5 Kontinuierlicher Arbeits fus Sron in E E TEE EE E 20 4 6 Mischmasch R eofganisierei suysin e esai ev e So ESSEKS EES Aei 21 AT Branches E EE 22 4 8 Tempor re Branches airs ee a Hessen ers in 22 4 9 Arbeite wie Du willst a senken EE EEN 23 iii S GOSchichts Stud 6 iiiesscesceccssesssans e dE dE EEN sooi estada eT Eed 24 5 1 Ich nehme alles zur ck nennen mens sense 24 3 2 2 5 UN NOCH vielmehr ran Bassett als ana 24 5 3 Lokale nderungen zum Schuss Sn Ele 25 3 4 Chronik umschreiben d knerlaiesienelliehilueh lei au 25 5 3 Geschichte machen u nenn REINE alien 26 5 6 Wo ging alles schief 25 8082 Ren an pe Brenn 27 3 7 Wer ist verantworth ch EE 28 3 8 Pers nliche Erfahrungen sssrini e eor E SEE Bub Bun 28 6 Multiplayer Git E 30 6 1 Werbin Ich RE 30 6 2 Git ibersS SHY TTP EE 30 6 3 Git ber alles 48 22 22 ie kurse ee Ah sh et ee et 31 6 4 Patches Das globale Zahlungsmitt
46. m Beispiel die Unterschiede zum ersten Elternteil anzuzeigen git diff HEAD Du kannst diese Notation mit anderen Typen kombinieren Zum Beispiel git checkout 1b6d 2 10 b uralt beginnt einen neuen Branch uralt welcher den Stand 10 Commits zur ck vom zweiten Elternteil des ersten Elternteil des Commits dessen Hashwert mit 1b6d beginnt 4 5 Kontinuierlicher Arbeitsfluss In Herstellungsprozessen muss der zweite Schritt eines Plans oft auf die Fertigstellung des ersten Schritt warten Ein Auto das repariert werden soll steht unbenutzt in der Garage bis ein Ersatzteil geliefert wird Ein Prototyp muss warten bis ein Baustein fabriziert wurde bevor die Konstruktion fortgesetzt werden kann Bei Softwareprojekten kann das hnlich sein Der zweite Teil eines Leistungsmerkmals muss warten bis der erste Teil ver ffentlicht und getestet wurde Einige Projekte erfordern dass Dein Code berpr ft werden muss bevor er akzeptiert wird Du musst also warten bis der erste Teil gepr ft wurde bevor Du mit dem zweiten Teil anfangen kannst Dank des schmerzlosen Branchen und Mergen k nnen wir die Regeln beugen und am Teil II arbeiten bevor Teil I offiziell freigegeben wurde Angenommen Du hast Teil Icommitet und zur Pr fung eingereicht Sagen wir Du bist im master Branch Dann branche zu Teil II git checkout b teil 20 Kapitel 4 Branch Magie Du arbeitest also an Teil II und commitest Deine nderungen regelm
47. magic F r eine schnelle und lokale Kopie dieser Seite Praktisch wenn dieser Server offline ist http csdef stanford edu status e Gedrucktes Buch Amazon com http www amazon com Git Magic Ben Lynn dp 145 1523343 64 Seiten 15 24cm x 22 86cm schwarz wei Praktisch wenn es keinen Strom gibt vi Vorwort 1 Danke Ich bin erstaunt dass so viele Leute an der bersetzung dieser Seiten gearbeitet haben Ich wei es zu w rdigen dass ich dank der Bem hungen der oben genannten einen gr eren Leserkreis erreiche Dustin Sallings Alberto Bertogli James Cameron Douglas Livingstone Michael Budde Richard Albury Tarmigan Derek Mahar Frode Aannevik Keith Rarick Andy Somerville Ralf Recker yvind A Holm Miklos Vajna S bastien Hinderer Thomas Miedema Joe Malin und Tyler Breisacher haben Korrekturen und Verbesserungen beigesteuert Francois Marier unterh lt das Debian Packet das urspr nglich von Daniel Baumann erstellt wurde Meine Dankbarkeit gilt auch vielen anderen f r deren Unterst tzung und Lob Ich war versucht Euch hier alle aufzuz hlen aber das k nnte Erwartungen in unermesslichem Umfang wecken Wenn ich Dich versehentlich vergessen habe sag mir bitte Bescheid oder schicke mir einfach einen Patch Kostenloses Git Hosting http repo or cz hostet freie Projekte Die allererste Git Hosting Seite Gegr ndet und betrieben von einem der ersten Git Entwickler http gitorious org
48. n Was wenn Du am Ende die tempor ren nderungen sichern willst Einfach git checkout b schmutzig und commite bevor Du auf den Master Branch zur ckschaltest Wann immer Du zu Deiner Schmutzarbeit zur ckkehren willst tippe einfach git checkout schnmutzig 18 Kapitel 4 Branch Magie Wir sind mit dieser Anweisung schon in einem fr heren Kapitel in Ber hrung gekommen als wir das Laden alter St nde besprochen haben Nun k nnen wir die ganze Geschichte erz hlen Die Dateien ndern sich zu dem angeforderten Stand aber wir m ssen den Master Branch verlassen Jeder Commit ab jetzt f hrt Deine Dateien auf einen anderen Weg dem wir sp ter noch einen Namen geben k nnen Mit anderen Worten nach dem Abrufen eines alten Stands versetzt Dich Git automatisch in einen neuen unbenannten Branch der mit git checkout b benannt und gesichert werden kann 4 3 Schnelle Fehlerbehebung Du steckst mitten in der Arbeit als es hei t alles fallen zu lassen um einen neu entdeckten Fehler in Commit 1b6d zu beheben git commit a git checkout b fixes 1b6d Dann wenn Du den Fehler behoben hast git commit a m Fehler behoben git checkout master und fahre mit Deiner urspriinglichen Arbeit fort Du kannst sogar die frisch gebackene Fehlerkorrektur auf Deinen aktuellen Stand tibernehmen git merge fixes 4 4 Mergen Mit einigen Versionsverwaltungssystemen ist das Erstellen eines Branch einfach aber d
49. n Diese Spiele versteckten die Details vor dem Spieler und pr sentierten eine bequeme Oberfl che um verschiedene Versionen des Ordners zu verwalten Kapitel 1 Einleitung Versionsverwaltungen sind nicht anders Sie alle haben bequeme Schnittstellen um Ordner voller Dateien zu verwalten Du kannst den Zustand des Ordners sichern so oft Du willst und du kannst sp ter jeden Sicherungspunkt wieder herstellen Im Gegensatz zu den meisten Computerspielen sind sie aber in der Regel daf r ausgelegt sparsam mit dem Speicherplatz umzugehen Normalerweise ndern sich immer nur wenige Dateien zwischen zwei Versionen und die nderungen selbst sind oft nicht gro Die Platzersparnis beruht auf dem Speichern der Unterschiede an Stelle einer Kopie der ganzen Datei 1 3 Verteilte Kontrolle Nun stell Dir ein ganz kompliziertes Computerspiel vor So schwierig zu l sen dass viele erfahrene Spieler auf der ganzen Welt beschlie en sich zusammen zu tun und ihre gespeicherten Spielst nde auszutauschen um das Spiel zu beenden Speedruns sind Beispiele aus dem echten Leben Spieler die sich in unterschiedlichen Spielebenen des selben Spiels spezialisiert haben arbeiten zusammen um erstaunliche Ergebnisse zu erzielen Wie w rdest Du ein System erstellen bei dem jeder auf einfache Weise die Sicherungen der anderen bekommt Und eigene Sicherungen bereitstellt Fr her nutzte jedes Projekt eine zentralisierte Versionsverwaltung Irgendwo speicherte e
50. n Gedankengang zu unterbrechen ist schlecht f r die Produktivit t und je komplizierter der Kontextwechsel ist desto gr er ist der Verlust Mit zentraler Versionsverwaltung m ssen wir eine neue Arbeitskopie vom Server herunterladen Bei verteilen Systemen ist das viel besser da wir die ben tigt Version lokal clonen k nnen Doch das Clonen bringt das Kopieren des gesamten Arbeitsverzeichnis wie auch die ganze Geschichte bis zum angegebenen Punkt mit sich Auch wenn Git die Kosten durch Dateifreigaben und Verkn pfungen reduziert m ssen doch die gesamten Projektdateien im neuen Arbeitsverzeichnis erstellt werden L sung Git hat ein besseres Werkzeug f r diese Situationen die wesentlich schneller und platzsparender als clonen ist git branch Mit diesem Zauberwort verwandeln sich die Dateien in Deinem Arbeitsverzeichnis pl tzlich von einer Version in eine andere Diese Verwandlung kann mehr als nur in der Geschichte vor und zur ck gehen Deine Dateien k nnen sich verwandeln vom aktuellsten Stand zur experimentellen Version zum neusten Entwicklungsstand zur Version Deines Freundes und so weiter 4 1 Die Chef Taste Hast Du schon einmal ein Spiel gespielt wo beim Dr cken einer Taste der Chef Taste der Monitor sofort ein Tabellenblatt oder etwas anderes angezeigt hat Dass wenn der Chef ins B ro spaziert w hrend Du das Spiel spielst Du es schnell verstecken kannst In irgendeinem Verzeichnis echo Ich bin kl g
51. on git bisect run mein Skript Git benutzt den Riickgabewert der bergebenen Anweisung normalerweise ein Skript f r einmalige Ausf hrung um zu entscheiden ob eine nderung gut good oder schlecht bad ist Das Skript sollte 0 f r good zur ckgeben 125 wenn die nderung bersprungen werden soll und irgendetwas zwischen 1 und 127 f r bad Ein negativer R ckgabewert beendet die bisect Operation sofort Du kannst noch viel mehr machen die Hilfe erkl rt wie man bisect Operationen visualisiert das bisect Log untersucht oder wiedergibt und sicher unschuldige nderungen ausschlie t um die Suche zu beschleunigen 5 7 Wer ist verantwortlich Wie viele andere Versionsverwaltungssysteme hat Git eine blame Anweisung git blame bug c das jede Zeile in der angegebenen Datei kommentiert um anzuzeigen wer sie zuletzt ge ndert hat und wann Im Gegensatz zu vielen anderen Versionsverwaltungssystemen funktioniert diese Operation offline es wird nur von der lokalen Festplatte gelesen 5 8 Pers nliche Erfahrungen In einem zentralisierten Versionsverwaltungssystem ist das Bearbeiten der Chronik eine schwierige Angelegenheit und den Administratoren vorbehalten Clonen Branchen und Mergen sind unm glich ohne Netzwerkverbindung Ebenso grundlegende Funktionen wie das Durchsuchen der Chronik oder das comitten einer nderung In manchen Systemen ben tigt der Anwender schon eine Netzwerkverbindung nur um seine eigenen nderungen
52. on Magie nicht zu unterscheiden nme 48 As GIS E nannten essen essen herrschen 50 Ac Te SHAT Schw che ent Sieger eege eg 50 AT Microsoft WiNdoWE ee en aa anna Bla ls 50 A 3 Dateien hne Bezug oo AAG A A ee ERIE 50 A4 Wer macht WAS u a rn le na re a est ee E E REENE 50 As D teihistorie eu nina EEE rain 51 A 6 Dererster Klon nl nen eh ann EN E E debs Sey duoc cestendon tes 51 A 7 Unbest ndige Projekte AAA 51 A8 Globaler E 52 A 9 Leere Unterver eichniss s inni a n e EE E Fu O E E A 52 AOE Initialer EE 53 A 11 Eigenarten der Anwendung 53 B Diese Anleitung bersetzen sesesessesessoseosesoesessesessesossesossesoesessesossesossessesossesosoesosoesessossesesoesessesessese 54 Vorwort Git http git or cz ist eine Art Schweizer Taschenmesser f r Versionsverwaltung Ein zuverl ssiges vielseitiges Mehrzweck Versionsverwaltungswerkzeug dessen au ergew hnliche Flexibilit t es schwierig zu erlernen macht ganz zu schweigen davon es zu meistern Wie Arthur C Clarke festgestellt hat ist jede hinreichend fortschrittliche Technologie nicht von Magie zu unterscheiden Das ist ein gro artiger Ansatz um an Git heranzugehen Anf nger k nnen seine inneren Mechanismen ignorieren und Git als ein Ding ansehen dass mit seinen erstaunlichen F higkeiten Freunde verz ckt und Gegner zur Wei glut bringt Anstatt die Details aufzudecken bieten wir grobe Anweisungen f r die jeweiligen Funktionen Bei regelm iger
53. on unabh ngigen nderungen weil es 36 Kapitel 7 Git f r Fortgeschrittene Dein Stil ist Keine Sorge gib ein git add p F r jede nderung die Du gemacht hast zeigt Git Dir die Codepassagen die sich ge ndert haben und fragt ob sie Teil des n chsten Commit sein sollen Antworte mit y f r Ja oder n f r Nein Du hast auch noch andere Optionen z B den Aufschub der Entscheidung dr cke um mehr zu erfahren Wenn Du zufrieden bist gib git commit ein um exakt die ausgew hlten nderungen zu comitten die inszenierten nderungen Achte darauf nicht die Option a einzusetzen anderenfalls wird Git alle nderungen comitten Was ist wenn Du viele Dateien an verschiedenen Orten bearbeitet hast Jede Datei einzeln nachzupr fen ist frustrierend und erm dend In diesem Fall verwende git add i dessen Bedienung ist nicht ganz einfach daf r aber sehr flexibel Mit ein paar Tastendr cken kannst Du mehrere ge nderte Dateien f r den Commit hinzuf gen stage oder entfernen unstage oder nderungen einzelner Dateien nachpr fen und hinzuf gen Alternativ kannst Du git commit interactive verwenden was dann automatisch die ausgew hlten nderungen commited nachdem Du fertig bist 7 4 Der Index Git s Bereitstellungsraum Bis jetzt haben wir Git s ber hmten Index gemieden aber nun m ssen wir uns mit ihm auseinandersetzen um das bisherige zu erkl ren Der Index ist ein tempor rer Bereitst
54. origin HEAD Oder Du kannst schauen was auf dem Branch experimentell los war git log origin experimentell 6 7 Mehrere Remotes Angenommen zwei andere Entwickler arbeiten an Deinem Projekt und wir wollen beide im Auge behalten Wir k nnen mehr als ein Repository gleichzeitig beobachten mit git remote add other git example com some_repo git git pull other some_branch Nun haben wir einen Branch vom zweiten Repository eingebunden und wir haben einfachen Zugriff auf alle Branches von allen Repositories git diff origin experimentell other some_branch 5 Aber was wenn wir nur deren Anderungen vergleichen wollen ohne unsere eigene Arbeit zu beeinflussen Mit anderen Worten wir wollen ihre Branches untersuchen ohne dass deren Anderungen in unser Arbeitsverzeichnis einflie en Anstatt pull benutzt Du dann git fetch Fetch vom origin der Standard git fetch other Fetch vom zweiten Programmierer Dies holt lediglich die Chroniken Obwohl das Arbeitsverzeichnis unver ndert bleibt k nnen wir nun jeden Branch aus jedem Repository in einer Git Anweisung referenzieren da wir eine lokale Kopie besitzen Erinnere Dich dass ein Pull hinter den Kulissen einfach ein fetch gefolgt von einem merge ist Normalerweise machen wir einen pull weil wir die letzten Commits abrufen und einbinden wollen Die beschriebene Situation ist eine erw hnenswerte Ausnahme Siehe git help remote um zu sehen wie man Remote Rep
55. ositories entfernt bestimmte Branches ignoriert und mehr 34 Kapitel 6 Multiplayer Git 6 8 Meine Einstellungen F r meine Projekte bevorzuge ich es wenn Unterst tzer Repositories vorbereiten von denen ich pullen kann Verschiedene Git Hosting Anbieter lassen Dich mit einem Klick deine eigene Fork eines Projekts hosten Nachdem ich einen Zweig abgerufen habe benutze ich Git Anweisungen um durch die nderungen zu navigieren und zu untersuchen die idealerweise gut organisiert und dokumentiert sind Ich merge meine eigenen nderungen und f hre eventuell weitere nderungen durch Wenn ich zufrieden bin pushe ich in das zentrale Repository Obwohl ich nur unregelm ig Beitr ge erhalte glaube ich dass diese Methode sich auszahlt Siehe diesen Blog Beitrag von Linus Torvalds englisch http torvalds family blogspot com 2009 06 happiness is warm scm htm In der Git Welt zu bleiben ist etwas bequemer als Patch Dateien denn es erspart mir sie in Git Commits zu konvertieren Au erdem k mmert sich Git um die Details wie Autorname und eMail Adresse genauso wie um Datum und Uhrzeit und es fordert den Autor zum Beschreiben seiner eigenen nderungen auf 35 Kapitel 7 Git f r Fortgeschrittene Mittlerweile solltest Du Dich in den git help Seiten zurechtfinden und das meiste verstanden haben Trotzdem kann es langwierig sein den exakten Befehl zur L sung einer bestimmten Aufgabe herauszufinden Vielleicht kann ich Dir
56. pick 100834f Push Ziel zum Makefile hinzugef gt 24 Kapitel 5 Geschichtsstunde Dann e Entferne Commits durch das L schen von Zeilen e Organisiere Commits durch verschieben von Zeilen e Ersetze pick mit e edit um einen Commit f r amends zu markieren reword um die Log Beschreibung zu ndern squash um einen Commit mit dem vorhergehenden zu vereinen merge fixup um einen Commit mit dem vorhergehenden zu vereinen merge und die Log Beschreibung zu verwerfen Speichere und Beende Wenn Du einen Commit mit edit markiert hast gib ein git commit amend Ansonsten git rebase continue Also commite fr h und oft Du kannst sp ter mit rebase aufr umen 5 3 Lokale Anderungen zum Schluss Du arbeitest an einem aktiven Projekt Uber die Zeit haben sich einige lokale Commits angesammelt und dann synchronisierst Du mit einem Merge mit dem offiziellen Zweig Dieser Zyklus wiederholt sich ein paar Mal bevor Du zum Pushen in den zentralen Zweig bereit bist Aber nun ist die Chronik in deinem lokalen Git Clone ein chaotisches Durcheinander deiner Anderungen und den nderungen vom offiziellen Zweig Du willst alle Deine nderungen lieber in einem fortlaufenden Abschnitt und hinter den offiziellen nderungen sehen Das ist eine Aufgabe f r git rebase wie oben beschrieben In vielen F llen kannst Du den onto Schalter benutzen um Interaktion zu vermeiden Siehe auch git help rebase f r ausf hrliche Beispi
57. pielstand der ab jetzt gesichert wird entsteht in dem separaten Branch welcher der alternative Realit t entspricht dazu kommen wir sp ter Du kannst auch nur einzelne Dateien oder Verzeichnisse wiederherstellen indem Du sie an den Befehl anh ngst git checkout 82f5 eine datei andere datei Sei vorsichtig diese Art des Checkout kann Dateien berschreiben ohne dass Du etwas merkst Um Unf lle zu vermeiden solltest Du immer commiten bevor Du ein Checkout machst besonders am Anfang wenn Du Git noch erlernst Allgemein gilt Wenn Du unsicher bist egal ob ein Git Befehl oder irgendeine andere Operation f hre zuerst git commit a aus Du magst Kopieren und Einf gen von Hashes nicht Dann nutze git checkout Meine erste Si um zu einem Commit zu springen dessen Beschreibung so anf ngt Du kannst auch nach dem 5 letzten Commit fragen git checkout master 5 2 4 Ruckgangig machen In einem Gerichtssaal k nnen Ereignisse aus den Akten gel scht werden hnlich kannst Du gezielt Commits r ckg ngig machen git commit a git revert 1b6d wird den Commit mit dem angegebenen Hashwert r ckg ngig machen Das R ckg ngig machen wird als neuer Commit erstellt was mit git log tiberpriift werden kann 2 5 Changelog erstellen Verschiedene Projekte ben tigen ein nderungsprotokoll http de wikipedia org wiki C3 84nderungsprotokoll Das kannst du mit folgendem Befehl Kapitel 2 Erste Schritte erstell
58. rauten Editor Aber das berschreibt die vorherige Version Das ist wie bei den Spielen der alten Schule die nur Speicherplatz f r eine Sicherung hatten sicherlich konntest Du speichern aber Du konntest nie zu einem lteren Stand zur ck Das war eine Schande denn vielleicht war Deine vorherige Sicherung an einer au ergew hnlich spannenden Stelle des Spiels zu der Du sp ter gerne noch einmal zur ckkehren m chtest Oder noch schlimmer Deine aktuelle Sicherung ist in einem nicht l sbaren Stand dann musst Du von ganz vorne beginnen 1 2 Versionsverwaltung Beim Editieren kannst Du Deine Datei durch Speichern unter mit einem neuen Namen abspeichern oder Du kopierst sie vor dem Speichern irgendwo hin um die alte Version zu erhalten Au erdem kannst Du sie komprimieren um Speicherplatz zu sparen Das ist eine primitive und m hselige Form der Versionsverwaltung Computerspiele machten das lange Zeit so viele von ihnen hatten automatisch erstellte Sicherungspunkte mit Zeitstempel Jetzt lass uns das Problem etwas komplizierter machen Sagen wir Du hast einen Haufen Dateien die zusammen geh ren z B Quellcodes f r ein Projekt oder Dateien einer Website Wenn Du nun eine alte Version erhalten willst musst Du den ganzen Ordner archivieren Viele Versionen auf diese Art zu archivieren ist m hselig und kann sehr schnell teuer werden Bei einigen Computerspielen bestand ein gesicherter Stand wirklich aus einem Ordner voller Dateie
59. rderungen entspricht Ein einfacher Trick ist es die in Git integrierte Aliasfunktion zu verwenden um die am h ufigsten benutzten Anweisungen zu verk rzen git config global alias co checkout 39 Kapitel 7 Git f r Fortgeschrittene git config global get regexp alias display current aliases alias co checkout git co foo same as git checkout foo Etwas anderes ist der aktuelle Branch im Prompt oder Fenstertitel Die Anweisung git symbolic ref HEAD zeigt den Namen des aktuellen Branch In der Praxis m chtest Du aber das refs heads entfernen und Fehler ignorieren git symbolic ref HEAD 2 gt dev null cut b 12 Das contrib Unterverzeichnis ist eine Fundgrube von Werkzeugen die auf Git aufbauen Mit der Zeit k nnen einige davon zu offiziellen Anweisungen bef rdert werden Auf Debian und Ubuntu findet man dieses Verzeichnis unter usr share doc git core contribk Ein beliebter Vertreter ist workdir git new workdir Durch cleveres verlinken erzeugt dieses Skript ein neues Arbeitsverzeichis das seine Versionsgeschichte mit dem original Repository teilt git new workdir ein existierendes repo neues verzeichnis Das neue Verzeichnis und die Dateien darin kann man sich als Clone vorstellen mit dem Unterschied dass durch die gemeinschaftliche Versionsgeschichte die beiden Versionen automatisch synchron bleiben Eine Synchronisierung mittels merge push oder pull ist nicht notwendig 7 8
60. rt und die Dateistatusinformationen aktualisiert w hrend die commit Anweisung ohne Optionen einen Commit nur auf Basis der Dateistatusinformationen erzeugt weil die Dateien ja schon in der Datenbank sind 8 5 Git s Wurzeln Dieser Linux Kernel Mailing List Beitrag http Ikml org lkml 2005 4 6 121 beschreibt die Kette von Ereignissen die zu Git gef hrt haben Der ganze Beitrag ist eine faszinierende arch ologische Seite f r Git Historiker 44 Kapitel 8 Aufgedeckte Geheimnisse 8 6 Die Objektdatenbank Jegliche Versionen Deiner Daten wird in der Objektdatenbank gehalten welche im Unterverzeichnis git objects liegt Die anderen Orte in git enthalten weniger wichtige Daten den Index Branch Namen Bezeichner tags Konfigurationsoptionen Logdateien die Position des aktuellen HEAD Commit und so weiter Die Objektdatenbank ist einfach aber trotzdem elegant und sie ist die Quelle von Git s Macht Jede Datei in git objects ist ein Objekt Es gibt drei Arten von Objekten die uns betreffen Blob Tree und Commit Objekte 8 7 Blobs Zuerst ein Zaubertrick Suche Dir irgendeinen Dateinamen aus In einem leeren Verzeichnis echo sweet gt DEIN_DATEINAME git init git add find git objects type f un un mn wn Du wirst folgendes sehen git objects aa 823728ea7d592acc69b36875a482cdf3fd5c8d Wie konnte ich das wissen ohne den Dateiname zu kennen Weil der SHA1 Hash Wert von blob SP 6 NU
61. s sich lohnen Ein unmittelbarer Vorteil ist wenn aus irgendeinem Grund ein lterer Stand ben tigt wird ist keine Kommunikation mit dem Hauptserver notwendig Kapitel 1 Einleitung 1 4 Ein dummer Aberglaube Ein weit verbreitetes Missverst ndnis ist dass verteilte System ungeeignet sind f r Projekte die ein offizielles zentrales Repository ben tigen Nichts k nnte weiter von der Wahrheit entfernt sein Jemanden zu fotografieren stiehlt nicht dessen Seele Genauso wenig setzt das Clonen des zentralen Repository dessen Bedeutung herab Eine gute erste Ann herung ist dass alles was eine zentralisierte Versionsverwaltung kann ein gut durchdachtes verteiltes System besser kann Netzwerkressourcen sind einfach teurer als lokale Ressourcen Auch wenn wir sp ter Nachteile beim verteilten Ansatz sehen werden ist man mit dieser Faustregel weniger anf llig f r falsche Vergleiche Ein kleines Projekt mag nur einen Bruchteil der M glichkeiten ben tigen die so ein System bietet Aber deshalb ein einfacheres schlecht erweiterbares System zu benutzen ist wie r mische Ziffern zum Rechnen mit kleinen Zahlen zu verwenden Au erdem k nnte Dein Projekt weit ber die urspr nglichen Erwartungen hinauswachsen Git von Anfang an zu benutzen ist wie ein Schweizer Taschenmesser mit sich zu tragen auch wenn damit meistens nur Flaschen ge ffnet werden Eines Tages brauchst Du vielleicht dringend einen Schraubendreher dann bist du froh mehr
62. schichte eines Projekts enth lt aber niemals einen Auszug irgendeiner beliebigen Version Ein bare Repository bernimmt die Rolle des Hauptserver in einem zentralisierten Versionsverwaltungssystem Das Zuhause Deines Projekts Entwickler clonen Dein Projekt davon und pushen die letzten offiziellen nderungen dort hin Meistens befindet es sich auf einem Server der nicht viel tut au er Daten zu verbreiten Die Entwicklung findet in den Clonen statt so kann das Heim Repository ohne Arbeitsverzeichnis auskommen Viele Git Befehle funktionieren nicht in bare Repositories Es sei denn die GIT_DIR Umgebungsvariable wird auf das Arbeitsverzeichnis gesetzt oder die bare Option wird bergeben 3 5 Push oder Pull Warum haben wir den push Befehl eingef hrt anstatt bei dem vertrauten pull Befehl zu bleiben Zuerst pull funktioniert nicht mit bare Repositories stattdessen benutze fetch ein Befehl den wir sp ter behandeln Aber auch wenn wir ein normales Repository auf dem zentralen Server halten w rden w re das pullen eine m hselige Angelegenheit Wir m ssten uns zuerst in den Server einloggen und dem pull Befehl die Netzwerkadresse des Computer bergeben von dem aus wir die nderungen pullen also abholen wollen Firewalls k nnten uns st ren und was wenn wir gar keine Berechtigung f r eine Serverkonsole haben Wie auch immer abgesehen von diesem Fall raten wir vom Pushen in ein Repository ab Falls das Ziel n mlich ein Arbeits
63. sitory gesetzt so dass selbst dann wenn der HEAD des Quell Repository inzwischen auf einen anderen Branch gewechselt hat ein sp terer pull treu dem original Branch folgen wird Diese Option gilt nur f r das Repository von dem als erstes gecloned wurde was in der Option branch master remote hinterlegt ist Bei einem pull aus anderen Repositories m ssen wir explizit angeben welchen Branch wir wollen git pull git beispiel com anderes git master Das obige erkl rt warum einige von unseren fr heren push und pull Beispielen keine Argumente hatten 6 6 Entfernte Branches Wenn Du ein Repository clonst clonst Du auch alle seine Branches Das hast Du vielleicht noch nicht bemerkt denn Git versteckt diese Du musst speziell danach fragen Das verhindert dass Branches vom entfernten Repository Deine lokalen Branches st ren und es macht Git einfacher f r Anf nger Zeige die entfernten Branches an mit git branch r Du solltes etwas sehen wie origin HEAD origin master 33 Kapitel 6 Multiplayer Git origin experimentell Diese Liste zeigt die Branches und den HEAD des entfernten Repository welche auch in regul ren Git Anweisungen verwendet werden k nnen Zum Beispiel angenommen Du hast viele Commits gemacht und m chtest einen Vergleich zur letzten abgeholten Version machen Du kannst die Logs nach dem entsprechenden SH AT Hashwert durchsuchen aber es ist viel einfacher folgendes einzugeben git diff
64. st m ssen wir ein wenig tricksen git commit amend m Shakespeare ndere die Bemerkung git filter branch nv filter export GIT_AUTHOR_DATE Fri 13 Feb 2009 15 31 30 0800 GIT_AUTHOR_NAME Alice GIT_AUTHOR_EMATL alice example com GIT_COMMITTER_DATE Fri 13 Feb 2009 15 31 30 0800 GIT_COMMITTER_NAME Bob GIT_COMMITTER_EMAIL bob example com Manipuliere Zeitstempel und Autor find git objects type f Du solltest nun git objects 49 993fe130c4b3bf24857a15d7969c396b7bc187 finden was dem SHA1 Hash Wert seines Inhalts entspricht commit 158 NUL tree 05b6217bb859794408bb9e4f7f04cbda4b207fbe9 LF author Alice lt alice example com gt 1234567890 0800 LF committer Bob lt bob example com gt 1234567890 0800 LF LF Shakespeare LF 47 Kapitel 8 Aufgedeckte Geheimnisse Wie vorhin kannst Du zpipe oder cat file benutzen um es f r Dich zu berpr fen Das ist der erste Commit gewesen deshalb gibt es keine Eltern Commits Aber sp tere Commits werden immer mindestens eine Zeile enthalten die den Eltern Commit identifiziert 8 10 Von Magie nicht zu unterscheiden Git s Geheimnisse scheinen zu einfach Es sieht so aus als m sste man nur ein paar Kommandozeilenskripte zusammenmixen einen Schu C Code hinzuf gen und innerhalb ein paar Stunden ist man fertig eine Mischung von grundlegenden Dateisystemoperationen und SHA1 Hash Berechnungen
65. t git checkout master Die Anweisung git fast export konvertiert jedes Repository in das git fast import Format dessen Ausgabe Du studieren kannst um Exporte zu schreiben und auBerdem um Repositories im menschenlesbaren Text zu tibertragen Tats chlich k nnen diese Anweisungen Klartext Repositories ber reine Textkan le bertragen 5 6 Wo ging alles schief Du hast gerade eine Funktion in Deiner Anwendung entdeckt die nicht mehr funktioniert und Du wei t sicher dass sie vor ein paar Monaten noch ging Argh Wo kommt dieser Fehler her H ttest Du nur die Funktion w hrend der Entwicklung getestet Daf r ist es nun zu sp t Wie auch immer vorausgesetzt Du hast oft comittet kann Git Dir sagen wo das Problem liegt git bisect start git bisect bad HEAD git bisect good 1b6d Git ruft einen Stand ab der genau dazwischen liegt Teste die Funktion und wenn sie immer noch nicht funktioniert git bisect bad 27 Kapitel 5 Geschichtsstunde Wenn nicht ersetzte bad mit good Git versetzt Dich wieder auf einen Stand genau zwischen den bekannten Versionen good und bad und reduziert so die M glichkeiten Nach ein paar Durchl ufen wird Dich diese bin re Suche zu dem Commit f hren der die Probleme verursacht Wenn Du deine Ermittlungen abgeschlossen hast kehre zum Originalstand zur ck mit git bisect reset Anstatt jede nderung per Hand zu untersuchen automatisiere die Suche durch Ausf hren v
66. t help stash Wie Du Dir vielleicht schon gedacht hast verwendet Git Branches im Hintergrund um diesen Zaubertrick durchzuf hren 4 9 Arbeite wie Du willst Du magst Dich fragen ob Branches diesen Aufwand wert sind Immerhin sind Clone fast genauso schnell und Du kannst mit cd anstelle von esoterischen Git Befehlen zwischen ihnen wechseln Betrachten wir Webbrowser Warum mehrere Tabs unterst tzen und mehrere Fenster Weil beides zu erlauben eine Vielzahl an Stilen unterst tzt Einige Anwender m chten nur ein Browserfenster ge ffnet haben und benutzen Tabs f r unterschiedliche Webseiten Andere bestehen auf dem anderen Extrem mehrere Fenster ganz ohne Tabs Wieder andere bevorzugen irgendetwas dazwischen Branchen ist wie Tabs f r dein Arbeitsverzeichnis und Clonen ist wie das ffnen eines neuen Browserfenster Diese Operationen sind schnell und lokal also warum nicht damit experimentieren um die beste Kombination f r sich selbst zu finden Git l sst Dich genauso arbeiten wie Du es willst 23 Kapitel 5 Geschichtsstunde Eine Folge von Git s verteilter Natur ist dass die Chronik einfach ver ndert werden kann Aber wenn Du an der Vergangenheit manipulierst sei vorsichtig ver ndere nur den Teil der Chronik den Du ganz alleine hast So wie Nationen ewig diskutieren wer welche Greueltaten vollbracht hat wirst Du beim Abgleichen in Schwierigkeiten geraten falls jemand einen Clone mit abweichender Chronik hat und die
67. t mir bewundernswert gedient und hat mich bis jetzt noch nie im Stich gelassen Da ich in erster Linie unter Linux arbeite sind Probleme anderer Plattformen bedeutungslos Ich bevorzuge auch C Programme und bash Skripte gegen ber Anwendungen wie zum Beispiel Python Skripts Es gibt weniger Abh ngigkeiten und ich bin s chtig nach schellen Ausf hrungszeiten Ich dachte dar ber nach wie Git verbessert werden k nnte ging sogar so weit dass ich meine eigene Git hnliche Anwendung schrieb allerdings nur als akademische bungen H tte ich mein Projekt fertig gestellt w re ich trotzdem bei Git geblieben denn die Verbesserungen w ren zu gering gewesen um den Einsatz eines Eigenbr dler Systems zu rechtfertigen Nat rlich k nnen Deine Bed rfnisse und W nsche ganz anders sein und vielleicht bist Du mit einem anderen System besser dran Wie auch immer mit Git Kannst Du nicht viel falsch machen 16 Kapitel 4 Branch Magie Unverz gliches Branchen und Mergen sind die hervorstechenden Eigenschaften von Git Problem Externe Faktoren zwingen zum Wechsel des Kontext Ein schwerwiegender Fehler in der ver ffentlichten Version tritt ohne Vorwarnung auf Die Frist f r ein bestimmtes Leistungsmerkmal r ckt n her Ein Entwickler dessen Unterst tzung f r eine Schl sselstelle im Projekt wichtig ist verl sst das Team In allen F llen musst Du alles stehen und liegen lassen und Dich auf eine komplett andere Aufgabe konzentrieren De
68. te aktiviert weiter oben im Abschnitt Git ber HTTP Dieser l uft immer wenn der HEAD sich bewegt Das Beispiel post update Skript aktualisiert Dateien welche Git fiir die Kommunikation ber Git agnostic transports wie z B HTTP ben tigt 42 Kapitel 8 Aufgedeckte Geheimnisse Wir werfen einen Blick unter die Motorhaube und erkl ren wie Git seine Wunder vollbringt Ich werde nicht ins Detail gehen F r tiefer gehende Erkl rungen verweise ich auf das englischsprachige Benutzerhandbuch http www kernel org pub software scm git docs user manual html 8 1 Unsichtbarkeit Wie kann Git so unauff llig sein Abgesehen von gelegentlichen Commits und Merges kannst Du arbeiten als w rde die Versionsverwaltung nicht existieren Das hei t bis Du sie brauchst Und das ist wenn Du froh bist dass Git die ganze Zeit ber Dich gewacht hat Andere Versionsverwaltungssysteme zwingen Dich st ndig Dich mit Verwaltungskram und B rokratie herumzuschlagen Dateien k nnen schreibgesch tzt sein bis Du einem zentralen Server mitteilst welche Dateien Du gerne bearbeiten m chtest Die einfachsten Befehle werden bis zum Schneckentempo verlangsamt wenn die Anzahl der Anwender steigt Deine Arbeit kommt zum Stillstand wenn das Netzwerk oder der zentrale Server weg sind Im Gegensatz dazu h lt Git seinen Verlauf einfach im git Verzeichnis von Deinem Arbeitsverzeichnis Das ist Deine eigene Kopie der Versionsgeschichte damit kannst Du so lange o
69. te lernen wie man Projekte verwaltet an denen mehrere Entwickler aus aller Welt beteiligt waren Gl cklicherweise ist das Git s St rke und wohl auch seine Daseinsberechtigung 6 1 Wer bin ich Jeder Commit enth lt Name und eMail Adresse des Autors welche mit git log angezeigt werden Standardm ig nutzt Git Systemeinstellungen um diese Felder auszuf llen Um diese Angaben explizit zu setzen gib ein git config global user name Max Mustermann git config global user email maxmustermann beispiel de Lasse den global Schalter weg um diese Einstellungen f r das aktuelle Repository zu setzen 6 2 Git ber SSH HTTP Angenommen Du hast einen SSH Zugang zu einem Webserver aber Git ist nicht installiert Wenn auch nicht so effizient wie mit dem systemeigenen Protokoll kann Git ber HTTP kommunizieren Lade Git herunter compiliere und installiere es unter Deinem Benutzerkonto und erstellen ein Repository in Deinem Webverzeichnis GIT_DIR proj git git init cd proj git git bare update server info cp hooks post update sample hooks post update un un Im an Bei lteren Git Versionen funktioniert der copy Befehl nicht stattdessen gib ein chmod a x hooks post update Nun kannst Du Deine letzten nderungen ber SSH von jedem Clone aus ver ffentlichen git push web server pfad zu proj git master 30 Kapitel 6 Multiplayer Git und jedermann kann Dein Projekt abrufen mit git clone h
70. te zu schreiben sodass mit jedem Update das zentrale Git Repository einen Z hler erh ht Vielleicht in Form eines Tags der mit dem SHA1 Hash des letzten Commit verkn pft ist Jeder Klon k nnte einen solchen Z hler bereitstellen aber der w re vermutlich nutzlos denn nur der Z hler des zentralen Repository ist f r alle relevant 52 Anhang A Git s M ngel A 9 Leere Unterverzeichnisse Leere Unterverzeichnisse k nnen nicht berwacht werden Erstelle eine Dummy Datei um dieses Problem zu umgehen Die aktuelle Implementierung von Git weniger sein Design ist verantwortlich f r diesen Pferdefu Mit etwas Gl ck wenn Git s Verbreitung zunimmt und mehr Anwender nach dieser Funktion verlangen wird sie vielleicht implementiert A 10 Initialer Commit Ein klischeehafter Computerwissenschaftler z hlt von 0 statt von 1 Leider bezogen auf Commits h lt sich Git nicht an diese Konvention Viele Kommandos sind m rrisch vor dem intialen Commit Zus tzlich m ssen verschiedene Grenzf lle speziell behandelt werden wie der Rebase eines Branch mit einem abweichenden initialen Commit Git w rde davon provitieren einen Null Commit zu definieren sofort nach dem Erstellen eines Repository wird der HEAD auf eine Zeichenfolge von 20 Null Bytes gesetzt Dieser spezielle Commit repr sentiert einen leeren Tree ohne Eltern irgendwann vielleicht der Vorfahr aller Git Repositories W rde dann zum Beispiel git log ausgef hrt w
71. tei dann gib ein git am lt email txt Das wendet den eingegangenen Patch an und erzeugt einen Commit inklusive der Informationen wie z B den Autor Mit einer Webmail Anwendung musst Du eventuell ein Button anklicken um die eMail in ihrem rohen Originalformat anzuzeigen bevor Du den Patch in eine Datei sicherst Es gibt geringf gige Unterschiede bei mbox basierten eMail Anwendungen aber wenn Du eine davon benutzt geh rst Du vermutlich zu der Gruppe Personen die damit einfach umgehen k nnen ohne Anleitungen zu lesen 32 Kapitel 6 Multiplayer Git 6 5 Entschuldigung wir sind umgezogen Nach dem Clonen eines Repositories wird git push oder git pull automatisch auf die original URL zugreifen Wie macht Git das Das Geheimnis liegt in der Konfiguration die beim Clonen erzeugt wurde Lasst uns einen Blick riskieren git config list Die remote origin url Option kontrolliert die Quell URL origin ist der Spitzname der dem Quell Repository gegeben wurde Wie mit der master Branch Konvention k nnen wir diesen Spitznamen ndern oder l schen aber es gibt f r gew hnlich keinen Grund dies zu tun Wenn das original Repository verschoben wird k nnen wir die URL aktualisieren mit git config remote origin url git neue url proj git Die branch master merge Option definiert den Standard Remote Branch bei einem git pull W hrend des urspr nglichen Clonen wird sie auf den aktuellen Branch des Quell Repo
72. ttp web server proj git 6 3 Git ber alles Willst Du Repositories ohne Server synchronisieren oder gar ohne Netzwerkverbindung Musst Du w hrend eines Notfalls improvisieren Wir haben gesehen dass man mit git fast export und git fast import Repositories in eine einzige Datei konvertieren kann und zur ck Wir k nnen solche Dateien hin und her schicken um Git Repositories ber jedes beliebige Medium zu transportieren aber ein effizienteres Werkzeug ist git bundle Der Absender erstellt ein Bundle git bundle creat inedatei HEAD und transportiert das Bundle einedatei irgendwie zum anderen Beteiligten per eMail USB Stick einen xxd Hexdump und einen OCR Scanner Morsecode ber Telefon Rauchzeichen usw Der Empf nger holt sich die Commits aus dem Bundle durch Eingabe von git pull einedatei Der Empf nger kann das sogar mit einem leeren Repository tun Trotz seiner Gr e einedatei enth lt das komplette original Git Repository In gr eren Projekten vermeidest Du Datenm ll indem Du nur nderungen bundlest die in den anderen Repositories fehlen Zum Beispiel nehmen wir an der Commit 1b6d ist der aktuellste den beide Parteien haben git bundle creat inedatei HEAD lb6d Macht man das regelm ig kann man leicht vergessen welcher Commit zuletzt gesendet wurde Die Hilfeseiten schlagen vor Tags zu benutzen um dieses Problem zu l sen Das hei t nachdem Du ein Bundle gesendet hast
73. u manipulieren 3 8 Multitasking mit Lichtgeschwindigkeit Nehmen wir an Du willst parallel an mehreren Funktionen arbeiten Dann commite Dein Projekt und gib ein git clone irgendein neuer ordner Harten Links http de wikipedia org wiki Harter_Link ist es zu verdanken dass ein lokaler Klon weniger Zeit und Speicherplatz ben tigt als eine herk mmliche Datensicherung 13 Kapitel 3 Rund ums Clonen Du kannst nun an zwei unabh ngigen Funktionen gleichzeitig arbeiten Zum Beispiel kannst Du an einen Klon bearbeiten w hrend der andere kompiliert wird Zu jeder Zeit kannst Du comitten und die nderungen des anderen Klon pullen git pull der andere clone HEAD 3 9 Versionsverwaltung im Untergrund Arbeitest Du an einem Projekt das ein anderes Versionsverwaltungssystem nutzt und vermisst Du Git Dann erstelle ein Git Repository in deinem Arbeitsverzeichnis git init S git add git commit m Erster Commit dann Clone es git clone irgendein neuer ordner Nun gehe in das neue Verzeichnis und arbeite dort mit Git nach Herzenslust Irgendwann wirst Du dann mit den anderen synchronisieren wollen dann gehe in das Originalverzeichnis aktualisiere mit dem anderen Versionsverwaltungssystem und gib ein git add git commit m Synchronisation mit den anderen Dann gehe wieder ins neue Verzeichnis und gib ein git commit a m Beschreibung der nderungen git pull Die Vorgehens
74. verzeichnis hat k nnen Verwirrungen entstehen Kurzum w hrend du lernst mit Git umzugehen pushe nur wenn das Ziel ein bare Repository ist andernfalls benutze pull 12 Kapitel 3 Rund ums Clonen 3 6 Fork eines Projekts Hast Du es satt wie sich ein Projekt entwickelt Du denkst Du kannst das besser Dann mache folgendes auf deinem Server git clone git haupt server pfad zu dateien Dann erz hle jedem von Deinem Fork des Projekts auf Deinem Server Zu jedem sp teren Zeitpunkt kannst du die nderungen des Originalprojekts mergen mit git pull 3 7 Ultimative Datensicherung Du willst zahlreiche vor Manipulation gesch tzte redundante Datensicherungen an unterschiedlichen Orten Wenn Dein Projekt viele Entwickler hat musst Du nichts tun Jeder Clone Deines Codes ist eine vollwertige Datensicherung Nicht nur des aktuellen Stand sondern die gesamte Geschichte Wird irgendein Clone besch digt wird dies dank des kryptographischen Hashing sofort erkannt sobald derjenige versucht mit anderen zu kommunizieren Wenn Dein Projekt nicht so bekannt ist finde so viele Server wie Du kannst um dort einen Clone zu platzieren Die wirklich Paranoiden sollten immer den letzten 20 Byte SHA1 Hash des HEAD aufschreiben und an einem sicheren Ort aufbewahren Er muss sicher sein aber nicht privat Zum Beispiel w re es sicher ihn in einer Zeitung zu ver ffentlichen denn es ist schwer f r einen Angreifer jede Zeitungskopie z
75. weise wie Du Deine nderungen den anderen bergibst h ngt vom anderen Versionsverwaltungssystem ab Das neue Verzeichnis enth lt die Dateien mit deinen nderungen F hre die Anweisungen des anderen Versionsverwaltungssystems aus die n tig sind um die Dateien ins zentrale Repository zu bertragen Subversion vielleicht das beste zentralisierte Versionsverwaltungssystem wird von unz hligen Projekten benutzt Der git svn Befehl automatisiert den zuvor genannten Ablauf f r Subversion Repositories und kann auch benutzt werden um ein Git Projekt in ein Subversion Repository zu exportieren http google opensource blogspot com 2008 05 export git project to google code html 14 Kapitel 3 Rund ums Clonen 3 10 Mercurial Mercurial ist ein hnliches Versionsverwaltungssystem das fast nahtlos mit Git zusammenarbeiten kann Mit der hg git Erweiterung kann ein Benutzer von Mercurial verlustfrei in ein Git Repository pushen und daraus pullen Beschaffe Dir die hg git Erweiterung mit Git git clone git github com schacon hg git git oder Mercurial hg clone http bitbucket org durin42 hg git Leider kenne ich keine solche Erweiterung f r Git Aus diesem Grund pl diere ich f r Git statt Mercurial f r ein zentrales Repository auch wenn man Mercurial bevorzugt Bei einem Mercurial Projekt gibt es gew hnlich immer einen Freiwilligen der parallel dazu ein Git Repository f r die Git Anwender unterh lt wogegen Dank der
Download Pdf Manuals
Related Search
Related Contents
Manual del propietario Cambridge Azur 650BD Cruise 2.0 manual de instruções e operação Pentair Side Pool Cleaner User's Manual Forerunner® 910XT Aufbauanleitung & Bedienungsanleitung AT – Relax 1 Sony Cyber-shot DSC-W220 User`s Manual Panasonic KXTG4773B Answering Machine User Manual Copyright © All rights reserved.
Failed to retrieve file