7 häufigste Git-Fehler und wie Du sie einfach löst

Grade am Anfang kommt es bei vielen Neulingen gerne zu Fehlern. Das ist völlig normal, da Git, je nach Projektgröße sehr komplex werden kann. Ich möchte deinen Lernerfolg mit Git in diesem Artikel beschleunigen, indem ich dir die häufigsten 7 Git-Fehler genauer gesagt Git-Probleme zeige und wie du sie einfach lösen kannst.

Solltest du noch nicht mit Git angefangen haben, solltest du zunächst unser Git Tutorial durchlesen.

Es geht los mit den 7 häufigsten Git-Fehlern und den entsprechenden Lösungen:

1. Änderungen an lokalen Dateien verwerfen

Es kommt als Programmierer täglich vor, dass irgendwelche ungeahnten Fehler auftauchen. Um die Fehler schnell zu lösen, Fummeln wir wild am Code herum. Leider sind diese Code-Änderungen nicht immer optimal. Daher ist es hilfreich, die gemachten Änderungen schnell wieder rückgängig zu machen.

Mit dem Befehl "git checkout" setzt du die Dateien in ihren ursprünglichen Zustand zurück:

# Verzeichnis "meinCode" zurücksetzen
git checkout -- meinCode

2. Lokale Commits rückgängig machen

Du hast bereits vier neue Commits erstellt und merkst erst jetzt, dass einer dieser Commits einen großen Fehler enthält. Ups!

Keine Panik. Wenn du einen oder mehrere Commits rückgängig machen willst, kannst du den Befehl "git reset" benutzen. Der Befehl kennt dabei drei verschiedene Modi (soft, hard, mixed):

# die letzten vier Commits rückgängig machen, Änderungen behalten
git reset HEAD~4

# die letzten vier Commits rückgängig machen, Änderungen verwerfen
git reset --hard HEAD~4

Achtung: Der "hard"-Modus ist jedoch mit etwas Vorsicht zu genießen. Sobald du "git reset --hard" ausführst, wird der Working-Tree und der Index zurückgesetzt. Sämtliche Änderungen sind danach für immer verloren!

3. Datei aus Git entfernen, ohne sie komplett zu löschen

Es kommt häufig vor, dass du eine Datei in den Staging-Bereich hinzufügst (git add), die dort nicht hingehört. Du hast hier die Möglichkeit den Befehl "git rm" zu verwenden. Dieser entfernt die Datei jedoch auch von deinem Dateisystem.

Wenn du die Datei jedoch im Dateisystem behalten möchtest, kannst du sie besser mit "git reset <Dateiname>" aus dem Staging-Bereich entfernen. Füge die Datei im Anschluss der .gitignore hinzu, damit du sie in Zukunft nicht fälschlicherweise wieder in den Staging-Index packst. So geht's:

git reset Dateiname
echo Dateiname >> .gitignore

4. Commit-Nachricht nachträglich bearbeiten

Jedem Programmierer unterläuft mal ein Tippfehler bei einem Commit. Zum Glück lassen sich Commit-Nachrichten mit dem Befehl "git commit --amend" sehr leicht korrigieren. So geht's:

# Startet den Standard-Texteditor, um die Commit-Nachricht zu bearbeiten
git commit --amend 

# Setzt die neue Nachricht direkt
git commit --amend -m "Meine neue Commit-Nachricht"

5. Lokale Commits vor einem Push ändern

Im letzten Punkt hast du die Option "--amend" kennengelernt. Diese ist hilfreich, wenn du den letzten Commit ändern möchtest. Doch was, wenn der zu korrigierende Commit nicht der Letzte war? Hierfür kannst du "git rebase --interactive" verwenden.

Wichtig ist, dass du hier dein Remote (meist "origin") und den Branch-Namen angibst

git rebase --interactive origin branchName

Das Ausführen des obigen Befehls wird deinen Standard-Texteditor mit folgendem Text ausführen:

pick 9g2020f Neues Feature fertig 
pick 23js34cc Mein Commit 
# Rebase 9g2020f..23js34cc onto 9g2020f 
# 
# Commands: 
# p, pick = use commit 
# r, reword = Benutzte Commit, aber ändere die Commit-Nachricht 
# e, edit = Commit nutzen, aber "amend" stoppen 
# s, squash = Commit nutzen, aber mit letztem Commit verschmelzen 
# f, fixup = wie "squash", entfernt jedoch diese Commit-Nachricht aus der Historie 
# x, exec = Befehl ausführen (über die Kommandozeile) 
#
# These lines can be re-ordered; they are executed from top to bottom. 
# 
# If you remove a line here THAT COMMIT WILL BE LOST. 
# 
# However, if you remove everything, the rebase will be aborted. 
# 
# Note that empty commits are commented out

