
= Umgang mit Git am lokalen PC
:author: Thomas Niesenhaus <thomas.niesenhaus@zsl-rska.de>
:author: Patrick Gerth <patrick.gerth@zsl-rss.de>
include::kapitel-settings.adoc[]


== Clienten

Zum Zeitpunkt des Erstellens dieser Materialien bieten sich verschiedene Lösungen für Desktopanwendungen an. Beispiele wären hier:

* GitButler, welches unter https://gitbutler.com/[] erreichbar ist und open source eingesehen werden kann.

* GitHub Desktop ist unter https://desktop.github.com/download/[] verfügbar und ebenfalls open source.

* SmartGit ist ein kommerzielles Produkt aus dem Hause Syntevo. Die Projektseite findet sich unter https://www.syntevo.com/smartgit/[]

=== GitButler
Nach der Installation findet man sich im Startfenster von GitButler.

.Dialogfeld Neuanlegung
image::bilder/GitButler/GitButlerIntro.png[]

==== Repository eröffnen/ klonen
GitButler kann zum Zeitpunkt der Erstellung dieses Dokuments Repositories nur verwalten, nicht frisch anlegen. Daher wäre der Ablauf der, dass man zunächst ein Repository in der Webmaske erstellt und dieses dann via "Clone repository" auf den lokalen Rechner klont. GitButler tut sich erfahrungsgemäß schwer damit leere Repositories zu klonen. Um dies zu umgehen kann man eine leere Textdatei in der Online-Ansicht des Repositories anlegen.

.Dialogfeld Klonen
image::bilder/GitButler/GitButlerClone.png[]

Im Anschluss öffnet sich die Hauptansicht.

==== Hauptansicht

.Hauptansicht
image::bilder/GitButler/GitButlerMainView.png[]

Hier lassen sich verschiedene Branches anlegen, in welche die entsprechenden Dateien per drag-and-drop hineingezogen werden können:

.Branch-Ansicht
image::bilder/GitButler/GitButlerBranches.png[]

Für eine detaillierte Führung durch die Benutzung empfiehlt sich ein Blick in die Dokumentation unter https://docs.gitbutler.com/[]

==== Mergekonflikte
In seiner aktuellen Fassung (Stand 10.09.2024) verfügt Gitbutler nur über sehr eingeschränkte Möglichkeiten Mergekonflikte zu lösen. Statt dessen wird jedes mal lokal ein neuer Entwicklungsbranch (Virtualbranch) angelegt, welcher dann per Konsole oder Webanwendung wieder gemerged werden muss.

.Branch-Ansicht mit Virtual branch
image::bilder/GitButler/Neuer Commit.png[]

=== SmartGit

==== Repository eröffnen
Nach der Installation und dem Einstellen der Initialparameter findet sich die Einstellung zum Einbinden eines neuen Repositories oben links.

.Neues Repository anlegen oder abrufen
image::bilder/SmartGit/SmartGitNew.png[]

Durch Clicken der Option öffnet sich ein neues Dialogfeld:

.Dialogfeld Neuanlegung
image::bilder/SmartGit/SmartGitNew2.png[]

Wählen Sie hier einen Speicherort für das entsprechende Repository aus. Der Ordner sollte im Regelfall leer sein.

Durch das Auswählen von "Remote" in der Leiste am oberen Rand lässt sich eine Verknüpfung zu einem leeren Repository auf dem Git-Server anlegen

.Repository auf Server auswählen
image::bilder/SmartGit/SmartgitNew3.png[]

Nach der Authentifizierung sind nun die beiden Repositories verknüpft und lassen sich fortan vollumfänglich benutzen.

.Pull-Optionen bei vollständiger Verknüpfung
image::bilder/SmartGit/SmartgitNew4.png[]

==== Repository klonen
Möchten Sie ein bestehendes Repository auf Ihren lokalen Rechner übertragen sprechen wir ja bekanntlich vom Klonen. Über Repositoy -> Clone öffnet sich die Dialogmaske zum Eintragen des entsprechenden Links.

.Auswahl der Clone-Option
image::bilder/SmartGit/SmartgitRepoClone1.png[]

.Clone-Dialog
image::bilder/SmartGit/SmartgitRepoClone2.png[]

Da die beiden Optionen selbsterklärend sind wird nicht weiter darauf eingegangen. Die folgenden Dialoge fragen danach nach dem Speicherort und den Klonoptionen. Sobald dies ausgewählt wurde öffnet sich das Projekt im Betrachter.

==== Übersichten
Nachdem das entsprechende Repository erfolgreich in SmartGit eingebunden wurde bietet es sich an zwischen den entsprechenden Hauptansichten zu wählen.

.Hauptansichten
image::bilder/SmartGit/SmartgitViews.png[]

* Local Files dient dabei dazu, die Dateien direkt zu verwalten. Hier sieht man eine Übersicht der Dateien seit dem letzten Pull und kann entscheiden welche Dateien damit im nächsten Commit landen.
* History zeigt den Branchverlauf der letzten Commits und deren entsprechenden Branches. Durch Anklicken der entsprechenden Commits wird ein sog. Dif erstellt, welches die Veränderungen durch den entsprechenden Commit darstellt. Gelöschte Zeilen sind dabei rot, grüne wurden neu hinzugefügt.

In beiden Ansichten finden sich die Branching-Optionen oben in der Mitte:

.BranchingOptions
image::bilder/SmartGit/SmartGitBranchingOptions.png[]

Branches werden hier Feature genannt.

==== Mergen und Mergekonflikte

Um den Mergevorgang nachzustellen wurde folgendes Szenario erschaffen: Eine Datei wurde von zwei Rechnern gleichzeitig bearbeitet und hinterher zunächst von einem erfolgreich gepusht. Der zweite Rechner versucht nun seine Version ebenfalls zu pushen.

.Smartgit Mergekonflikt
image::bilder/SmartGit/Smartgit Abgelehnt.png[]

Daraufhin erstellt Smartgit eine Auflistung der Mergekonflikte.

.Smartgit Merging Teil 1
image::bilder/SmartGit/Smartgit Merge 1.png[]

Außerdem werden verschiedene Buttons angeboten um den Konflikt zügig zu lösen.

.Smartgit Merging Teil 2
image::bilder/SmartGit/Smartgit Merge 2.png[]

Durch Klicken auf die Datei öffnet sich ein detailliertes Fenster um in dieser jeweils zeilenweise zu entscheiden welcher Teil übernommen werden soll.

.Smartgit Merging Teil 3
image::bilder/SmartGit/Smartgit Merge 3.png[]

Die Entscheidung wird durch das Klicken auf die kleinen Pfeile getätigt.,

.Smartgit Merging Teil 4
image::bilder/SmartGit/Smartgit Merge 4.png[]

Ist der Konflikt entschieden wird die ignorierte / herausgelöschte Seite rot dargestellt.

.Smartgit Merging Teil 5
image::bilder/SmartGit/Smartgit Merge 5.png[]

Sind mehrere Konflikte vorhanden kann über diese beiden Pfeile zwischen diesen gewechselt werden.

.Smartgit Merging Teil 6
image::bilder/SmartGit/Smartgit Merge 6.png[]

Ist die Konfliktentscheidung abgeschlossen muss die entsprechende Datei als resolved markiert werden.

.Smartgit Merging Teil 7
image::bilder/SmartGit/Smartgit Merge 7.png[]

Der gelöste Mergekonflikt wird hinterher in der History durch die Vereinigung der jeweiligen Branches visualisiert.

.Smartgit Merging Teil 8
image::bilder/SmartGit/Smartgit Merge 8.png[]

Entwickelt man ohne entsprechende Mergekonflikte werden Branches über Pull-Requests auf der Website vereinigt.


== Git-Konsole

=== Anlegen eines Repositories
Um ein neues Git-Repository mit der Git-Konsole anzulegen, befolgen Sie bitte diese Schritte:

==== Konsole starten

Starten Sie Ihre bevorzugte Git-Konsole. Dies könnte die Befehlszeile (Command Line) oder eine integrierte Konsole
in Ihrer Entwicklungsumgebung sein, wie zum Beispiel Git Bash.

==== Navigation

Verwende den Befehl `cd` (Change Directory), um zum gewünschten Speicherort zu navigieren, an dem Sie das neue
Repository erstellen möchten.

==== Initialisierung

Verwenden Sie den Befehl `git init`, um ein neues Git-Repository im aktuellen Verzeichnis zu initialisieren.
Dieser Befehl legt ein neues leeres Repository an.

