Commit 9cea89fe authored by Lukas Nagel's avatar Lukas Nagel
Browse files

write branching section

parent 473bfb55
Pipeline #142352 passed with stages
in 12 minutes and 16 seconds
......@@ -363,7 +363,43 @@ und optional in das Arbeitsverzeichnis übernommen werden.
Somit lässt sich die nächste Version inkrementell erstellen
und muss nicht dem Zustand des Arbeitsverzeichnisses entsprechen.
## TODO: Branching und Tags
Verzweigungen in Versionsgraph sind in Git sehr performant Umgesetzt.
Eine neuer Zweig erfordert lediglich das anlegen einer neuen Referenz,
also eine einfache Textdatei, in 'refs/heads'.
Diese Referenz enthält zunächst den Commit Hash des Verzweigungunspunktes.
Um zu diesem Zweig zu wechseln muss nun das Arbeitsverzeichnis so angepasst
werden, dass es dem Inhalt des Tree Objekts auf das der Commit Zeigt entspricht.
Anschließend wird der HEAD auf den Zweig gesetzt.
Die Nächsten Commit Operation werden den neuen Zweig bewegen.
Das Zusammenführen von Anderen zweigen in den Aktuellen ist mit der Merge
Operation möglich.
Liegt der Commit auf den der aktuellen Zweig zeigt auf dem Pfad vom
zusammenzuführenden Zweig, so wurden auf dem aktuellen Zweig nach dem
Verzweigen keine Commits mehr vorgenommen.
In dieser Situation ist ein Vorspulen (*Fast-Forward-Merge*) möglich,
dabei wird der Aktuell Zeiger auf die Spitze des anderen Zweiges vor gespult.
Danach ist im Versionsgraphen keine Verzweigungsstruktur erkennbar,
da kein Merge-Commit angelegt wurde.
Sind auf beiden Zweigen Commits eingepflegt worden, so ist ein Merge-Commit
nötig.
Dieser erhält als Vorgänger beide Commits der Zweige und das Tree Objekt zeigt
auf einen Schnappschuss in dem Änderungen beider Zweige enthalten sind.
Wurden sich überschneidende Stellen verändert, so kann Git nicht automatisch
entscheiden wie die Änderungen vereinigt werden sollen.
Daher muss dieser Konflikt manuell aufgelöst werden,
dazu können die Betroffenen Stellen in einem Textbearbeitungsprogramm
oder mit Grafische Werkzeuge, wie es zum Beispiel GitHub bereitstellt,
gelöst werden.
Das effiziente Verzweigen erlaubt Arbeitsabläufe mit vielen Zweigen.
So kann etwa pro Funktionalität ein eigener Zweig verwendet
und nach fertigstellung in den Hauptzweig übernommen werden.
Dies bietet den Vorteil, dass die Entwicklung nebenläufig stattfinden kann,
sich Änderungen für Funktionalität somit nicht gegenseitig beeinflussen,
wenn sie in einem eigen Kontext entwickelt werden.
Der Wechsel zwischen Kontexten erfordert nur das Anpassen der Veränderten
Dateien im Arbeitsverzeichnis.
## TODO: Verteiltes Git
......@@ -379,6 +415,7 @@ und muss nicht dem Zustand des Arbeitsverzeichnisses entsprechen.
* Unterschiedliche Ausführungskontexte => Docker
* Versionierung von Abhängigkeiten => Gradle etc
* Spoofing wegen fehlender Notwendigkeit von Signaturen möglich
* Integration Hell und CI
* Konvolut gleichender Befehlssatz
- Nicht Anfänger freundlich
......@@ -387,17 +424,17 @@ und muss nicht dem Zustand des Arbeitsverzeichnisses entsprechen.
## Installation
Die Paket verwaltung so gut wie jeder Linux Distribution sowie die der
gängingen BSDs bieten Git unter namen wie `git` oder `gitcore` an.
Die Paket Verwaltung so gut wie jeder Linux Distribution sowie die der
gängigen BSDs bieten Git unter Namen wie `git` oder `gitcore` an.
Sollte zwecks spezieller Bedürfnisse oder höherer Flexibiltät von Nöten sein,
so kann Git auch manuell Kompiliert werden.
Sollte es zwecks spezieller Bedürfnisse oder höherer Flexibilität von Nöten
sein, kann Git auch manuell Kompiliert werden.
Dazu muss der Quellcode[^3] Heruntergeladen und entpackt werden.
Dann kann es mit `make` und `make install` komprimiert beziehungsweise
Dann kann es mit `make` und `make install` kompiliert beziehungsweise
Installiert werden.
Eine Detailierte Anelitung und Notwendige Abhängigkeiten finden sich auf der
Eine Detaillierte Anleitung und Notwendige Abhängigkeiten finden sich auf der
Projektseite[^4].
Nach der Installation sollte mittles `git config --globla user.name <Name>`
Nach der Installation sollte mittels `git config --globla user.name <Name>`
und `git config --globla user.email <E-Mail>` noch Name sowie E-Mail hinterlegt
werden, da sonst kein Commit möglich ist
......@@ -410,19 +447,19 @@ werden, da sonst kein Commit möglich ist
Repositories können ohne einen Account zu erstellen per HTTPs von
GitHub geklont werden.
Um Änderungen hochzuladen oder eine Projekt anzulegen ist ein Konto auf der
Platform Notwendig[^5].
Nutzt man nun Befehele wie push, erfordert dies jedes mal die Eingabe des
Nutzernames und des Pasworts,
Plattform Notwendig[^5].
Nutzt man nun Befehle wie `push`, erfordert dies jedes mal die Eingabe des
Nutzernamens und des Passworts,
dies kann mit dem Anmeldesystem vereinfacht werden [@chacon2014].
Eine weitere Lösung, die statt eines Passwortes auf auf
asymetrische Kryptographie setzt, ist die verwendung des SSH Protokolles.
asymmetrische Kryptographie setzt, ist die Verwendung des SSH Protokolles.
Hierzu wird mittels `ssh-keygen` das Schlüsselpaar `id_rsa` und `id_rsa.pub`
erstellt und in `~/.ssh/` abgelegt.
Natürlich sind auch nicht Standartnamen und Verzeichnisse möglich,
um zum Beispiel Projekteigene Schlüssel zu erzeugen.
Der Öffenliche Schlüssel kann dann bei GitHub hinterlegt werden
Natürlich sind auch nichtstandart Namen und Verzeichnisse möglich,
um zum Beispiel Projekt eigene Schlüssel zu erzeugen.
Der Öffentliche Schlüssel kann dann bei GitHub hinterlegt werden
und der Remote so konfiguriert werden,
dass SSH und der Private Schlüssel verwenbdent werden[^6].
dass SSH und der Private Schlüssel verwendet werden[^6].
[^5]: https://docs.github.com/en/get-started/signing-up-for-github/signing-up-for-a-new-github-account
[^6]: https://docs.github.com/en/authentication/connecting-to-github-with-ssh
......@@ -449,7 +486,7 @@ dass SSH und der Private Schlüssel verwenbdent werden[^6].
`git commit [-m <Beschreibung>]`
: Erzeugt einen neuen commit, wobei der aktuelle Commit Vorgänger wird.
Die Spitze des aktuellen Zweiges zeigt dannach auf den neuen Commit.
Die Spitze des aktuellen Zweiges zeigt danach auf den neuen Commit.
Wird die Beschreibung weggelassen, so öffnet sich ein Editor.
......@@ -458,7 +495,7 @@ dass SSH und der Private Schlüssel verwenbdent werden[^6].
Mit der Option `-c` wird der Zweig erstellt, mit `-d` gelöscht.
`git checkout <Referenz> [-- <Pfad>...]`
: Passt die Dateien im Arbeitsverzeichnis so and,
: Passt die Dateien im Arbeitsverzeichnis so an,
dass sie denen der Angegeben Referenz entsprechen.
Ohne Angabe von Pfaden wird auch die HEAD Referenz angepasst,
sodass dieser Befehl zum wechseln von Zweigen verwendet wird.
......@@ -470,7 +507,7 @@ dass SSH und der Private Schlüssel verwenbdent werden[^6].
`git push <Remote> [<src>[:<dst>]]`
: Merge den durch `src` angegeben Zweig mit dem durch `dest` angegeben
Zweig auf dem Remote.
Dies ist nur als Fast-Forwar-Merge möglich
Dies ist nur als Fast-Forward-Merge möglich
und alle fehlenden Objekte werden vorerst an den Remote geschickt.
Wird `dest` weggelassen so wird `src` angenommen
und ohne `src` wird der aktuelle Zweig angenommen.
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment