Entwicklung/Git: Unterschied zwischen den Versionen

Git-Installatiion ist bereits auf einer anderen Seite beschrieben
(Git-Installatiion ist bereits auf einer anderen Seite beschrieben)
 
(4 dazwischenliegende Versionen von 3 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
== Versionsverwaltung der Entwicklungsdaten mit Git  ==
== Versionsverwaltung der Entwicklungsdaten mit Git  ==
Das Opencaching.de-Projekt verwendet [http://git-scm.com/ Git] zur Verwaltung von Quellcode, Dokumentationen etc. Git ist leistungsfähiger und komplexer als klassische Versionsverwaltungstools wie CVS und Subversion. Es kann wesentlich besser mit Branches umgehen, also verschiedenen Codeversionen eines Projekts -- "branches (in Git) are cheap and easy". So kann man zu Testzwecken, zum Programmieren einzelner Features etc. eigene Zweige anlegen, die dann später wieder in den Haupt-Code (den ''Master-Branch'') einfließen oder wahlweise verworfen werden. Dieses Verzweigen und Wieder-Zusammenführen von Codeversionen ist erstaunlich einfach und zuverlässig. Richtig eingesetzt, erleichtert es das Projektmanagement.
Das Opencaching.de-Projekt verwendet [https://github.com/ Git] zur Verwaltung von Quellcode, Dokumentationen etc. Git ist leistungsfähiger und komplexer als klassische Versionsverwaltungstools wie CVS und Subversion. Es kann wesentlich besser mit Branches umgehen, also verschiedenen Codeversionen eines Projekts -- "branches (in Git) are cheap and easy". So kann man zu Testzwecken, zum Programmieren einzelner Features etc. eigene Zweige anlegen, die dann später wieder in den Haupt-Code (den ''Master-Branch'') einfließen oder wahlweise verworfen werden. Dieses Verzweigen und Wieder-Zusammenführen von Codeversionen ist erstaunlich einfach und zuverlässig. Richtig eingesetzt, erleichtert es das Projektmanagement.


Die Verwendung von Git setzt eine gewisse Lernkurve voraus. Diese Anleitung soll dir den Einstieg erleichtern und erklärt alles, was du für den Git-Einsatz bei Opencaching.de wissen musst (und Einiges mehr). Sie erklärt die Verwendung von Git anhand der Kommandozeilenversion, die für alle relevanten Betriebssysteme erhältlich ist. Daneben gibt es verschiedene komfortable Benutzeroberflächen. Gerne kannst du ein weiteres Kapitel für die von dir bevorzugte Git-UI hinzufügen!
Die Verwendung von Git setzt eine gewisse Lernkurve voraus. Diese Anleitung soll dir den Einstieg erleichtern und erklärt alles, was du für den Git-Einsatz bei Opencaching.de wissen musst (und Einiges mehr). Sie erklärt die Verwendung von Git anhand der Kommandozeilenversion, die für alle relevanten Betriebssysteme erhältlich ist. Daneben gibt es verschiedene komfortable Benutzeroberflächen. Gerne kannst du ein weiteres Kapitel für die von dir bevorzugte Git-UI hinzufügen!


Allgemeine Einführungen in Git findest du z.B. hier (Liste gerne ergänzen):
Allgemeine Einführungen in Git findest du z.B. hier (Liste gerne ergänzen):
* http://rogerdudler.github.io/git-guide/index.de.html - Der einfache Einstieg (deutsch)
* https://rogerdudler.github.io/git-guide/index.de.html - Der einfache Einstieg (deutsch)
* http://gitref.org/index.html - eine leichtverständliche Einführung
* https://docs.github.com/de - eine leichtverständliche Einführung
* http://stefanimhoff.de/2009/einstieg-in-git-als-versionskontrollsystem - Einstieg in Git (deutsch)
* https://www.stefanimhoff.de/git/ - Sammlung von einfachen und komplexeren Tutorials (englisch)
* http://git-scm.com/documentation - offizielle Dokumentation
 
== Installation ==
Git-Download
 
* ... für Windows: https://git-scm.com/download/win
* ... für Mac: https://git-scm.com/download/mac
 
Installation per Installationsprogramm und Standardeinstellungen. Zur Installation in der Entwickler-VM siehe [[Entwicklung/Entwicklersystem|Entwicklersystem]].
 
Nach der Installation von Git muss du einmalig deinen Name und eine Emailadresse eingeben:
git config --global user.name "Your Name Here"
git config --global user.email "your_email@youremail.com"
Diese Information wird später - für jeden einsehbar - zusammen mit jedem Codebeitrag (''commit'') von dir gespeichert. Verwende eine Emailadresse, die veröffentlicht werden darf, und ggf. einen Nickname. Diese Daten werden in der Datei <code>.gitconfig</code> in deinem Benutzerverzeichnis abgelegt.


== Funktionsweise von Git und Einsatz bei Opencaching.de ==
== Funktionsweise von Git und Einsatz bei Opencaching.de ==
Zeile 29: Zeile 14:


Die Entwickler können in beliebigen Topologien organisiert werden und gleichen den Inhalt ihrer Repositories wechselseitig miteinander ab. Opencaching.de verwendet eine Art Sternstruktur, mit einem Haupt-Repository unter der Adresse  
Die Entwickler können in beliebigen Topologien organisiert werden und gleichen den Inhalt ihrer Repositories wechselseitig miteinander ab. Opencaching.de verwendet eine Art Sternstruktur, mit einem Haupt-Repository unter der Adresse  
* http://github.com/OpencachingDeutschland/oc-server3
* https://github.com/OpencachingDeutschland/oc-server3
   
   
Auf dieses Repo haben nur der Code Maintainer und seine Vertreter Schreibzugriff; alle anderen können nur lesen. Um auch Daten hochladen zu können, besitzt jeder Entwickler bei Github.com eine eigene Kopie - einen "Fork" - des Haupt-Repositories, z.B.  
Auf dieses Repo haben nur der Code Maintainer und seine Vertreter Schreibzugriff; alle anderen können nur lesen. Um auch Daten hochladen zu können, besitzt jeder Entwickler bei GitHub.com eine eigene Kopie - einen "Fork" - des Haupt-Repositories, z.B.  
* http://github.com/flopp/oc-server3
* https://github.com/flopp/oc-server3
   
   
Dein erster Schritt als Opencaching-Entwickler ist das Anlegen deines Forks. Dazu legst du dir auf [http://github.com Github] einen kostenlosen Account an, gehst auf http://github.com/OpencachingDeutschland/oc-server3 und klickst oben rechts auf "Fork".
Dein erster Schritt als Opencaching-Entwickler ist das Anlegen deines Forks. Dazu legst du dir auf [https://github.com GitHub] einen kostenlosen Account an, gehst auf https://github.com/OpencachingDeutschland/oc-server3 und klickst oben rechts auf "Fork".


Der zweite Schritt ist, dir eine lokale Kopie - einen "Klon" - deines Forks anzulegen. Wie du das im OC.de-Entwicklersystem machst, ist im Artikel [[Entwicklung/Entwicklersystem|Entwicklersystem]] beschrieben. Hier machen wir es einfach mal testweise - du kannst so viele Klone anlegen wie du möchtest, den Github-Repositories ist das egal:
Der zweite Schritt ist, dir eine lokale Kopie - einen "Klon" - deines Forks anzulegen. Wie du das im OC.de-Entwicklersystem machst, ist im Artikel [[Entwicklung/Entwicklersystem|Entwicklersystem]] beschrieben. Hier machen wir es einfach mal testweise - du kannst so viele Klone anlegen wie du möchtest, den GitHub-Repositories ist das egal:
  git clone git://github.com/&lt;DeinBenutzername&gt;/oc-server3
  git clone git@github.com:&lt;DeinBenutzername&gt;/oc-server3


Nun wird bei dir ein Verzeichnis <code>oc-server3/.git</code> angelegt, das zunächst eine 1:1-Kopie deines Github-Forks ist (der zunächst eine 1:1-Kopie des Opencaching-Deutschland-Repos ist), und von dort der komplette aktuelle OC.de-Code in Unterverzeichnisse von <code>oc-server3</code> ausgecheckt. In <code>oc-server3</code> befinden sich also sowohl deine Arbeitsdaten als auch der lokale Repository-Klon. <code>oc-server3/.git/config</code> ist die Konfigurationsdatei des lokalen Repositories, die du aber nur selten von Hand bearbeiten wirst.
Nun wird bei dir ein Verzeichnis <code>oc-server3/.git</code> angelegt, das zunächst eine 1:1-Kopie deines GitHub-Forks ist (der zunächst eine 1:1-Kopie des Opencaching-Deutschland-Repos ist), und von dort der komplette aktuelle OC.de-Code in Unterverzeichnisse von <code>oc-server3</code> ausgecheckt. In <code>oc-server3</code> befinden sich also sowohl deine Arbeitsdaten als auch der lokale Repository-Klon. <code>oc-server3/.git/config</code> ist die Konfigurationsdatei des lokalen Repositories, die du aber nur selten von Hand bearbeiten wirst.


Dein Github-Fork heißt in deinem lokalen Repository ''origin''; über diesen Name kannst du mit verschiedenen Git-Kommandos darauf zugreifen. Um die Konfiguration abzuschließen, muss zusätzlich noch der ''upstream'' definiert werden - das Repository, aus dem du neue Daten abrufst. Dies ist nicht dein eigener Fork, sondern du beziehst die Daten direkt von OpencachingDeutschland. Navigiere dazu ins Verzeichnis <code>oc-server3</code> und führe dann folgenden Befehl aus:
Dein GitHub-Fork heißt in deinem lokalen Repository ''origin''; über diesen Name kannst du mit verschiedenen Git-Kommandos darauf zugreifen. Um die Konfiguration abzuschließen, muss zusätzlich noch der ''upstream'' definiert werden - das Repository, aus dem du neue Daten abrufst. Dies ist nicht dein eigener Fork, sondern du beziehst die Daten direkt von OpencachingDeutschland. Navigiere dazu ins Verzeichnis <code>oc-server3</code> und führe dann folgenden Befehl aus:
  git remote add upstream http://github.com/OpencachingDeutschland/oc-server3
 
  git remote add upstream git@github.com:OpencachingDeutschland/oc-server3


Mit <code>git remote -v</code> kannst du dir nun alle "remote"-Repositories anzeigen lassen, die in deinem Klon eingestellt sind.
Mit <code>git remote -v</code> kannst du dir nun alle "remote"-Repositories anzeigen lassen, die in deinem Klon eingestellt sind.
== Installation ==
Die Installation und Einrichtung von Git ist im Artikel [[Entwicklungsumgebung einrichten#Github|Entwicklungsumgebung einrichten]] beschrieben.


== Datenfluss ==
== Datenfluss ==
Zeile 75: Zeile 65:
in roter Farbe an, welche Dateien geändert oder hinzugefügt wurden, und
in roter Farbe an, welche Dateien geändert oder hinzugefügt wurden, und
  git diff
  git diff
die Änderungen im Einzelnen. Falls dein Editor bzw. deine Eintwicklungsumgebung irgendwelche zusätzlichen Dateien angelegt hat, kannst du diese in <code>.git/info/exclude</code> eintragen, damit sie nicht ins Repository gelangen.
die Änderungen im Einzelnen. Falls dein Editor bzw. deine Entwicklungsumgebung irgendwelche zusätzlichen Dateien angelegt hat, kannst du diese in <code>.git/info/exclude</code> eintragen, damit sie nicht ins Repository gelangen.


Als nächstes musst du Git mitteilen, dass die Daten zum aktiven Branch hinzugefügt werden sollen; dies geschieht mit
Als nächstes musst du Git mitteilen, dass die Daten zum aktiven Branch hinzugefügt werden sollen; dies geschieht mit
Zeile 91: Zeile 81:
siehst du nun, dass ein neuer ''commit'' in die Versionsgeschichte des aktiven Branches eingefügt wurde. Wahlweise kannst du auch mit <code>git log --stat</code> nochmals alle geänderten Dateien anzeigen lassen.
siehst du nun, dass ein neuer ''commit'' in die Versionsgeschichte des aktiven Branches eingefügt wurde. Wahlweise kannst du auch mit <code>git log --stat</code> nochmals alle geänderten Dateien anzeigen lassen.


Um den Commit mit einem Ticket in der [[Entwicklung/Todo-Liste|Redmine-Todo-Liste]] zu verknüpfen, kannst du im Kommentar das Stichwort "updates #nnn" einfügen, mit #nnn = Redmine-Ticketnummer. Der Commit erscheint dann innerhalb des Tickets, sobald er geprüft und in den ''development''-Branch übernommen wurde.
Um den Commit später mit einem Ticket in der [[Entwicklung/Todo-Liste|Jira]] zu verknüpfen, kannst du im Kommentar die Ticket Nummer (inklusive Projekt Kürzel) angeben. Aktuell übernimmt es das jedoch nur für Pull Requests. Dort sollte die Ticket Nummer am Anfang stehen.


==== Exkurs: commits ====
==== Exkurs: Commits ====
   
   
Commits sind das Hauptelement der Arbeit mit Git. Jeder Branch ist eine bestimmte Abfolge von Commits. Verschiedene Branches unterscheiden sich dadurch, welche Commits sie enthalten. Ein Commit ist ein Patch, der eine oder mehrere Dateien verändert, hinzufügt und/oder löscht. Jeder Commit hat einen eindeutigen Hashcode, der im Log angezeigt wird. Über diesen Code lassen sich Commits einzeln herauspicken, rückgängig machen, als Diff anzeigen etc. Dabei genügt die Angabe der ersten paar Zeichen, sofern sie eindeutig sind; üblich als Kurzform sind die ersten 7-10 Zeichen.
Commits sind das Hauptelement der Arbeit mit Git. Jeder Branch ist eine bestimmte Abfolge von Commits. Verschiedene Branches unterscheiden sich dadurch, welche Commits sie enthalten. Ein Commit ist ein Patch, der eine oder mehrere Dateien verändert, hinzufügt und/oder löscht. Jeder Commit hat einen eindeutigen Hashcode, der im Log angezeigt wird. Über diesen Code lassen sich Commits einzeln herauspicken, rückgängig machen, als Diff anzeigen etc. Dabei genügt die Angabe der ersten paar Zeichen, sofern sie eindeutig sind; üblich als Kurzform sind die ersten 7-10 Zeichen.
Zeile 147: Zeile 137:
* Hochladen
* Hochladen
*# <code>git push origin 1234-neues-Feature</code>
*# <code>git push origin 1234-neues-Feature</code>
*# ''Branch 1234-neues-Feature'' im Github aufrufen und Pull Request starten
*# ''Branch 1234-neues-Feature'' auf GitHub aufrufen und Pull Request starten
* Nicht mehr benötigte Branches löschen
* Nicht mehr benötigte Branches löschen
*# lokal: <code>git checkout development</code> / <code>git branch -d 1234-neues-Feature</code>
*# lokal: <code>git checkout development</code> / <code>git branch -d 1234-neues-Feature</code>
Zeile 185: Zeile 175:
* <code>git revert commit-ID</code>
* <code>git revert commit-ID</code>
* <code>git push</code>
* <code>git push</code>
* evt. Pull-Request auf dem Github, wenn es bereits im Upstream angekommen war
* evt. Pull-Request auf dem GitHub, wenn es bereits im Upstream angekommen war
   
   
Den Kommentar des letzten, noch nicht "gepushten" Commit korrigieren:  
Den Kommentar des letzten, noch nicht "gepushten" Commit korrigieren:  
Zeile 193: Zeile 183:
   
   
Wenn du z.B. den Branch ''1234-new-feature'' von Entwickler ''heinz'' testen möchtest, kannst du ihn in einen Testbranch bei dir herunterladen. Zunächst musst du ''heinz''' Fork einmalig als weitere Upstream definieren:
Wenn du z.B. den Branch ''1234-new-feature'' von Entwickler ''heinz'' testen möchtest, kannst du ihn in einen Testbranch bei dir herunterladen. Zunächst musst du ''heinz''' Fork einmalig als weitere Upstream definieren:
  git remote add heinz http://github.com/heinz/oc-server3
  git remote add heinz git@github.com:heinz/oc-server3
Dann legst du bei dir einen Testbranch an, am besten auf Basis aktuellster Daten ...
Dann legst du bei dir einen Testbranch an, am besten auf Basis aktuellster Daten ...
  git checkout development
  git checkout development
Zeile 223: Zeile 213:
== Noch ein paar Gimmicks ==
== Noch ein paar Gimmicks ==


* <code>git branch -m 1234-neuestes-Feature</code> Benennt den derzeit aktiven Branch um in "1234-neuestes-Feature".
* <code>git diff Branchname</code> zeigt alle Unterschiede zwischen dem aktuellen Branch und einem anderen an.
* <code>git diff Branchname</code> zeigt alle Unterschiede zwischen dem aktuellen Branch und einem anderen an.
* <code>git cherry-pick Commit-ID</code> übernimmt einen bestimmten Commit (von wo auch immer) in den aktiven Branch.
* <code>git cherry-pick Commit-ID</code> übernimmt einen bestimmten Commit (von wo auch immer) in den aktiven Branch.
179

Bearbeitungen