==== Verzeichnis prüfen

Bestätigen Sie, dass das neue Git-Repository erfolgreich initialisiert wurde, indem Sie den Befehl `ls -a` (List All)
verwenden, um den Inhalt des aktuellen Verzeichnisses anzuzeigen.
Sie sollten ein verstecktes `.git`-Verzeichnis sehen, das das Repository enthält.

=== Clonen eines Repositories
Wenn Sie ein vorhandenes Git-Repository auf Ihrem lokalen System klonen möchten, können Sie dies mit der Git-Konsole tun. Hier sind die Schritte dazu:

==== Konsole starten
Öffnen Sie die Git-Konsole Ihrer Wahl. Sie können die Befehlszeile (Command Line)
verwenden oder eine integrierte Konsole in Ihrer Entwicklungsumgebung wie Git Bash oder das integrierte Terminal.

==== Navigation
Verwenden Sie den Befehl `cd` (Change Directory), um zum Verzeichnis zu navigieren,
in dem Sie das geklonte Repository speichern möchten.

==== Klonvorgang anstoßen
Verwenden Sie den Befehl `git clone` gefolgt von der URL des Repositorys, das Sie klonen möchten. Zum Beispiel:
[source,shell]
----
git clone https://fortbildner.gitcamp-bw.de/ts-zsl-rska/GIT-Fortbildung.git
----

Hier werden Sie nach Ihren Login-Daten gefragt, welche Sie eingeben müssen, um Zugang zu den Dateien zu erlangen.

==== Erfolg prüfen
Sobald der Klonvorgang abgeschlossen ist, können Sie mit `ls` den Inhalt des aktuellen Verzeichnisses überprüfen. Sie sollten das geklonte Repository als neues Verzeichnis sehen.

=== Stage / Commit
Wenn Sie Änderungen an Ihrem Git-Projekt vorgenommen haben und diese für einen Commit vorbereiten möchten, können Sie dies einfach über die Git-Konsole tun. Hier sind die Schritte dazu:

==== Überprüfen der Änderungen
Verwenden Sie den Befehl `git status`, um den aktuellen Status Ihres Repositorys zu überprüfen. Dadurch erhalten Sie eine Liste der geänderten, ungestageten Dateien.

==== Stagen der Änderungen
Verwenden Sie den Befehl `git add`, um die gewünschten Änderungen zur Staging-Area hinzuzufügen. Sie können einzelne Dateien oder Verzeichnisse hinzufügen, indem Sie ihren Pfad angeben, oder alle Änderungen auf einmal mit einem Punkt (`.`) für alle Dateien im aktuellen Verzeichnis.

Beispiel für das Stagen einer einzelnen Datei:
[source,shell]
----
git add Dateiname
----

Beispiel für das Stagen aller Änderungen im aktuellen Verzeichnis:
[source,shell]
----
git add .
----

==== Überprüfen der gestagten Änderungen

Verwenden Sie erneut den Befehl `git status`, um sicherzustellen, dass die gewünschten Änderungen erfolgreich zur Staging-Area hinzugefügt wurden. Sie sollten eine Liste der gestagten Änderungen sehen.

==== Commiten der Änderungen

Verwenden Sie den Befehl `git commit`, um die gestagten Änderungen zu committen. Geben Sie eine aussagekräftige Commit-Nachricht ein, um die durchgeführten Änderungen zu beschreiben.

[source,shell]
----
git commit -m "Hier ist Ihre Commit-Nachricht"
----

==== Überprüfen des Commit-Erfolgs

Nachdem Sie die Änderungen committet haben, können Sie mit `git log` den Commit-Verlauf anzeigen und sicherstellen, dass Ihr Commit erfolgreich war.


=== Check out

Wenn Sie an einem bestimmten Branch oder einem früheren Commit in Ihrem Git-Repository arbeiten möchten, können Sie dies über die Git-Konsole tun. Hier sind die Schritte dazu:

==== Überprüfen des Repository-Status

Verwenden Sie den Befehl `git status`, um den aktuellen Status Ihres Repositorys zu überprüfen. Dadurch erhalten Sie Informationen darüber, ob Sie Änderungen haben, die committet oder gestaged werden müssen.

==== Aus-checken des Gewünschten Branchs oder Commits

