Versionskontrollsystem
es kann insbesondere bei folgenden Aufgaben behilflich sein:
Ein Commit in Git ist eine Momentaufnahme einer Codebase
Die Entwicklung einer Codebase im Laufe der Zeit wird durch eine Abfolge von Commits repräsentiert
Manchmal bezeichnet man mit dem Begriff Commit auch den Übergang / die Änderungen von einer Momentaufnahme zur nächsten
Einfacher Commit-Log mit einem Branch (main):
* add footer (main)
* add company logo
* add sidebar
* add placeholder content
* initialize website
Branches erlauben das gleichzeitige / parallele Arbeiten an mehreren Aufgaben
Der Standard-Branch heißt üblicherweise main oder master
In Git ist ein Branch ein Pointer zu einem bestimmten Commit
Commit-Log mit einem aktiven Feature-Branch:
* add sidebar (main)
| * correct typo in footer (footer)
| * add logo to footer
| * add footer with basic content
|/
* add placeholder content
* initialize website
Zusammenführen von Branches (via merge):
* merge branch 'footer' into main (main)
|\
| * correct typo in footer (footer)
| * add logo to footer
| * add footer with basic content
* | add sidebar
|/
* add placeholder content
* initialize website
Zusammenführen von Branches (via rebase und squash):
* add footer (main)
* add sidebar
* add placeholder content
* initialize website
Installation von https://git-scm.com
Empfehlungen:
select components: Windows Explorer integration deaktivieren (würde zusätzliche Befehle ins Rechtsklickmenü des Explorers hinzufügen)
default editor: wähle Nano als einfachen Konsolen-baiserten Texteditor
name of the initial branch: wähle "main"
line ending conversions: Checkout as-is, commit as-is - und Konfiguration der Entwicklungsumgebung auf LF
default behavior of git pull: only ever fast-forward
git config --global user.name "John Doe"
git config --global user.email johndoe@example.com
git config --global pull.ff true
git init
git clone
Initialisieren eines neuen Repositories in einem lokalen Ordner:
git init
Klonen eines öffentlichen Repositories (von GitHub):
git clone https://github.com/libgit2/libgit2
Erstellt einen neuen Ordner libgit2 mit dem aktuellen Code und der gesamten Versionsgeschichte
git status
git diff
git add
git restore
git commit
git status
Gibt Informationen zu dem aktuellen Zustand des Repositories aus
Status von Dateien anzeigen (hinzugefügt / verändert / gelöscht seit dem letzten Commit):
git status
Anzeigen von hinzugefügten / gelöschten Zeilen in Dateien:
git diff
Vorbereiten aller hinzugefügten / veränderten / gelöschten HTML-Dateien zum Committen (Staging von Dateien):
git add *.html
Vorbereiten aller Dateien:
git add .
"Unstaging" von Dateien:
git restore --staged readme.txt
Verwerfen von Änderungen:
git restore readme.txt
Erstellen eines Commits mit allen Änderungen inklusive Commit-Message:
git add .
git commit -m "changing some HTML files"
Kurzversion für das direkte Committen aller Änderungen:
git commit -a -m "changing some HTML files"
Auflisten von zu ignorierenden Dateien in einer Textdatei namens .gitignore (ohne Dateiendung):
__pycache__
node_modules
.vscode
git log
git show
git diff
git checkout
git revert
Auflisten bisheriger Commits:
git log
git log --oneline
git log --oneline --graph
git log --oneline --graph --all
Beispiel für Ausgabe zum zweiten Befehl:
* e84890f (HEAD -> main, origin/main, origin/HEAD) add footer
* 9eb2f53 add company logo
* 5c41c01 add sidebar
* f4f591c add placeholder content
* d6510c2 initialize website
Anzeigen der Änderungen zwischen Commit 19e0e64... und dessen Eltern-Commit:
git show 19e0
Anzeigen der Änderungen zwischen Commit 19e0e64... und der aktuellen Version:
git diff 19e0
kompakte Ausgabe:
git diff 19e0 --name-status
Zugreifen auf die Inhalte eines früheren Commits (mit id b4c906...):
git checkout b4c9
Zurück zum aktuellsten Commit des main-Branches:
git switch main
Rückgängig Machen des letzten Commits (mittels eines neuen Commits):
git revert HEAD
Workflow:
Um neue Features / Änderungen umzusetzen, erstellt man einen sogenannten Feature Branch
Der Feature Branch kann sich individuell parallel zum main Branch entwickeln
Entwickelt sich der main Branch weiter, können die Änderungen in den Feature Branch übernommen werden
Ist ein Feature komplett, können die Änderungen in den main Branch übernommen werden (nach begutachtung durch andere Entwickler)
Feature Branches können oft auf einen kleinen Rahmen beschränkt sein, z.B. fix-spelling-error-in-readme
manche Feature Branches müssen großen Umfang haben, z.B. port-to-typescript
Nachdem die Änderungen eines Feature Branches in den Haupt-Branch übernommen wurden, wird der Feature Branch üblicherweise gelöscht
Beispiel: Entwickler arbeiten an zwei unterschiedlichen Tasks gleichzeitig:
* add sidebar (sidebar)
| * add logo to footer (footer)
| * add footer with basic content
|/
* add placeholder content (main)
* initialize website
nach Vervollständigung eines Features kann es in den main-Branch eingebunden werden:
* merge branches (main)
|\
* | add sidebar
| * add logo to footer
| * add footer with basic content
|/
* add placeholder content
* initialize website
alte Feature-Branches werden üblicherweise gelöscht
während der Entwicklung:
wenn das Feature fertiggestellt ist:
git branch foo
git branch foo $commitid
git switch foo
git switch -c bar
git switch -c bar $commitid
git branch
git branch python-3-port
Wechseln zwischen python-3-port und main:
git switch python-3-port
git switch main
Vor dem Wechseln kann es sinnvoll sein, dass es keine aktiven Änderungen gibt
git status
git switch main
git switch -c python-3-port
Erstellen und Wechseln zu einem neuen Branch
Auflisten von allen (lokalen) Branches:
git branch
Strategien:
Beispiel für eine Commit-History (während der Feature-Entwicklung):
* merge branches (footer)
/|
* | add company logo (main)
| * add copyright notice to footer
| * merge branch 'main' into 'footer'
|/|
* | add sidebar
| * add logo to footer
| * add footer with basic content
|/
* add placeholder content
* initialize website
Beispiel für eine Commit-History (wenn das Feature vollständig ist):
* merge branches (main)
|\
* | add company logo
| * add copyright notice to footer
| * merge branch 'main' into 'footer'
|/|
* | add sidebar
| * add logo to footer
| * add footer with basic content
|/
* add placeholder content
* initialize website
Befehle zum Zusammenführen der Änderungen von main und footer (Merge von main nach footer):
git switch footer
git merge main
haben zwei Branches die gleiche Zeile unterschiedlich abgeändert, gibt es einen Merge-Konflikt
Darstellung eines Merge-Konflikts in einer Datei:
First line
Second line
<<<<<< HEAD
Thrd line!
======
Third line
>>>>>> main
Fourth line
Ein Branch hat ein Ausrufezeichen hinzugefügt, ein anderer einen Schreibfehler behoben
git commit
(ohne extra Argumente)Üblicherweise werden Branches nach dem Merge gelöscht:
Löschen eines Branches, der gemerged wurde:
git branch -d footer
Löschen eines Branches, der nicht gemerged ist:
git branch -D footer
Erstelle eine Text-Datei mit Todos:
- groceries
- taxes
x gardening
Verändere die Todos mittels separater Feature Branches, z.B. "long-term todos", "new-job", "new-job-sub-items", "taxes-completed", ...
Hosts für Git:
Optionen:
git clone https://github.com/...
Wir kopieren hierzu den Link des grünen clone or download-Buttons auf GitHub
Auf GitHub: Klicke auf das + rechts oben
Wähle nicht "Initialize this repository with a README"
Sobald das leere Repository auf GitHub existiert - folge der dort angezeigten Anleitung für ein leeres Repository
Üblicherweise verbindet man ein lokales Repository nur mit einem remote Repository - das remote Repository nennt man üblicherweise origin
git remote add origin https://github.com/...
Zum Veröffentlichen eines Branches, der am remote Repository noch nicht bekannt ist:
git push -u origin main
kopiert die Commits des lokalen main-Branches in einen neu angelegten main-Branch im remote Repository
Zum Veröffentlichen von Commits eines Branches, der auf der remote-Seite schon bekannt ist:
git push
Holen und mergen von Commits des remote Branches, der dem aktiven Branch entspricht:
git pull
Löschen eines lokalen Branches:
git branch -d python-3-port
Löschen des zugehörigen remote Branches:
git push origin :python-3-port
git config credential.helper cache
Hierdurch speichert Git eingegebene Passwörter für 15 Minuten
Es ist möglich, die Commit-History zu bearbeiten - kann aber gefährlich sein
Beispiele für Anwendungsfälle:
Regeln:
ursprünglicher Commit-Log:
* merge branch 'main' into 'footer' (footer)
/|
* | add company logo (main)
| * add copyright notice to footer
| * merge branch 'main' into 'footer'
|/|
* | add sidebar
| * add logo to footer
| * add footer with basic content
|/
* add placeholder content
* initialize website
neuer Commit-Log:
* add footer (footer)
/
* add company logo (main)
* add sidebar
* add placeholder content
* initialize website
Bemerkung: der main-Branch wurde nicht geändert
Befehl in Git:
git rebase -i main
Ermöglicht das Interaktive Bearbeiten des aktuellen Branches von dem Punkt, bei dem er von main abzweigt
Squashing von Commits:
Ändere alle außer dem ersten Befehle von pick auf squash
Konfigurieren einiger Aliases:
git config --global alias.unstage 'restore --staged'
git config --global alias.show-tree 'log --graph --oneline --all'
git-extras bietet vereinfachte Befehle für häufige Aufgaben:
git ignore
git show-tree
git squash
git undo