<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>http://dev.kaibel.net/index.php?action=history&amp;feed=atom&amp;title=Git</id>
	<title>Git - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="http://dev.kaibel.net/index.php?action=history&amp;feed=atom&amp;title=Git"/>
	<link rel="alternate" type="text/html" href="http://dev.kaibel.net/index.php?title=Git&amp;action=history"/>
	<updated>2026-06-27T05:08:28Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in dev.kaibel.net</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>http://dev.kaibel.net/index.php?title=Git&amp;diff=203&amp;oldid=prev</id>
		<title>PhilKa: Die Seite wurde neu angelegt: „= Git =  &#039;&#039;&#039;Git&#039;&#039;&#039; ist ein verteiltes Versionsverwaltungssystem, das zur Verwaltung von Änderungen an Dateien und Quellcode eingesetzt wird. Es ermöglicht, verschiedene Versionen eines Projekts zu speichern, Änderungen nachzuvollziehen, ältere Zustände wiederherzustellen und gemeinsam an Softwareprojekten zu arbeiten.  Git wird besonders häufig in der Softwareentwicklung verwendet, eignet sich aber grundsätzlich für alle textbasierten Dateien,…“</title>
		<link rel="alternate" type="text/html" href="http://dev.kaibel.net/index.php?title=Git&amp;diff=203&amp;oldid=prev"/>
		<updated>2026-06-04T10:27:27Z</updated>

		<summary type="html">&lt;p&gt;Die Seite wurde neu angelegt: „= Git =  &amp;#039;&amp;#039;&amp;#039;Git&amp;#039;&amp;#039;&amp;#039; ist ein verteiltes Versionsverwaltungssystem, das zur Verwaltung von Änderungen an Dateien und Quellcode eingesetzt wird. Es ermöglicht, verschiedene Versionen eines Projekts zu speichern, Änderungen nachzuvollziehen, ältere Zustände wiederherzustellen und gemeinsam an Softwareprojekten zu arbeiten.  Git wird besonders häufig in der &lt;a href=&quot;/index.php?title=Softwareentwicklung&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Softwareentwicklung (Seite nicht vorhanden)&quot;&gt;Softwareentwicklung&lt;/a&gt; verwendet, eignet sich aber grundsätzlich für alle textbasierten Dateien,…“&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= Git =&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Git&amp;#039;&amp;#039;&amp;#039; ist ein verteiltes Versionsverwaltungssystem, das zur Verwaltung von Änderungen an Dateien und Quellcode eingesetzt wird. Es ermöglicht, verschiedene Versionen eines Projekts zu speichern, Änderungen nachzuvollziehen, ältere Zustände wiederherzustellen und gemeinsam an Softwareprojekten zu arbeiten.&lt;br /&gt;
