Entwickler-Ecke

Delphi Tutorials - Kurze Einführung in Versionsverwaltungen am Beispiel von Git


jaenicke - So 08.05.16 13:31
Titel: Kurze Einführung in Versionsverwaltungen am Beispiel von Git
Hallo,

nach dem Tutorial über SVN [http://www.entwickler-ecke.de/viewtopic.php?p=683811] möchte ich nun auch zeigen wie man ganz einfach mit Git lokal und mit einem Server arbeitet.

Benötigt werden:

In diesem Tutorial zeige ich:
  1. Wie man ein lokales Repository auf einem externen Datenträger anlegt [http://www.entwickler-ecke.de/viewtopic.php?p=700256#700256]
  2. Wie man dieses Repository lokal auscheckt [http://www.entwickler-ecke.de/viewtopic.php?p=700257#700257]
  3. Wie man Dateien hinzufügt [http://www.entwickler-ecke.de/viewtopic.php?p=700258#700258]
  4. Wie man die hinzugefügten Dateien in das Sicherungsrepository sendet [http://www.entwickler-ecke.de/viewtopic.php?p=700259#700259]
  5. Wie man die Versionshistorie einsieht [http://www.entwickler-ecke.de/viewtopic.php?p=700260#700260]
  6. Wie man Dateien aus dem Repository wiederherstellt [http://www.entwickler-ecke.de/viewtopic.php?p=700261#700261]
  7. Und am Ende zeige ich auch noch wie man einen echten Server (in diesem Beispiel Bonobo Git Server) einrichtet und verwendet [http://www.entwickler-ecke.de/viewtopic.php?p=700262#700262]

Eine der Besonderheiten von Git im Vergleich zu herkömmlichen VCS wie CVS oder SVN ist, dass man auch einen anderen Ordner als Repository nutzen kann. Man braucht also nicht unbedingt einen eigenen Server.
Deshalb beginne ich das Tutorial mit einem Repository auf einem USB Stick und dem Zugriff darauf, der echte Server, der im SVN Tutorial noch ein zentraler Punkt war, folgt am Ende.

Der Übersicht halber folgen die einzelnen Themen in eigenen Posts.


jaenicke - So 08.05.16 13:31

1. Wie man ein lokales Repository auf einem externen Datenträger anlegt

Als erstes müsst ihr TortoiseGit installieren. Den Download findet ihr unter:
https://tortoisegit.org/download/
Solltet ihr noch XP einsetzen, müsst ihr eine ältere Version benutzen (findet ihr auch dort), die aktuelle Version unterstützt dies nicht mehr.
Bei der ersten Benutzung kommt ggf. die Aufforderung Git zu installieren, falls es noch nicht installiert ist.

Nach der Installation habt ihr neue Einträge im Kontextmenü des Windows Explorers. Nun legt ihr euch einen Ordner auf dem Datenträger an, der als Sicherung dienen soll. Dieser sollte mit .git enden (per Konvention). Ich benutze im Beispiel einen USB Stick, der den Nebeneffekt habt, dass ihr den auch zum Beispiel an euer Laptop stecken könnt und ganz ohne Server die Quelltexte auch damit synchronisieren könnt.

In dem Zielordner klickt ihr mit rechts und wählt "Git create repository here...":
CreateRepoExt01

Hier setzt ihr das Häkchen für ein reines Repository:
CreateRepoExt02
Ihr könnt auch direkt in dem Ordner arbeiten, in dem das Repository liegt, dann müsstet ihr das Häkchen nicht setzen. Darauf werde ich hier aber nicht näher eingehen.

Das war es auch schon:
CreateRepoExt03

Im nächsten Schritt müsst ihr nun auf dieses Repository zugreifen.


jaenicke - So 08.05.16 13:32

2. Wie man dieses Repository lokal auscheckt

Um nun ein lokales Arbeitsverzeichnis zu haben, könnt ihr den Inhalt des Repositories (im Moment also nichts), in ein lokales Verzeichnis auschecken.

Wenn ihr ein bestehendes Projekt habt und dieses in einem bestimmten Ordner lassen wollt, könnt ihr diesen vorher umbenennen, einen neuen Ordner mit dem Namen anlegen und nach dem Auschecken die Dateien vor Schritt 3 wieder zurück in den neuen Ordner schieben.

Nun klickt ihr in das gewünschte Verzeichnis mit rechts und wählt im Kontextmenü "Git clone...":
CheckoutRepoExt01

In dem dann aufgehenden Dialog tragt ihr als Repository das Verzeichnis ein, in dem ihr in Schritt 1 das Repository angelegt habt, im unteren den Zielordner. Standardmäßig wird ein Unterordner mit dem Namen des Repositories angefügt, das müsst ihr aber nicht so lassen:
CheckoutRepoExt02

Nun habt ihr einen lokalen Ordner, in dem ihr arbeiten könnt:
CheckoutRepoExt03
Den Ordner .git seht ihr nur, wenn ihr versteckte Dateien anzeigen eingeschaltet habt.

Im nächsten Schritt fügen wir nun Dateien in das Repository hinzu und senden diese in die Sicherung.


jaenicke - So 08.05.16 13:32

3. Wie man Dateien hinzufügt

Legt die Dateien, die ihr hinzufügen wollt (also zum Beispiel ein bestehendes Projekt) in dem Ordner ab, in den ihr in Schritt 2 ausgecheckt habt.

Dann klickt ihr mit rechts auf den Ordner und wählt im Untermenü "TortoiseGit" den Eintrag "Add...":
AddFiles01

Im angezeigten Dialog wählt ihr die Dateien, die ihr sichern und versionieren wollt:
AddFiles02

Dann bekommt ihr eine entsprechende Bestätigung:
AddFiles03

Nun weiß Git, dass ihr diese Dateien hinzufügen möchtet. Nun muss dieser Inhalt noch an das Repository auf dem Sicherungsdatenträger geschickt werden. Das machen wir im nächsten Schritt.


jaenicke - So 08.05.16 13:33

4. Wie man die hinzugefügten Dateien in das Sicherungsrepository sendet

Aktuell habt ihr Git nun lediglich mitgeteilt, welche Dateien in das Repository hineingehören. Nun müsst ihr diese Änderung noch abschicken.
Dafür geht ihr im Kontextmenü des Ordners auf "Git commit --> "master"...". Daraufhin wird die Meldung bekommen, dass ihr Name und E-Mail-Adresse angeben sollt. Das könnt ihr nach einem Klick auf Yes auch direkt machen:
Commit01

Danach könnt ihr dann im Commit-Dialog sehen welche Änderungen ihr habt (in diesem Fall "Dateien hinzugefügt"), könnt diese noch einmal prüfen (Vergleichsansicht per Doppelklick auf die einzelnen Dateien) und einen Kommentar eintragen was ihr in dieser Version gemacht habt. Danach bekommt ihr eine entsprechende Bestätigung.
Commit02

Nun müsst ihr noch über den Eintrag "Git sync..." im Kontextmenü die Änderungen tatsächlich übertragen. Nach einem Klick auf Push bekommt ihr eine entsprechende Bestätigung:
Commit03

Im nächsten Schritt sehen wir wie ihr eure Änderungen als Liste einsehen könnt.


jaenicke - So 08.05.16 13:33

5. Wie man die Versionshistorie einsieht

Ihr könnt nun im Kontextmenü auf TortoiseGit --> "Show log" klicken:
SeeLog01

Dann werden euch die Änderungen angezeigt, die ihr bisher gemacht habt:
SeeLog02

Die Markierung master ist eure lokale eingecheckte Version, origin/master zeigt an auf welchem Stand eure Sicherung bzw. das entfernte Repository ist.


jaenicke - So 08.05.16 13:33

6. Wie man Dateien aus dem Repository wiederherstellt

Nun nehmen wir einmal an euer Formular ist nicht mehr lesbar. Ihr möchtet es also wieder auf den letzten eingecheckten Stand zurücksetzen. Dafür gibt es den Befehl "Revert..." im Kontextmenü unter TortoiseGit. Ihr bekommt dort alle geänderten Dateien angezeigt:
Revert01

Mit einem Doppelklick bekommt ihr auch die Änderungen angezeigt (das Standard-Vergleichsprogramm ist etwas unübersichtlicher als das hier gezeigte):
Revert02

Nun könnt ihr die zurückzusetzenden Dateien auswählen und bekommt dann nach der Bestätigung die entsprechende Meldung, dass dies passiert ist:
Revert03

Nun ist die Datei wieder auf dem funktionierenden Stand vor euren lokalen Änderungen. Vor dem committen sollten ihr natürlich immer sicherstellen, dass ihr auch eine korrekte Version eincheckt, d.h. normalerweise geht man jede Änderung noch einmal manuell durch bevor man diese abschickt.


jaenicke - So 08.05.16 13:35

7. Wie man einen echten Server einrichtet und verwendet

Dafür braucht ihr als erstes den Bonobo Git Server [https://bonobogitserver.com/].

Wenn ihr diesen installiert habt, könnt ihr diesen im Browser aufrufen unter:

Quelltext
1:
http://<IP des Servers>/Bonobo.Git.Server                    


Mehr dazu folgt später...


jaenicke - So 08.05.16 14:18

<Platzhalter>


Christian S. - Mo 09.05.16 10:06

Hallo,

ich habe die Diskussion zu alternativen Git-Clients hierhin [http://www.entwickler-ecke.de/viewtopic.php?t=115464&start=0&postorder=asc] abgeteilt. Jaenicke ist Autor dieses Tutorials und bestimmt daher seinen Inhalt.

Grüße
Christian


delbor - Mo 09.05.16 16:15

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:

Als erstes müsst ihr TortoiseGit installieren. Den Download findet ihr unter:
https://tortoisegit.org/download/

Das verstehe ich nun so, das Git selbst gar nicht installiert werden muss(?) - was ich auf Grund eines deutschsprachigen [https://www.phpbb.de/kb/git_installieren] Tutorials allerdings getan habe. Das heisst für mich: die jetzige installation wieder rausschmeissen und nach diesem Tutorial wieder neu installieren.

Zitat:
Nun legt ihr euch einen Ordner auf dem Datenträger an, der als Sicherung dienen soll. Dieser sollte mit .git enden (per Konvention).

Solch einen Ordner hab ich, allerdings mit GitGui angelegt. Der Endet allerdings nicht auf'.git', sondern enthält, seit ich den zum Repository gemacht habe, einen UnterOrdner diesen Namens.

Zitat:
In dem Zielordner klickt ihr mit rechts und wählt "Git create repository here...":
[Bild: CreateRepoExt01]

Hier setzt ihr das Häkchen für ein reines Repository:
[Bild: CreateRepoExt02]
Ihr könnt auch direkt in dem Ordner arbeiten, in dem das Repository liegt, dann müsstet ihr das Häkchen nicht setzen. Darauf werde ich hier aber nicht näher eingehen.


Mit der Git-GUI hab ich auch das Entwicklerverzeichnis(DelphiVCLCornerXE8) zu einem Repository gemacht. Da liegen alle Projekte, die ich in XE8 begonnen oder mit früheren Delphi-Versionen erstellt habe und mit XE8 weiterentwickle. Das ist aber offensichtlich falsch.
Wie ich das bis jetzt verstanden habe, müsste jedes einzelne Projektverzeichnis ein Repository sein.

Gruss
Delbor


Nersgatt - Mo 09.05.16 16:23

Ja, Du solltest Dir für jedes logisch zusammenhängende Projekt ein Repository erstellen. Das kann auch eine Projektgruppe sein, muss aber nicht so sein.
Wenn Du alles in ein Repository packst (was natürlich möglich wäre), kannst Du hinterher die einzelnen Änderungen und Versionen schlecht nachvollziehen.
Einzeln hat man es leichter.


delbor - Mo 09.05.16 16:35

Hi Nersgatt

Danke für deine prompte Antwort!

Gruss
Delbor


Martok - Mo 09.05.16 18:59

Diese einzelnen Repositories kannst du dann allerdings mittels Submodules einfach wieder "zusammenstöpseln". Damit kannst du zum Beispiel ein Projekt und benötigte Bibliotheken zusammenfassen. Dabei zeigt ein Submodule immer auf eine bestimmte Revision des anderen Repositories, so dass man auch gleich eine bestimmte Version anfordern kann, ohne dass es alle anderen Projekte auch betrifft (im Gegensatz zu gemeinsam genutzer Unit im globalen Suchpfad zum Beispiel).

Hier hat Git ein gegensätzliches Modell zu SVN: in SVN kann man Unterverzeichnisse eines großen Repositories (Beispiel: Es gibt ein Repo "Spielprojekt", darin Ordner für Gameengine, Client, Server, Karteneditor,...) einzeln auschecken, in Git baut man eher das große Ganze aus unteilbaren Einzelteilen zusammen.
Man kann am Ende durchaus auch ein Repo haben, das selbst gar nichts enthält, nur Verweise auf Submodule.


jaenicke - Mo 09.05.16 20:20

user profile icondelbor hat folgendes geschrieben Zum zitierten Posting springen:
Das verstehe ich nun so, das Git selbst gar nicht installiert werden muss(?)
Doch, das hatte ich vergessen. Es kommt die Aufforderung, wenn es noch nicht installiert ist. Ich habe das ergänzt.

user profile icondelbor hat folgendes geschrieben Zum zitierten Posting springen:
Zitat:
Nun legt ihr euch einen Ordner auf dem Datenträger an, der als Sicherung dienen soll. Dieser sollte mit .git enden (per Konvention).

Solch einen Ordner hab ich, allerdings mit GitGui angelegt. Der Endet allerdings nicht auf'.git', sondern enthält, seit ich den zum Repository gemacht habe, einen UnterOrdner diesen Namens.
Man kann dies verschieden machen. Um ein reines "Server-Repository" zu haben, würde ich es mit dem Ordner machen, der auf .git endet. Es geht aber auch anders, das ist kein echtes Problem.

user profile icondelbor hat folgendes geschrieben Zum zitierten Posting springen:
Mit der Git-GUI hab ich auch das Entwicklerverzeichnis(DelphiVCLCornerXE8) zu einem Repository gemacht. Da liegen alle Projekte, die ich in XE8 begonnen oder mit früheren Delphi-Versionen erstellt habe und mit XE8 weiterentwickle. Das ist aber offensichtlich falsch.
Wie ich das bis jetzt verstanden habe, müsste jedes einzelne Projektverzeichnis ein Repository sein.
Muss nicht unbedingt. Es kommt finde ich sehr darauf an was in dem Repository liegt. Wenn es komplett getrennte Projekte sind, machen eigene Repositories mehr Sinn, da man dann eine bessere Übersicht zu einzelnen Projekten hat.

Im Büro haben wir in einem Repository zum Beispiel mehrere Projekte zusammengefasst, die zu unserer Kassensoftware gehören, weil diese einfach viele Units gemeinsam verwenden.


delbor - Mo 09.05.16 20:35

Hi zusammen

Auch herzlichen Dank n an Martock und jaenicke für ihre aufschlussreichen Antworten!

Gruss
Delbor


oldprofiprog - Fr 13.05.16 10:56

Bin dabei von SVN auf Git zu wechseln.
Habe mich an diese Anleitung gehalten.
(Vielen Dank für die Mühe!)
Scheidere im Moment jedoch an einer Kleinigkeit.
Im Kontextmenü des Explorers fehlt der Menüpunkt Commit -> Master.
In den Settings ist dieser Schalter ausgewählt.

Was habe ich falsch gemacht?
Git-2.8.2-64-bit
TortoiseGit-2.1.0.0-64bit

Mit Gruß Peter


jaenicke - Fr 13.05.16 12:03

Aber Git Sync ist da im Kontextmenü?


oldprofiprog - Fr 13.05.16 12:44

Jetzt ja.
In einem Tutorial wurde geraten, bei der Installation von Git den Haken "Kontextmenü Explorer" wegzunehmen.
Jetzt ist mit der rechten Maustaste ein Menüeintrag Git vorhanden, der alle Untermenüs enthält.
Commit direkt als Menüpunkt scheint es nicht mehr zu geben. Über Sync und über "Prüfe auf Änderungen" kann ein Commit erfolgen.
Schade jetzt fehlt allerdings der Menüpunkt Git im alternativen Explorer ganz. (Speedcommander)


jaenicke - Fr 13.05.16 13:25

Hmm, bei dir sind die Befehle auf deutsch drin? Vielleicht ist das der Unterschied... ich benutze grundsätzlich nur die englische Variante.

Im Speedcommander sind die Befehle bei mir auch alle drin.


oldprofiprog - Fr 13.05.16 23:12

Die Ursache für meine Irretation liegt daran, dass sich die Menüstruktur in der 32 bit und 64 bit Variante unterscheiden.
In 32 bit ist Commit->Master vorhanden. In der 64 bit Version überprüfe auf Änderungen.
Ich habe das deutsche Sprachmodul geladen und kann in den Settings deutsch/englisch umschalten.


justus - Mo 08.08.16 14:28

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
7. Wie man einen echten Server einrichtet und verwendet

Dafür braucht ihr als erstes den Bonobo Git Server [https://bonobogitserver.com/].

Wenn ihr diesen installiert habt, könnt ihr diesen im Browser aufrufen unter:

Quelltext
1:
http://<IP des Servers>/Bonobo.Git.Server                    


Mehr dazu folgt später...


Hallo jaenicke,

vielen Dank für die ausführliche Anleitung. Da ich auch erst vor kurzem von SVN auf GIT umgestiegen bin, hat mir die Anleitung sehr geholfen. Ich bin schon sehr gespannt auf das letzte Kapitel mit dem "Bonobo Git Server".

Lg,
jus


justus - Do 01.09.16 20:25

Hallo,

für die ungeduldigen Leute wie mich, die den Bonobo Git Server unter Windows 7 Pro 64bit vorher schon installieren möchten, gibt es direkt auf der Bonobo Git Server Homepage eine bebilderte Anleitung "Install" [https://bonobogitserver.com/install/]. Zusätzlich gab es aber für mich 2 Fallstricken bis der Bonobo Git Server unter IIS lief. Und zwar mußte ich noch folgende 2 Befehle in der Windows Eingabeaufforderung eintippen, damit es lief. Wichtig ist natürlich, dass die Eingabeaufforderung als Administrator gestartet werden sollte.


Quelltext
1:
%windir%\system32\inetsrv\appcmd unlock config -section:system.webServer/handlers                    

(Quelle: Bonobo Git Server Configruation: HTTP Error 500.19 - Internal Server Error at line 71)
[http://stackoverflow.com/questions/30811308/bonobo-git-server-configruation-http-error-500-19-internal-server-error-at-li]

Quelltext
1:
%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -ir                    

(Quelle: Bonobo Git Server - HTTP Error 500.19 - Code: 0x80070021)
[http://stackoverflow.com/questions/26633346/bonobo-git-server-http-error-500-19-code-0x80070021]

Lg,
jus