Verwenden Sie den Befehl `git checkout`, um zum gewünschten Branch oder Commit zu wechseln. Geben Sie den Namen des Branchs oder die Commit-ID an, zu der Sie wechseln möchten.

Beispiel für das Auschecken eines Branchs:
[source,shell]
----
git checkout Branch-Name
----

Beispiel für das Auschecken eines früheren Commits:
[source,shell]
----
git checkout Commit-ID
----

==== Überprüfen des Wechsel-Erfolgs

Nachdem Sie zum gewünschten Branch oder Commit gewechselt haben, verwenden Sie `git status`, um sicherzustellen, dass der Wechsel erfolgreich war und Ihr Arbeitsverzeichnis auf dem neuen Stand ist.

=== Push
enn Sie Ihre lokalen Änderungen an ein entferntes Git-Repository hochladen möchten, können Sie dies über die Git-Konsole tun. Hier sind die Schritte dazu:

==== Überprüfen des Repository-Status

Verwenden Sie den Befehl `git status`, um den aktuellen Status Ihres Repositorys zu überprüfen. Dadurch erhalten Sie Informationen darüber, ob Sie Änderungen haben, die committet oder gestaged werden müssen.

==== Pushen der Änderungen

Verwenden Sie den Befehl `git push`, um Ihre lokalen Änderungen auf das entfernte Repository hochzuladen. Geben Sie den Namen des entfernten Repositories und den Namen des Branchs an, auf den Sie pushen möchten.

Beispiel für das Pushen auf den Hauptbranch (üblicherweise "master" oder "main"):
[source,shell]
----
git push origin master
----

==== Authentifizierung (falls erforderlich)

Je nach Konfiguration des entfernten Repositories kann es sein, dass Sie sich authentifizieren müssen, um den Push-Vorgang abzuschließen. Geben Sie Ihre Anmeldeinformationen ein, wenn Sie dazu aufgefordert werden.

==== Überprüfen des Push-Erfolgs

Nachdem der Push-Vorgang abgeschlossen ist, können Sie die Repository-Website besuchen oder den Befehl `git log` verwenden, um sicherzustellen, dass Ihre Änderungen erfolgreich auf das entfernte Repository hochgeladen wurden.


=== Pull

Wenn Sie die neuesten Änderungen aus einem entfernten Git-Repository auf Ihr lokales Repository herunterladen möchten, können Sie dies über die Git-Konsole tun. Hier sind die Schritte dazu:

==== Pullen der neuesten Änderungen

Verwenden Sie den Befehl `git pull`, um die neuesten Änderungen aus dem entfernten Repository herunterzuladen und mit Ihrem lokalen Repository zu fusionieren. Geben Sie den Namen des entfernten Repositories und den Namen des Branchs an, den Sie pullen möchten.

Beispiel für das Pullen aus dem Hauptbranch (üblicherweise "master" oder "main"):
[source,shell]
----
git pull origin master
----

==== Authentifizierung (falls erforderlich)

Je nach Konfiguration des entfernten Repositories kann es sein, dass Sie sich authentifizieren müssen, um den Pull-Vorgang abzuschließen. Geben Sie Ihre Anmeldeinformationen ein, wenn Sie dazu aufgefordert werden.

==== Überprüfen des Pull-Erfolgs

Nachdem der Pull-Vorgang abgeschlossen ist, verwenden Sie den Befehl `git log` oder andere Git-Befehle, um sicherzustellen, dass die neuesten Änderungen erfolgreich in Ihr lokales Repository gezogen wurden.

=== Merge / Rebase

Wenn Sie Änderungen aus einem anderen Branch in Ihren aktuellen Branch integrieren möchten, können Sie dies über die Git-Konsole tun. Hier sind die Schritte dazu:

==== Navigieren zum Ziel-Branch

Verwenden Sie den Befehl `git checkout`, um zum Branch zu wechseln, in den Sie die Änderungen integrieren möchten. Stellen Sie sicher, dass Sie in dem Branch sind, in den Sie die Änderungen mergen möchten.

Beispiel für das Wechseln zum Ziel-Branch:
[source,shell]
----
git checkout Ziel-Branch-Name
----

==== Mergen des Quell-Branchs

Verwenden Sie den Befehl `git merge`, um den Quell-Branch in den Ziel-Branch zu mergen. Geben Sie den Namen des Quell-Branchs an, den Sie mergen möchten.

Beispiel für das Mergen des Quell-Branchs:
[source,shell]
----
git merge Quell-Branch-Name
----

==== Bearbeiten von Merge-Konflikten (falls erforderlich)

Wenn es Merge-Konflikte gibt, die nicht automatisch gelöst werden können, müssen Sie diese manuell bearbeiten.
Öffnen Sie die betroffenen Dateien in einem Texteditor, beheben Sie die Konflikte und führen
Sie dann den Merge-Vorgang erneut aus.
Dieser Schritt wird durch moderne Entwicklungsumgebungen stark vereinfacht.

=== Branches
Branches dienen dazu einzelne Features bzw. Teilprojekte separat anzulegen ohne dabei die Integrität des Hauptprojektes
zu gefährden. In einer kollaborativen Entwicklungssituation sind sie unabdingbar.

==== anlegen

Sollten Sie einen bisherigen branch um einen neuen erweitern wollen, so sind folgende Schritte zu beachten:

===== Überprüfen des Repository-Status

Verwenden Sie den Befehl `git status`, um den aktuellen Status Ihres Repositorys zu überprüfen. Dadurch erhalten Sie Informationen darüber, ob Sie ungespeicherte Änderungen haben, die vor dem Branchen committet oder gestaged werden müssen.

===== Anlegen des Neuen Branchs

Verwenden Sie den Befehl `git branch`, um einen neuen Branch anzulegen. Geben Sie den Namen des neuen Branchs an, den Sie erstellen möchten.

Beispiel für das Anlegen eines neuen Branchs:
[source,shell]
----
git branch Neuer-Branch-Name
----

===== Wechseln zum Neuen Branch

Verwenden Sie den Befehl `git checkout`, um zum neu erstellten Branch zu wechseln und dort zu arbeiten.

Beispiel für das Wechseln zum neuen Branch:
[source,shell]
----
git checkout Neuer-Branch-Name
----

===== Überprüfen des Branch-Erfolgs

Nachdem Sie den neuen Branch erstellt haben, verwenden Sie den Befehl `git branch` erneut oder andere Git-Befehle, um sicherzustellen, dass der neue Branch erfolgreich erstellt wurde und Sie sich in ihm befinden.


==== mergen
Wenn Sie die Änderungen aus einem anderen Branch in Ihren aktuellen Branch integrieren möchten, können Sie dies über die Git-Konsole tun. Hier sind die Schritte dazu:

===== Überprüfen des Repository-Status

Verwenden Sie den Befehl `git status`, um den aktuellen Status Ihres Repositorys zu überprüfen. Dadurch erhalten Sie Informationen darüber, ob Sie ungespeicherte Änderungen haben, die vor dem Mergen committet oder gestaged werden müssen.

===== Wechseln zum Ziel-Branch

Verwenden Sie den Befehl `git checkout`, um zum Branch zu wechseln, in den Sie die Änderungen mergen möchten. Stellen Sie sicher, dass Sie sich im Ziel-Branch befinden, in den Sie die Änderungen integrieren möchten.

Beispiel für das Wechseln zum Ziel-Branch:
[source,shell]
----
git checkout Ziel-Branch-Name
----

===== Mergen des Quell-Branchs

Verwenden Sie den Befehl `git merge`, um den Quell-Branch in den Ziel-Branch zu mergen. Geben Sie den Namen des Quell-Branchs an, den Sie mergen möchten.

Beispiel für das Mergen des Quell-Branchs:
[source,shell]
----
git merge Quell-Branch-Name
----

===== Bearbeiten von Merge-Konflikten (falls erforderlich)

Wenn es Merge-Konflikte gibt, die nicht automatisch gelöst werden können, müssen Sie diese manuell bearbeiten.
Öffnen Sie die betroffenen Dateien in einem Texteditor oder Entwicklungsumgebung, beheben Sie die Konflikte und führen Sie dann den Merge-Vorgang erneut aus.

===== Überprüfen des Merge-Erfolgs

Nachdem der Merge-Vorgang abgeschlossen ist, verwenden Sie den Befehl `git status` oder andere Git-Befehle, um sicherzustellen, dass der Merge erfolgreich war und keine Konflikte mehr vorhanden sind.