&lt;br /&gt;
Git wird besonders häufig in der [[Softwareentwicklung]] verwendet, eignet sich aber grundsätzlich für alle textbasierten Dateien, zum Beispiel Konfigurationsdateien, Dokumentationen oder Skripte.&lt;br /&gt;
&lt;br /&gt;
== Grundidee ==&lt;br /&gt;
&lt;br /&gt;
Bei der Entwicklung von Software ändern sich Dateien ständig. Ohne Versionsverwaltung ist es schwierig nachzuvollziehen:&lt;br /&gt;
&lt;br /&gt;
* wann eine Änderung vorgenommen wurde&lt;br /&gt;
* wer eine Änderung vorgenommen hat&lt;br /&gt;
* warum eine Änderung vorgenommen wurde&lt;br /&gt;
* welche Dateien betroffen waren&lt;br /&gt;
* wie ein früherer Zustand wiederhergestellt werden kann&lt;br /&gt;
&lt;br /&gt;
Git löst dieses Problem, indem Änderungen in sogenannten &amp;#039;&amp;#039;&amp;#039;Commits&amp;#039;&amp;#039;&amp;#039; gespeichert werden. Jeder Commit beschreibt einen bestimmten Zustand des Projekts.&lt;br /&gt;
&lt;br /&gt;
== Verteilte Versionsverwaltung ==&lt;br /&gt;
&lt;br /&gt;
Git ist ein &amp;#039;&amp;#039;&amp;#039;verteiltes Versionsverwaltungssystem&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Das bedeutet: Jeder Entwickler besitzt eine vollständige Kopie des Repositories einschließlich der gesamten Historie.&lt;br /&gt;
&lt;br /&gt;
Im Gegensatz zu zentralen Systemen wie SVN ist Git nicht dauerhaft auf einen zentralen Server angewiesen.&lt;br /&gt;
&lt;br /&gt;
Vorteile der verteilten Arbeitsweise:&lt;br /&gt;
&lt;br /&gt;
* Arbeiten ohne permanente Internetverbindung&lt;br /&gt;
* Lokale Commits ohne Serverzugriff&lt;br /&gt;
* Schnelle Operationen&lt;br /&gt;
* Hohe Ausfallsicherheit&lt;br /&gt;
* Einfache parallele Entwicklung&lt;br /&gt;
&lt;br /&gt;
Ein zentraler Server wird häufig trotzdem verwendet, zum Beispiel über Plattformen wie GitHub, GitLab oder Bitbucket. Dieser Server dient dann vor allem der Zusammenarbeit und Synchronisation.&lt;br /&gt;
&lt;br /&gt;
== Repository ==&lt;br /&gt;
&lt;br /&gt;
Ein &amp;#039;&amp;#039;&amp;#039;Repository&amp;#039;&amp;#039;&amp;#039; ist der Speicherort eines Git-Projekts. Es enthält:&lt;br /&gt;
&lt;br /&gt;
* die Projektdateien&lt;br /&gt;
* die Commit-Historie&lt;br /&gt;
* Branches&lt;br /&gt;
* Tags&lt;br /&gt;
* Konfigurationsinformationen&lt;br /&gt;
* Metadaten von Git&lt;br /&gt;
&lt;br /&gt;
Ein neues Repository wird mit folgendem Befehl erstellt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git init&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein vorhandenes Repository wird mit folgendem Befehl kopiert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://example.org/projekt.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wichtige Begriffe ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Begriff&lt;br /&gt;
! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| Repository&lt;br /&gt;
| Git-Projekt mit Dateien, Historie und Metadaten&lt;br /&gt;
|-&lt;br /&gt;
| Commit&lt;br /&gt;
| Gespeicherter Zustand des Projekts&lt;br /&gt;
|-&lt;br /&gt;
| Branch&lt;br /&gt;
| Entwicklungszweig innerhalb eines Repositories&lt;br /&gt;
|-&lt;br /&gt;
| Merge&lt;br /&gt;
| Zusammenführen zweier Branches&lt;br /&gt;
|-&lt;br /&gt;
| Rebase&lt;br /&gt;
| Neuaufbau einer Commit-Historie auf Basis eines anderen Branches&lt;br /&gt;
|-&lt;br /&gt;
| Remote&lt;br /&gt;
| Entferntes Repository, zum Beispiel auf GitHub oder GitLab&lt;br /&gt;
|-&lt;br /&gt;
| Clone&lt;br /&gt;
| Lokale Kopie eines entfernten Repositories&lt;br /&gt;
|-&lt;br /&gt;
| Pull&lt;br /&gt;
| Änderungen aus einem entfernten Repository herunterladen und integrieren&lt;br /&gt;
|-&lt;br /&gt;
| Push&lt;br /&gt;
| Lokale Änderungen in ein entferntes Repository hochladen&lt;br /&gt;
|-&lt;br /&gt;
| Tag&lt;br /&gt;
| Markierung eines bestimmten Commits, häufig für Versionen&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Arbeitsbereiche in Git ==&lt;br /&gt;
&lt;br /&gt;
Git unterscheidet mehrere Arbeitsbereiche.&lt;br /&gt;
&lt;br /&gt;
=== Working Directory ===&lt;br /&gt;
&lt;br /&gt;
Das &amp;#039;&amp;#039;&amp;#039;Working Directory&amp;#039;&amp;#039;&amp;#039; enthält die Dateien, an denen aktuell gearbeitet wird.&lt;br /&gt;
&lt;br /&gt;
Wenn eine Datei bearbeitet wird, befindet sich die Änderung zunächst nur im Working Directory.&lt;br /&gt;
&lt;br /&gt;
=== Staging Area ===&lt;br /&gt;
&lt;br /&gt;
Die &amp;#039;&amp;#039;&amp;#039;Staging Area&amp;#039;&amp;#039;&amp;#039; ist ein Zwischenspeicher für Änderungen, die in den nächsten Commit aufgenommen werden sollen.&lt;br /&gt;
&lt;br /&gt;
Dateien werden mit folgendem Befehl zur Staging Area hinzugefügt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git add datei.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alle geänderten Dateien können mit folgendem Befehl hinzugefügt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git add .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lokales Repository ===&lt;br /&gt;
&lt;br /&gt;
Das lokale Repository enthält die dauerhaft gespeicherten Commits.&lt;br /&gt;
&lt;br /&gt;
Ein Commit wird mit folgendem Befehl erstellt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git commit -m &amp;quot;Beschreibung der Änderung&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Typischer Git-Arbeitsablauf ==&lt;br /&gt;
&lt;br /&gt;
Ein einfacher Arbeitsablauf sieht folgendermaßen aus:&lt;br /&gt;
&lt;br /&gt;
# Dateien bearbeiten&lt;br /&gt;
# Änderungen prüfen&lt;br /&gt;
# Änderungen zur Staging Area hinzufügen&lt;br /&gt;
# Commit erstellen&lt;br /&gt;
# Änderungen optional auf einen Server übertragen&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git status&lt;br /&gt;
git add .&lt;br /&gt;
git commit -m &amp;quot;Neue Funktion implementiert&amp;quot;&lt;br /&gt;
git push&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Status anzeigen ==&lt;br /&gt;
&lt;br /&gt;
Der aktuelle Zustand des Repositories wird mit folgendem Befehl angezeigt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser Befehl zeigt unter anderem:&lt;br /&gt;
&lt;br /&gt;
* geänderte Dateien&lt;br /&gt;
* neue Dateien&lt;br /&gt;
* gelöschte Dateien&lt;br /&gt;
* Dateien in der Staging Area&lt;br /&gt;
* den aktuellen Branch&lt;br /&gt;
&lt;br /&gt;
== Änderungen anzeigen ==&lt;br /&gt;
&lt;br /&gt;
Noch nicht vorgemerkte Änderungen können mit folgendem Befehl angezeigt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git diff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Änderungen in der Staging Area können so angezeigt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git diff --staged&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Commits ==&lt;br /&gt;
&lt;br /&gt;
Ein &amp;#039;&amp;#039;&amp;#039;Commit&amp;#039;&amp;#039;&amp;#039; ist eine gespeicherte Momentaufnahme des Projekts.&lt;br /&gt;
&lt;br /&gt;
Ein Commit enthält:&lt;br /&gt;
&lt;br /&gt;
* eine eindeutige ID&lt;br /&gt;
* Autorinformationen&lt;br /&gt;
* Datum und Uhrzeit&lt;br /&gt;
* Commit-Nachricht&lt;br /&gt;
* Verweis auf vorherige Commits&lt;br /&gt;
* Änderungen am Projektzustand&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git commit -m &amp;quot;Fehler in der Benutzeranmeldung behoben&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine gute Commit-Nachricht sollte kurz und verständlich beschreiben, was geändert wurde.&lt;br /&gt;
&lt;br /&gt;
== Commit-Historie anzeigen ==&lt;br /&gt;
&lt;br /&gt;
Die Commit-Historie wird mit folgendem Befehl angezeigt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git log&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine kompaktere Darstellung erhält man mit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git log --oneline&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine grafische Übersicht über Branches kann so angezeigt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git log --oneline --graph --all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Branches ==&lt;br /&gt;
&lt;br /&gt;
Ein &amp;#039;&amp;#039;&amp;#039;Branch&amp;#039;&amp;#039;&amp;#039; ist ein Entwicklungszweig.&lt;br /&gt;
&lt;br /&gt;
Branches ermöglichen es, parallel an unterschiedlichen Aufgaben zu arbeiten, ohne den Hauptzweig direkt zu verändern.&lt;br /&gt;
&lt;br /&gt;
Typische Branches sind:&lt;br /&gt;
&lt;br /&gt;
* main&lt;br /&gt;
* develop&lt;br /&gt;
* feature/login&lt;br /&gt;
* bugfix/navigation&lt;br /&gt;
* release/1.0&lt;br /&gt;
&lt;br /&gt;
== Branch erstellen ==&lt;br /&gt;
&lt;br /&gt;
Ein neuer Branch wird mit folgendem Befehl erstellt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git branch feature-login&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum Wechseln auf den Branch wird verwendet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git checkout feature-login&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In modernen Git-Versionen kann stattdessen auch verwendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git switch feature-login&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein Branch kann gleichzeitig erstellt und aktiviert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git switch -c feature-login&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Branches anzeigen ==&lt;br /&gt;
&lt;br /&gt;
Alle lokalen Branches werden mit folgendem Befehl angezeigt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git branch&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alle lokalen und entfernten Branches werden so angezeigt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git branch -a&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Merge ==&lt;br /&gt;
&lt;br /&gt;
Ein &amp;#039;&amp;#039;&amp;#039;Merge&amp;#039;&amp;#039;&amp;#039; führt Änderungen aus einem Branch in einen anderen Branch zusammen.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git switch main&lt;br /&gt;
git merge feature-login&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei werden die Änderungen aus dem Branch &amp;lt;code&amp;gt;feature-login&amp;lt;/code&amp;gt; in den Branch &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt; übernommen.&lt;br /&gt;
&lt;br /&gt;
== Merge-Konflikte ==&lt;br /&gt;
&lt;br /&gt;
Ein Merge-Konflikt entsteht, wenn Git Änderungen nicht automatisch zusammenführen kann.&lt;br /&gt;
&lt;br /&gt;
Das passiert zum Beispiel, wenn zwei Branches dieselbe Zeile einer Datei unterschiedlich verändert haben.&lt;br /&gt;
&lt;br /&gt;
Git markiert die betroffenen Stellen in der Datei:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; HEAD&lt;br /&gt;
Aktuelle Version&lt;br /&gt;
=======&lt;br /&gt;
Andere Version&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; feature-login&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Entwickler muss den Konflikt manuell auflösen. Danach wird die Datei erneut hinzugefügt und der Merge abgeschlossen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git add datei.txt&lt;br /&gt;
git commit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rebase ==&lt;br /&gt;
&lt;br /&gt;
Ein &amp;#039;&amp;#039;&amp;#039;Rebase&amp;#039;&amp;#039;&amp;#039; setzt die Commits eines Branches auf eine neue Basis.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git switch feature-login&lt;br /&gt;
git rebase main&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dadurch werden die Commits des Feature-Branches so neu angeordnet, als wären sie direkt auf dem aktuellen Stand von &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt; entstanden.&lt;br /&gt;
&lt;br /&gt;
=== Unterschied zwischen Merge und Rebase ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Verfahren&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Vorteil&lt;br /&gt;
! Nachteil&lt;br /&gt;
|-&lt;br /&gt;
| Merge&lt;br /&gt;
| Führt zwei Branches zusammen und erzeugt bei Bedarf einen Merge-Commit&lt;br /&gt;
| Historie bleibt vollständig erhalten&lt;br /&gt;
| Historie kann unübersichtlich werden&lt;br /&gt;
|-&lt;br /&gt;
| Rebase&lt;br /&gt;
| Setzt Commits auf eine neue Basis&lt;br /&gt;
| Lineare, saubere Historie&lt;br /&gt;
| Kann problematisch sein, wenn bereits veröffentlichte Commits verändert werden&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Als Faustregel gilt: Rebase sollte nicht unüberlegt auf Branches angewendet werden, die bereits mit anderen Personen geteilt wurden.&lt;br /&gt;
&lt;br /&gt;
== Remote Repositories ==&lt;br /&gt;
&lt;br /&gt;
Ein &amp;#039;&amp;#039;&amp;#039;Remote Repository&amp;#039;&amp;#039;&amp;#039; ist ein entferntes Repository, zum Beispiel auf einem Server.&lt;br /&gt;
&lt;br /&gt;
Typische Plattformen sind:&lt;br /&gt;
&lt;br /&gt;
* GitHub&lt;br /&gt;
* GitLab&lt;br /&gt;
* Bitbucket&lt;br /&gt;
* Gitea&lt;br /&gt;
* Forgejo&lt;br /&gt;
&lt;br /&gt;
Die Verbindung zu einem entfernten Repository wird häufig unter dem Namen &amp;lt;code&amp;gt;origin&amp;lt;/code&amp;gt; gespeichert.&lt;br /&gt;
&lt;br /&gt;
Remotes anzeigen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git remote -v&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remote hinzufügen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git remote add origin https://example.org/projekt.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Push ==&lt;br /&gt;
&lt;br /&gt;
Mit &amp;#039;&amp;#039;&amp;#039;push&amp;#039;&amp;#039;&amp;#039; werden lokale Commits in ein entferntes Repository hochgeladen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git push origin main&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim ersten Push eines neuen Branches wird häufig verwendet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git push -u origin feature-login&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Option &amp;lt;code&amp;gt;-u&amp;lt;/code&amp;gt; setzt den entfernten Branch als Standardziel für spätere Push- und Pull-Befehle.&lt;br /&gt;
&lt;br /&gt;
== Pull ==&lt;br /&gt;
&lt;br /&gt;
Mit &amp;#039;&amp;#039;&amp;#039;pull&amp;#039;&amp;#039;&amp;#039; werden Änderungen aus einem entfernten Repository heruntergeladen und in den aktuellen Branch integriert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git pull&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Intern entspricht &amp;lt;code&amp;gt;git pull&amp;lt;/code&amp;gt; meistens einer Kombination aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git fetch&lt;br /&gt;
git merge&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Je nach Konfiguration kann statt Merge auch Rebase verwendet werden.&lt;br /&gt;
&lt;br /&gt;
== Fetch ==&lt;br /&gt;
&lt;br /&gt;
Mit &amp;#039;&amp;#039;&amp;#039;fetch&amp;#039;&amp;#039;&amp;#039; werden Änderungen aus einem entfernten Repository heruntergeladen, aber noch nicht in den aktuellen Branch integriert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git fetch&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dadurch kann man zunächst prüfen, welche Änderungen verfügbar sind.&lt;br /&gt;
&lt;br /&gt;
== Tags ==&lt;br /&gt;
&lt;br /&gt;
Ein &amp;#039;&amp;#039;&amp;#039;Tag&amp;#039;&amp;#039;&amp;#039; markiert einen bestimmten Commit.&lt;br /&gt;
&lt;br /&gt;
Tags werden häufig für Softwareversionen verwendet.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git tag v1.0.0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein Tag kann auf den Server übertragen werden mit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git push origin v1.0.0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alle Tags anzeigen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git tag&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== .gitignore ==&lt;br /&gt;
&lt;br /&gt;
Die Datei &amp;lt;code&amp;gt;.gitignore&amp;lt;/code&amp;gt; legt fest, welche Dateien Git ignorieren soll.&lt;br /&gt;
&lt;br /&gt;
Typische Beispiele:&lt;br /&gt;
&lt;br /&gt;
* temporäre Dateien&lt;br /&gt;
* Build-Artefakte&lt;br /&gt;
* Logdateien&lt;br /&gt;
* lokale Konfigurationsdateien&lt;br /&gt;
* Abhängigkeiten wie &amp;lt;code&amp;gt;node_modules&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
node_modules/&lt;br /&gt;
*.log&lt;br /&gt;
.env&lt;br /&gt;
dist/&lt;br /&gt;
build/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine &amp;lt;code&amp;gt;.gitignore&amp;lt;/code&amp;gt;-Datei verhindert, dass unnötige oder sensible Dateien versehentlich versioniert werden.&lt;br /&gt;
&lt;br /&gt;
== Dateien aus Git entfernen ==&lt;br /&gt;
&lt;br /&gt;
Eine Datei kann aus Git entfernt werden mit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git rm datei.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Soll eine Datei nur aus der Versionsverwaltung entfernt werden, aber lokal erhalten bleiben, verwendet man:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git rm --cached datei.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das ist besonders nützlich, wenn eine Datei versehentlich versioniert wurde und anschließend in &amp;lt;code&amp;gt;.gitignore&amp;lt;/code&amp;gt; eingetragen wird.&lt;br /&gt;
&lt;br /&gt;
== Änderungen rückgängig machen ==&lt;br /&gt;
&lt;br /&gt;
Git bietet verschiedene Möglichkeiten, Änderungen rückgängig zu machen.&lt;br /&gt;
&lt;br /&gt;
=== Nicht gespeicherte Änderung verwerfen ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git restore datei.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Datei aus der Staging Area entfernen ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git restore --staged datei.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Letzten Commit ändern ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git commit --amend&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser Befehl verändert den letzten Commit. Er sollte vorsichtig verwendet werden, wenn der Commit bereits veröffentlicht wurde.&lt;br /&gt;
&lt;br /&gt;
=== Commit rückgängig machen ===&lt;br /&gt;
&lt;br /&gt;
Ein veröffentlichter Commit sollte meistens mit &amp;lt;code&amp;gt;git revert&amp;lt;/code&amp;gt; rückgängig gemacht werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git revert COMMIT_ID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei entsteht ein neuer Commit, der die Änderungen des alten Commits rückgängig macht.&lt;br /&gt;
&lt;br /&gt;
== Reset ==&lt;br /&gt;
&lt;br /&gt;
Mit &amp;lt;code&amp;gt;git reset&amp;lt;/code&amp;gt; kann der aktuelle Branch auf einen früheren Zustand zurückgesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git reset --soft HEAD~1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser Befehl entfernt den letzten Commit, behält die Änderungen aber in der Staging Area.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git reset --mixed HEAD~1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser Befehl entfernt den letzten Commit und nimmt die Änderungen aus der Staging Area heraus.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git reset --hard HEAD~1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser Befehl entfernt den letzten Commit und verwirft die Änderungen vollständig.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Achtung:&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;git reset --hard&amp;lt;/code&amp;gt; kann nicht gespeicherte Arbeit dauerhaft löschen.&lt;br /&gt;
&lt;br /&gt;
== Stash ==&lt;br /&gt;
&lt;br /&gt;
Mit &amp;#039;&amp;#039;&amp;#039;stash&amp;#039;&amp;#039;&amp;#039; können aktuelle Änderungen vorübergehend gespeichert werden, ohne direkt einen Commit zu erstellen.&lt;br /&gt;
&lt;br /&gt;
Änderungen speichern:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git stash&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Gespeicherte Änderungen anzeigen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git stash list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Letzten Stash wiederherstellen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git stash pop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Stash wiederherstellen, aber nicht löschen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git stash apply&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Git-Konfiguration ==&lt;br /&gt;
&lt;br /&gt;
Vor der Nutzung von Git sollten Name und E-Mail-Adresse eingerichtet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git config --global user.name &amp;quot;Max Mustermann&amp;quot;&lt;br /&gt;
git config --global user.email &amp;quot;max@example.org&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aktuelle Konfiguration anzeigen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git config --list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Git-Objektmodell ==&lt;br /&gt;
&lt;br /&gt;
Git speichert Inhalte intern als Objekte.&lt;br /&gt;
&lt;br /&gt;
Wichtige Objekttypen sind:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Objekttyp&lt;br /&gt;
! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| Blob&lt;br /&gt;
| Inhalt einer Datei&lt;br /&gt;
|-&lt;br /&gt;
| Tree&lt;br /&gt;
| Verzeichnisstruktur&lt;br /&gt;
|-&lt;br /&gt;
| Commit&lt;br /&gt;
| Projektzustand mit Metadaten und Verweisen&lt;br /&gt;
|-&lt;br /&gt;
| Tag&lt;br /&gt;
| Markierung eines bestimmten Objekts&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Git speichert nicht einfach nur Unterschiede zwischen Dateien, sondern verwaltet Projektzustände über ein internes Objektmodell. Zur Speicheroptimierung kann Git Objekte später komprimieren und effizient ablegen.&lt;br /&gt;
&lt;br /&gt;
== Hashes ==&lt;br /&gt;
&lt;br /&gt;
Git identifiziert Objekte über Hashwerte.&lt;br /&gt;
&lt;br /&gt;
Ein Commit besitzt beispielsweise eine eindeutige Commit-ID:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a3f5c9d7e1b2...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese ID wird aus dem Inhalt und den Metadaten erzeugt. Ändert sich der Inhalt, ändert sich auch der Hash.&lt;br /&gt;
&lt;br /&gt;
Historisch verwendet Git SHA-1. Neuere Git-Versionen unterstützen auch SHA-256-Repositories.&lt;br /&gt;
&lt;br /&gt;
== HEAD ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;HEAD&amp;lt;/code&amp;gt; bezeichnet in Git den aktuell ausgecheckten Commit.&lt;br /&gt;
&lt;br /&gt;
Meist zeigt &amp;lt;code&amp;gt;HEAD&amp;lt;/code&amp;gt; auf den aktuellen Branch.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HEAD -&amp;gt; main&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn &amp;lt;code&amp;gt;HEAD&amp;lt;/code&amp;gt; direkt auf einen Commit zeigt und nicht auf einen Branch, spricht man von einem &amp;#039;&amp;#039;&amp;#039;detached HEAD&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
== Detached HEAD ==&lt;br /&gt;
&lt;br /&gt;
Ein &amp;#039;&amp;#039;&amp;#039;detached HEAD&amp;#039;&amp;#039;&amp;#039; entsteht, wenn ein bestimmter Commit direkt ausgecheckt wird:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git checkout COMMIT_ID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Zustand befindet man sich nicht auf einem Branch. Neue Commits können dadurch leicht verloren gehen, wenn kein neuer Branch erstellt wird.&lt;br /&gt;
&lt;br /&gt;
Sicherer ist:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git switch -c test-branch COMMIT_ID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Submodule ==&lt;br /&gt;
&lt;br /&gt;
Ein &amp;#039;&amp;#039;&amp;#039;Submodule&amp;#039;&amp;#039;&amp;#039; ermöglicht es, ein anderes Git-Repository innerhalb eines Repositories einzubinden.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git submodule add https://example.org/bibliothek.git libs/bibliothek&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Submodule werden häufig verwendet, wenn externe Bibliotheken oder gemeinsam genutzte Komponenten eingebunden werden sollen.&lt;br /&gt;
&lt;br /&gt;
Nachteile von Submodulen:&lt;br /&gt;
&lt;br /&gt;
* zusätzliche Komplexität&lt;br /&gt;
* getrennte Historien&lt;br /&gt;
* Fehleranfälligkeit bei Updates&lt;br /&gt;
* schwieriger für Einsteiger&lt;br /&gt;
&lt;br /&gt;
== Git Hooks ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Git Hooks&amp;#039;&amp;#039;&amp;#039; sind Skripte, die bei bestimmten Git-Ereignissen automatisch ausgeführt werden.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
* vor einem Commit&lt;br /&gt;
* nach einem Commit&lt;br /&gt;
* vor einem Push&lt;br /&gt;
* nach einem Merge&lt;br /&gt;
&lt;br /&gt;
Typische Einsatzzwecke:&lt;br /&gt;
&lt;br /&gt;
* Codeformatierung prüfen&lt;br /&gt;
* Tests ausführen&lt;br /&gt;
* Commit-Nachrichten validieren&lt;br /&gt;
* Sicherheitsprüfungen durchführen&lt;br /&gt;
&lt;br /&gt;
Hooks befinden sich im Verzeichnis:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.git/hooks/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Typische Workflows ==&lt;br /&gt;
&lt;br /&gt;
=== Feature-Branch-Workflow ===&lt;br /&gt;
&lt;br /&gt;
Beim Feature-Branch-Workflow wird für jede neue Funktion ein eigener Branch erstellt.&lt;br /&gt;
&lt;br /&gt;
Ablauf:&lt;br /&gt;
&lt;br /&gt;
# Branch von &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt; erstellen&lt;br /&gt;
# Funktion implementieren&lt;br /&gt;
# Änderungen committen&lt;br /&gt;
# Branch pushen&lt;br /&gt;
# Merge Request oder Pull Request erstellen&lt;br /&gt;
# Code Review durchführen&lt;br /&gt;
# Branch in &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt; mergen&lt;br /&gt;
&lt;br /&gt;
Dieser Workflow ist in vielen Teams Standard.&lt;br /&gt;
&lt;br /&gt;
=== Gitflow ===&lt;br /&gt;
&lt;br /&gt;
Gitflow verwendet mehrere feste Branch-Typen:&lt;br /&gt;
&lt;br /&gt;
* main&lt;br /&gt;
* develop&lt;br /&gt;
* feature/*&lt;br /&gt;
* release/*&lt;br /&gt;
* hotfix/*&lt;br /&gt;
&lt;br /&gt;
Gitflow eignet sich besonders für Projekte mit klaren Release-Zyklen.&lt;br /&gt;
&lt;br /&gt;
Für kleinere Projekte kann Gitflow jedoch unnötig komplex sein.&lt;br /&gt;
&lt;br /&gt;
=== Trunk-Based Development ===&lt;br /&gt;
&lt;br /&gt;
Beim Trunk-Based Development arbeiten Entwickler möglichst direkt auf einem Hauptbranch oder verwenden nur sehr kurzlebige Branches.&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
&lt;br /&gt;
* schnelle Integration&lt;br /&gt;
* weniger Merge-Konflikte&lt;br /&gt;
* gut geeignet für Continuous Integration&lt;br /&gt;
&lt;br /&gt;
Nachteile:&lt;br /&gt;
&lt;br /&gt;
* erfordert gute Tests&lt;br /&gt;
* erfordert disziplinierte Entwicklung&lt;br /&gt;
* unfertige Funktionen müssen oft über Feature Flags abgesichert werden&lt;br /&gt;
&lt;br /&gt;
== Git und Plattformen ==&lt;br /&gt;
&lt;br /&gt;
Git selbst ist ein Kommandozeilenwerkzeug und Versionsverwaltungssystem.&lt;br /&gt;
&lt;br /&gt;
Plattformen wie GitHub oder GitLab sind zusätzliche Dienste, die Git-Repositories hosten und weitere Funktionen bereitstellen.&lt;br /&gt;
&lt;br /&gt;
Typische Zusatzfunktionen solcher Plattformen:&lt;br /&gt;
&lt;br /&gt;
* Pull Requests oder Merge Requests&lt;br /&gt;
* Issue-Tracking&lt;br /&gt;
* Projektmanagement&lt;br /&gt;
* Continuous Integration&lt;br /&gt;
* Code Reviews&lt;br /&gt;
* Wiki-Funktionen&lt;br /&gt;
* Rechteverwaltung&lt;br /&gt;
&lt;br /&gt;
Git und GitHub sind daher nicht dasselbe. Git ist das Versionsverwaltungssystem, GitHub ist eine Plattform zur Zusammenarbeit mit Git.&lt;br /&gt;
&lt;br /&gt;
== Häufige Befehle ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Befehl&lt;br /&gt;
! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;git init&amp;lt;/code&amp;gt;&lt;br /&gt;
| Neues Repository erstellen&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;git clone&amp;lt;/code&amp;gt;&lt;br /&gt;
| Repository kopieren&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;git status&amp;lt;/code&amp;gt;&lt;br /&gt;
| Aktuellen Zustand anzeigen&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;git add&amp;lt;/code&amp;gt;&lt;br /&gt;
| Änderungen zur Staging Area hinzufügen&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;git commit&amp;lt;/code&amp;gt;&lt;br /&gt;
| Änderungen speichern&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;git log&amp;lt;/code&amp;gt;&lt;br /&gt;
| Commit-Historie anzeigen&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;git branch&amp;lt;/code&amp;gt;&lt;br /&gt;
| Branches anzeigen oder erstellen&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;git switch&amp;lt;/code&amp;gt;&lt;br /&gt;
| Branch wechseln&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;git merge&amp;lt;/code&amp;gt;&lt;br /&gt;
| Branches zusammenführen&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;git rebase&amp;lt;/code&amp;gt;&lt;br /&gt;
| Commits auf neue Basis setzen&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;git fetch&amp;lt;/code&amp;gt;&lt;br /&gt;
| Änderungen vom Remote herunterladen&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;git pull&amp;lt;/code&amp;gt;&lt;br /&gt;
| Änderungen herunterladen und integrieren&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;git push&amp;lt;/code&amp;gt;&lt;br /&gt;
| Änderungen hochladen&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;git stash&amp;lt;/code&amp;gt;&lt;br /&gt;
| Änderungen vorübergehend speichern&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;git tag&amp;lt;/code&amp;gt;&lt;br /&gt;
| Version markieren&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Best Practices ==&lt;br /&gt;
&lt;br /&gt;
=== Kleine Commits erstellen ===&lt;br /&gt;
&lt;br /&gt;
Commits sollten möglichst kleine, logisch zusammenhängende Änderungen enthalten.&lt;br /&gt;
&lt;br /&gt;
Schlecht:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git commit -m &amp;quot;Alles geändert&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Besser:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git commit -m &amp;quot;Validierung für Login-Formular ergänzt&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Aussagekräftige Commit-Nachrichten verwenden ===&lt;br /&gt;
&lt;br /&gt;
Eine gute Commit-Nachricht beschreibt, was geändert wurde und idealerweise warum.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
* Fehler beim Speichern leerer Formulare behoben&lt;br /&gt;
* Benutzerrolle zur Rechteprüfung hinzugefügt&lt;br /&gt;
* Datenbankmigration für Produkte erstellt&lt;br /&gt;
&lt;br /&gt;
=== Branches sinnvoll benennen ===&lt;br /&gt;
&lt;br /&gt;
Gute Branchnamen sind kurz und beschreibend.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
* feature/login&lt;br /&gt;
* bugfix/navbar&lt;br /&gt;
* hotfix/payment-error&lt;br /&gt;
* docs/git-grundlagen&lt;br /&gt;
&lt;br /&gt;
=== Regelmäßig synchronisieren ===&lt;br /&gt;
&lt;br /&gt;
In Teamprojekten sollte regelmäßig mit dem entfernten Repository synchronisiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git fetch&lt;br /&gt;
git pull&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dadurch werden Konflikte frühzeitig erkannt.&lt;br /&gt;
&lt;br /&gt;
=== Keine sensiblen Daten committen ===&lt;br /&gt;
&lt;br /&gt;
Nicht in ein Repository gehören:&lt;br /&gt;
&lt;br /&gt;
* Passwörter&lt;br /&gt;
* API-Schlüssel&lt;br /&gt;
* private Zertifikate&lt;br /&gt;
* Datenbankzugänge&lt;br /&gt;
* persönliche Zugangsdaten&lt;br /&gt;
&lt;br /&gt;
Solche Dateien sollten über &amp;lt;code&amp;gt;.gitignore&amp;lt;/code&amp;gt; ausgeschlossen werden.&lt;br /&gt;
&lt;br /&gt;
== Typische Fehler ==&lt;br /&gt;
&lt;br /&gt;
=== Zu große Commits ===&lt;br /&gt;
&lt;br /&gt;
Sehr große Commits sind schwer zu prüfen und schwer rückgängig zu machen.&lt;br /&gt;
&lt;br /&gt;
=== Unklare Commit-Nachrichten ===&lt;br /&gt;
&lt;br /&gt;
Nachrichten wie „Update“, „Fix“ oder „Änderungen“ sind wenig hilfreich.&lt;br /&gt;
&lt;br /&gt;
=== Direktes Arbeiten auf main ===&lt;br /&gt;
&lt;br /&gt;
In Teamprojekten sollte nicht immer direkt auf dem Hauptbranch gearbeitet werden.&lt;br /&gt;
&lt;br /&gt;
Feature-Branches erhöhen Übersichtlichkeit und Sicherheit.&lt;br /&gt;
&lt;br /&gt;
=== Secrets im Repository ===&lt;br /&gt;
&lt;br /&gt;
Ein einmal veröffentlichter API-Schlüssel sollte als kompromittiert betrachtet und ersetzt werden.&lt;br /&gt;
&lt;br /&gt;
Das Entfernen aus späteren Commits reicht nicht aus, da der Schlüssel weiterhin in der Historie vorhanden sein kann.&lt;br /&gt;
&lt;br /&gt;
== Vorteile von Git ==&lt;br /&gt;
&lt;br /&gt;
* sehr schnell bei lokalen Operationen&lt;br /&gt;
* verteilte Arbeitsweise&lt;br /&gt;
* starke Unterstützung für Branches&lt;br /&gt;
* gute Nachvollziehbarkeit von Änderungen&lt;br /&gt;
* große Verbreitung&lt;br /&gt;
* Integration in viele Entwicklungsumgebungen&lt;br /&gt;
* geeignet für kleine und große Projekte&lt;br /&gt;
&lt;br /&gt;
== Nachteile von Git ==&lt;br /&gt;
&lt;br /&gt;
* für Einsteiger teilweise komplex&lt;br /&gt;
* viele Befehle besitzen unterschiedliche Modi&lt;br /&gt;
* Merge-Konflikte können schwierig sein&lt;br /&gt;
* falsche Nutzung von Reset oder Rebase kann Arbeit zerstören&lt;br /&gt;
* Binärdateien werden weniger effizient verwaltet als Textdateien&lt;br /&gt;
&lt;br /&gt;
== Git in der Softwareentwicklung ==&lt;br /&gt;
&lt;br /&gt;
In modernen Softwareprojekten ist Git häufig eng mit weiteren Entwicklungsprozessen verbunden.&lt;br /&gt;
&lt;br /&gt;
Dazu gehören:&lt;br /&gt;
&lt;br /&gt;
* Code Reviews&lt;br /&gt;
* Continuous Integration&lt;br /&gt;
* automatisierte Tests&lt;br /&gt;
* Deployment-Pipelines&lt;br /&gt;
* Release-Management&lt;br /&gt;
* Issue-Tracking&lt;br /&gt;
* Dokumentation&lt;br /&gt;
&lt;br /&gt;
Git bildet damit nicht nur die technische Grundlage für Versionsverwaltung, sondern auch einen wichtigen Bestandteil professioneller Entwicklungsprozesse.&lt;br /&gt;
&lt;br /&gt;
== Beispiel: Einfaches Projekt mit Git verwalten ==&lt;br /&gt;
&lt;br /&gt;
Ein neues Projekt wird erstellt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir mein-projekt&lt;br /&gt;
cd mein-projekt&lt;br /&gt;
git init&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine Datei wird angelegt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo &amp;quot;# Mein Projekt&amp;quot; &amp;gt; README.md&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Datei wird versioniert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git add README.md&lt;br /&gt;
git commit -m &amp;quot;README erstellt&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein Remote wird hinzugefügt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git remote add origin https://example.org/mein-projekt.git&lt;br /&gt;
git push -u origin main&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Beispiel: Arbeiten mit Feature-Branch ==&lt;br /&gt;
&lt;br /&gt;
Neuen Branch erstellen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git switch -c feature-benutzerprofil&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Änderungen durchführen und committen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git add .&lt;br /&gt;
git commit -m &amp;quot;Benutzerprofil ergänzt&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Branch hochladen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git push -u origin feature-benutzerprofil&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Danach kann auf einer Plattform wie GitHub oder GitLab ein Pull Request beziehungsweise Merge Request erstellt werden.&lt;br /&gt;
&lt;br /&gt;
== Abgrenzung zu anderen Systemen ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! System&lt;br /&gt;
! Typ&lt;br /&gt;
! Besonderheit&lt;br /&gt;
|-&lt;br /&gt;
| Git&lt;br /&gt;
| Verteilte Versionsverwaltung&lt;br /&gt;
| Sehr schnelle Branches und lokale Historie&lt;br /&gt;
|-&lt;br /&gt;
| SVN&lt;br /&gt;
| Zentrale Versionsverwaltung&lt;br /&gt;
| Einfacheres zentrales Modell&lt;br /&gt;
|-&lt;br /&gt;
| Mercurial&lt;br /&gt;
| Verteilte Versionsverwaltung&lt;br /&gt;
| Ähnlich wie Git, aber weniger verbreitet&lt;br /&gt;
|-&lt;br /&gt;
| CVS&lt;br /&gt;
| Zentrale Versionsverwaltung&lt;br /&gt;
| Älteres System&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Zusammenfassung ==&lt;br /&gt;
&lt;br /&gt;
Git ist ein leistungsfähiges und weit verbreitetes Versionsverwaltungssystem. Es ermöglicht Entwicklern, Änderungen zuverlässig zu speichern, parallele Entwicklungszweige zu verwalten und gemeinsam an Softwareprojekten zu arbeiten.&lt;br /&gt;
&lt;br /&gt;
Die wichtigsten Konzepte sind:&lt;br /&gt;
&lt;br /&gt;
* Repository&lt;br /&gt;
* Commit&lt;br /&gt;
* Branch&lt;br /&gt;
* Merge&lt;br /&gt;
* Rebase&lt;br /&gt;
* Remote&lt;br /&gt;
* Push und Pull&lt;br /&gt;
* Staging Area&lt;br /&gt;
&lt;br /&gt;
Durch seine verteilte Architektur, hohe Geschwindigkeit und starke Branch-Unterstützung ist Git heute ein Standardwerkzeug der professionellen Softwareentwicklung.&lt;br /&gt;
&lt;br /&gt;
== Literatur und Weblinks ==&lt;br /&gt;
&lt;br /&gt;
* Offizielle Git-Webseite: https://git-scm.com/&lt;br /&gt;
* Pro Git Book: https://git-scm.com/book/de/v2&lt;br /&gt;
* Git-Dokumentation: https://git-scm.com/docs&lt;br /&gt;
* GitHub Docs: https://docs.github.com/&lt;br /&gt;
* GitLab Docs: https://docs.gitlab.com/&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [[Versionsverwaltung]]&lt;br /&gt;
* [[Softwareentwicklung]]&lt;br /&gt;
* [[Repository]]&lt;br /&gt;
* [[Branch]]&lt;br /&gt;
* [[Merge]]&lt;br /&gt;
* [[Continuous Integration]]&lt;br /&gt;
* [[GitHub]]&lt;br /&gt;
* [[GitLab]]&lt;br /&gt;
* [[DevOps]]&lt;br /&gt;
* [[Quellcodeverwaltung]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Softwareentwicklung]]&lt;br /&gt;
[[Kategorie:Versionsverwaltung]]&lt;br /&gt;
[[Kategorie:Git]]&lt;/div&gt;</summary>
		<author><name>PhilKa</name></author>
	</entry>
</feed>