Typo-Korrekturen5
[gitmagic.git] / de / multiplayer.txt
blobd6b821fea6629bd0b170bb18af0d812f8fd13732
1 == Multiplayer Git ==
3 Anfangs benutzte ich Git bei einem privaten Projekt, bei dem ich der einzige
4 Entwickler war. Unter den Befehlen im Zusammenhang mit Git's verteilter Art,
5 brauchte ich nur *pull* und *clone*, damit konnte ich das selbe Projekt an
6 unterschiedlichen Orten halten.
8 Später wollte ich meinen Code mit Git veröffentlichen und Änderungen von
9 Mitstreitern einbinden. Ich musste lernen, wie man Projekte verwaltet, an
10 denen mehrere Entwickler aus aller Welt beteiligt waren. Glücklicherweise
11 ist das Git's Stärke und wohl auch seine Daseinsberechtigung.
13 === Wer bin ich? ===
15 Jeder 'Commit' enthält Name und eMail-Adresse des Autors, welche mit *git
16 log* angezeigt werden. Standardmäßig nutzt Git Systemeinstellungen, um diese
17 Felder auszufüllen. Um diese Angaben explizit zu setzen, gib ein:
19   $ git config --global user.name "Max Mustermann"
20   $ git config --global user.email maxmustermann@beispiel.de
22 Lasse den -global Schalter weg, um diese Einstellungen für das aktuelle
23 'Repository' zu setzen.
25 === Git über SSH, HTTP ===
27 Angenommen, Du hast einen SSH-Zugang zu einem Webserver, aber Git ist nicht
28 installiert. Wenn auch nicht so effizient wie mit dem systemeigenen
29 Protokoll, kann Git über HTTP kommunizieren.
31 Lade Git herunter, compiliere und installiere es unter Deinem Benutzerkonto
32 und erstellen ein 'Repository' in Deinem Webverzeichnis:
34  $ GIT_DIR=proj.git git init
35  $ cd proj.git
36  $ git --bare update-server-info
37  $ cp hooks/post-update.sample hooks/post-update
39 Bei älteren Git Versionen funktioniert der 'copy'-Befehl nicht, stattdessen
40 gib ein:
42  $ chmod a+x hooks/post-update
44 Nun kannst Du Deine letzten Änderungen über SSH von jedem 'Clone' aus
45 veröffentlichen.
47  $ git push web.server:/pfad/zu/proj.git master
49 und jedermann kann Dein Projekt abrufen mit:
51  $ git clone http://web.server/proj.git
53 === Git über alles ===
55 Willst Du 'Repositories' ohne Server synchronisieren oder gar ohne
56 Netzwerkverbindung? Musst Du während eines Notfalls improvisieren? Wir haben
57 gesehen, dass man mit <<makinghistory, *git fast-export* und *git
58 fast-import* 'Repositories' in eine einzige Datei konvertieren kann und
59 zurück>>. Wir können solche Dateien hin und her schicken um Git
60 'Repositories' über jedes beliebige Medium zu transportieren, aber ein
61 effizienteres Werkzeug ist *git bundle*.
63 Der Absender erstellt ein 'Bundle':
65  $ git bundle create einedatei HEAD
67 und transportiert das 'Bundle' +einedatei+ irgendwie zum anderen
68 Beteiligten: per eMail, USB-Stick, einen *xxd* Hexdump und einen OCR
69 Scanner, Morsecode über Telefon, Rauchzeichen usw. Der Empfänger holt sich
70 die 'Commits' aus dem 'Bundle' durch Eingabe von:
72  $ git pull einedatei
74 Der Empfänger kann das sogar mit einem leeren 'Repository' tun. Trotz seiner
75 Größe, +einedatei+ enthält das komplette original Git 'Repository'.
77 In größeren Projekten vermeidest Du Datenmüll, indem Du nur Änderungen
78 'bundlest', die in den anderen 'Repositories' fehlen. Zum Beispiel, nehmen
79 wir an, der 'Commit' ``1b6d...'' ist der aktuellste, den beide Parteien
80 haben:
82  $ git bundle create einedatei HEAD ^1b6d
84 Macht man das regelmäßig, kann man leicht vergessen, welcher 'Commit'
85 zuletzt gesendet wurde. Die Hilfeseiten schlagen vor 'Tags' zu benutzen, um
86 dieses Problem zu lösen. Das heißt, nachdem Du ein 'Bundle' gesendet hast,
87 gib ein:
89  $ git tag -f letztesbundle HEAD
91 und erstelle neue Aktualisierungsbundles mit:
93  $ git bundle create neuesbundle HEAD ^letztesbundle
95 === Patches: Das globale Zahlungsmittel ===
97 'Patches' sind die Klartextdarstellung Deiner Änderungen, die von Computern
98 und Menschen gleichermaßen einfach verstanden werden. Dies verleiht ihnen
99 eine universelle Anziehungskraft. Du kannst einen 'Patch' Entwicklern
100 schicken, ganz egal, was für ein Versionsverwaltungssystem sie
101 benutzen. Solange Deine Mitstreiter ihre eMails lesen können, können sie
102 auch Deine Änderungen sehen. Auch auf Deiner Seite ist alles was Du brauchst
103 ein eMail-Konto: es gibt keine Notwendigkeit ein Online Git 'Repository'
104 aufzusetzen.
106 Erinnere Dich an das erste Kapitel:
108  $ git diff 1b6d > mein.patch
110 gibt einen 'Patch' aus, der zur Diskussion einfach in eine eMail eingefügt
111 werden kann. In einem Git 'Repository' gib ein:
113  $ git apply < mein.patch
115 um den 'Patch' anzuwenden.
117 In einer offizielleren Umgebung, wenn Autorennamen und eventuell Signaturen
118 aufgezeichnet werden sollen, erstelle die entsprechenden 'Patches' nach
119 einem bestimmten Punkt durch Eingabe von:
121  $ git format-patch 1b6d
123 Die resultierenden Dateien können an *git-send-email* übergeben werden oder
124 von Hand verschickt werden. Du kannst auch eine Gruppe von 'Commits'
125 angeben:
127  $ git format-patch 1b6d..HEAD^^
129 Auf der Empfängerseite speichere die eMail in eine Datei, dann gib ein:
131  $ git am < email.txt
133 Das wendet den eingegangenen 'Patch' an und erzeugt einen 'Commit',
134 inklusive der Informationen wie z.B. den Autor.
136 Mit einer Webmail Anwendung musst Du eventuell ein Button anklicken, um die
137 eMail in ihrem rohen Originalformat anzuzeigen, bevor Du den 'Patch' in eine
138 Datei sicherst.
140 Es gibt geringfügige Unterschiede bei mbox-basierten eMail Anwendungen, aber
141 wenn Du eine davon benutzt, gehörst Du vermutlich zu der Gruppe Personen,
142 die damit einfach umgehen können, ohne Anleitungen zu lesen.!
144 === Entschuldigung, wir sind umgezogen. ===
146 Nach dem 'Clonen' eines 'Repositories', wird *git push* oder *git pull*
147 automatisch auf die original URL zugreifen. Wie macht Git das? Das Geheimnis
148 liegt in der Konfiguration, die beim 'Clonen' erzeugt wurde. Lasst uns einen
149 Blick riskieren:
151  $ git config --list
153 Die +remote.origin.url+ Option kontrolliert die Quell-URL; ``origin'' ist
154 der Spitzname, der dem Quell-'Repository' gegeben wurde. Wie mit der
155 ``master'' 'Branch' Konvention können wir diesen Spitznamen ändern oder
156 löschen, aber es gibt für gewöhnlich keinen Grund dies, zu tun.
158 Wenn das original 'Repository' verschoben wird, können wir die URL
159 aktualisieren mit:
161  $ git config remote.origin.url git://neue.url/proj.git
163 Die +branch.master.merge+ Option definiert den Standard-Remote-'Branch' bei
164 einem *git pull*. Während dem ursprünglichen 'clonen' wird sie auf den
165 aktuellen 'Branch' des Quell-'Repository' gesetzt, so dass selbst dann, wenn
166 der 'HEAD' des Quell-'Repository' inzwischen auf einen anderen 'Branch'
167 gewechselt hat, ein späterer 'pull' wird treu dem original 'Branch' folgen.
169 Diese Option gilt nur für das 'Repository', von dem als erstes 'gecloned'
170 wurde, was in der Option +branch.master.remote+ hinterlegt ist. Bei einem
171 'pull' aus  anderen 'Repositories' müssen wir explizit angeben, welchen
172 'Branch' wir wollen:
174  $ git pull git://beispiel.com/anderes.git master
176 Das obige erklärt, warum einige von unseren früheren 'push' und 'pull'
177 Beispielen keine Argumente hatten.
179 === Entfernte 'Branches' ===
181 Wenn Du ein 'Repository' 'clonst', 'clonst' Du auch alle seine
182 'Branches'. Das hast Du vielleicht noch nicht bemerkt, denn Git versteckt
183 diese: Du musst speziell danach fragen. Das verhindert, dass 'Branches' vom
184 entfernten 'Repository' Deine lokalen 'Branches' stören und es macht Git
185 einfacher für Anfänger.
187 Zeige die entfernten 'Branches' an mit:
189  $ git branch -r
191 Du solltes etwas sehen wie:
193  origin/HEAD
194  origin/master
195  origin/experimentell
197 Diese Liste zeigt die 'Branches' und den HEAD des entfernten 'Repository',
198 welche auch in regulären Git Anweisungen verwendet werden können. Zum
199 Beispiel, angenommen Du hast viele 'Commits' gemacht und möchtest einen
200 Vergleich zur letzten abgeholten Version machen. Du kannst die Logs nach dem
201 entsprechenden SHA1 Hashwert durchsuchen, aber es ist viel einfacher,
202 folgendes einzugeben:
204  $ git diff origin/HEAD
206 Oder Du kannst schauen, was auf dem 'Branch' ``experimentell'' los war:
208  $ git log origin/experimentell
210 === Mehrere 'Remotes' ===
212 Angenommen, zwei andere Entwickler arbeiten an Deinem Projekt, und wir wollen
213 beide im Auge behalten. Wir können mehr als ein 'Repository' gleichzeitig
214 beobachten mit:
216  $ git remote add other git://example.com/some_repo.git
217  $ git pull other some_branch
219 Nun haben wir einen 'Branch' vom zweiten 'Repository' eingebunden und wir
220 haben einfachen Zugriff auf alle 'Branches' von allen 'Repositories':
222  $ git diff origin/experimentell^ other/some_branch~5
224 Aber was, wenn wir nur deren Änderungen vergleichen wollen, ohne unsere
225 eigene Arbeit zu beeinflussen? Mit anderen Worten, wir wollen ihre
226 'Branches' untersuchen, ohne dass deren Änderungen in unser
227 Arbeitsverzeichnis einfließen. Anstatt 'pull' benutzt Du dann:
229  $ git fetch        # Fetch vom origin, der Standard.
230  $ git fetch other  # Fetch vom zweiten Programmierer.
232 Dies holt lediglich die Chroniken. Obwohl das Arbeitsverzeichnis unverändert
233 bleibt, können wir nun jeden 'Branch' aus jedem 'Repository' in einer Git
234 Anweisung referenzieren, da wir eine lokale Kopie besitzen.
236 Erinnere Dich, dass ein 'Pull' hinter den Kulissen einfach ein *fetch*
237 gefolgt von einem *merge* ist. Normalerweise machen wir einen *pull*, weil
238 wir die letzten 'Commits' abrufen und einbinden wollen. Die beschriebene
239 Situation ist eine erwähnenswerte Ausnahme.
241 Siehe *git help remote*, um zu sehen, wie man Remote-'Repositories' entfernt,
242 bestimmte 'Branches' ignoriert und mehr.
244 === Meine Einstellungen ===
246 Für meine Projekte bevorzuge ich es, wenn Unterstützer 'Repositories'
247 vorbereiten, von denen ich 'pullen' kann. Verschiedene Git Hosting Anbieter
248 lassen Dich mit einem Klick deine eigene 'Fork' eines Projekts hosten.
250 Nachdem ich einen Zweig abgerufen habe, benutze ich Git Anweisungen, um durch
251 die Änderungen zu navigieren und zu untersuchen, die idealerweise gut
252 organisiert und dokumentiert sind. Ich 'merge' meine eigenen Änderungen und
253 führe eventuell weitere Änderungen durch. Wenn ich zufrieden bin, 'pushe'
254 ich in das zentrale 'Repository'.
256 Obwohl ich nur unregelmäßig Beiträge erhalte, glaube ich, dass diese Methode
257 sich auszahlt. Siehe
258 http://torvalds-family.blogspot.com/2009/06/happiness-is-warm-scm.html[diesen
259 Blog Beitrag von Linus Torvalds (englisch)].
261 In der Git Welt zu bleiben, ist etwas bequemer als 'Patch'-Dateien, denn es
262 erspart mir, sie in Git 'Commits' zu konvertieren. Außerdem kümmert sich Git
263 um die Details wie Autorname und eMail-Adresse, genauso wie um Datum und
264 Uhrzeit und es fordert den Autor zum Beschreiben seiner eigenen Änderungen
265 auf.