Oben siehst du eine Liste der lokalen Commits, gefolgt von einer Erklärung der verfügbaren Befehle. Wähle einfach den bzw. die jeweiligen Commits aus, den du aktualisieren möchtest. Ändere pick um in reword (oder kurz r), und du wirst zu einer neuen Ansicht geführt, wo du die Nachricht bearbeiten kannst.

Wie aus der obigen Auflistung ersichtlich ist, bieten interaktive Rebases jedoch viel mehr als einfaches Editieren von Commit-Nachrichten: du kannst Commits komplett entfernen, indem du sie aus der Liste löschst, sowie editieren, neu anordnen und squashen "kannst".

6. Gepushte Commits rückgängig machen

Ja, leider schaffen es auch fehlerhafte Commits gelegentlich in das Remote-Repository.

Dennoch ist dies kein Grund zur Verzweiflung, da Git eine einfache Lösung bietet, einzelne oder mehrere Commits rückgängig zu machen:

# Commit anhand von Commit-ID rückgängig machen
git revert 453fsdu2

# Vorletzten Commit rückgängig machen
git revert HEAD^ 

# Mehrere Commits rückgängig machen
git revert feature~4..feature~2

Für den Fall, dass du keine zusätzlichen Revert-Commits erstellen, sondern nur die notwendigen Änderungen am Working-Tree vornehmen möchtest, kannst du die Option --no-commit (kurz --n) verwenden:

# Letzten Commit rückgängig machen, aber keinen Revert Commit erstellen
git revert -n HEAD

7. Finde den Commit, der nach einem Merge einen Fehler verursacht

Den exakten Commit aufzuspüren, der nach einem großen Merge einen Fehler verursacht, kann ziemlich zeitaufwendig sein.

Glücklicherweise bietet Git eine gute binäre Suchfunktion mit dem Befehl "git bisect". Zuerst musst du das Set-up starten:

# Bisecting Session starten
git bisect start         

# Aktuelle Revision als "bad" markieren
git bisect bad

# Letzte bekannte gute Revision als "good" markieren
git bisect good revision

Danach wird Git automatisch einen Checkout für die Revision machen, die zwischen "Good" und "Bad" liegt. Führe deinen Code dann wieder aus. Markiere die Commits solange mit "bad" oder "good", bis du den entsprechenden Commit findest, der den Fehler erzeugt.

Bonus-Tipp: Alles andere hat versagt - So löst du das Problem

Bis jetzt haben wir viele Befehle und Tipps kennengelernt, die dabei helfen, häufige Fehler beim täglichen Umgang mit Git zu lösen.

Die meisten Probleme haben eine recht simple Lösung. Doch gibt es auch Vorkommnisse, die den großen "Hammer" benötigen. Hier hilft nur noch die Historie des jeweiligen Branches neu zu schreiben. In der Praxis kommt das häufig bei sensiblen Daten vor, die entfernt werden müssen. Das können mitunter Log-in-Daten von Kunden sein, die Aus versehen in ein öffentlich sichtbares Repository übertragen wurden. Hier muss schnell und sicher gehandelt werden. So geht's:

git filter-branch --force --index-filter \
  'git rm --cached --ignore-unmatch logindaten.txt' \
  --prune-empty --tag-name-filter cat -- --all

Durch den obigen Befehl wird die Datei "logindaten.txt" von jedem Branch und jedem Tag entfernt. Zusätzlich werden alle Commits entfernt, die durch die obige Operation leer wären.

Bitte sei mit dem filter-branch Befehl besonders vorsichtig, da die gesamte Historie des Repositories neu geschrieben wird. In einem laufenden Projekt kann das zu hohen Transaktionskosten führen und das gesamte Entwickler-Team bei der Arbeit stören.

Fazit zu den Git Problemen

Das war ein ausführlicher Überblick zu den 7 häufigsten Git-Problemen sowie -fehlern und deren Lösung. Du hast hier folgende Befehle kennengelernt:

  • git checkout
  • git reset
  • .gitignore
  • git commit --amend
  • git rebase --interactive
  • git revert
  • git bisect
  • git filter-branch

Ich hoffe, dass du einige der hier angesprochenen Tipps in deinen eigenen Projekten umsetzen kannst, um Git-Fehler in Zukunft schneller und mit weniger Kopfschmerzen zu lösen.

  • 8. September 2020
Click Here to Leave a Comment Below 0 comments

Leave a Reply: