Grundlegende Git-Tipps zur effizienten Software-Entwicklung

Falke Stephan

30/04/2021

Git ist eines der essenziellsten Tools der Software-Entwicklung. Aufgrund seines enormen Funktionsumfangs gibt es jedoch auch einige Funktionen, die zwar sehr praktisch, aber nicht besonders bekannt sind. Einige nützliche Funktionen sollen hier hervorgehoben werden.

Damit Sie die Befehle beim Lesen problemlos testen können, wird explizit darauf hingewiesen, wenn Befehle schwerwiegende oder irreversible Änderungen an Ihrem Repository vornehmen. Auf der sicheren Seite sind Sie, wenn Sie alle Ihre Änderungen vorher pushen. Grundlegende Git-Kenntnisse werden im Folgenden angenommen.

1. Besseres Log

Der Befehl git log wird den meisten vertraut sein, aber er bietet auch erweiterte Optionen an, um die Informationen besser darzustellen. Mit der Option -​-graph erzeugt Git einen Graphen, der die Zusammenhänge der Commits und Branches visualisiert. Aufgrund der Menge an dargestellten Details ist dies noch nicht besonders übersichtlich. Hier hilft die Option -​-oneline, indem sie die Commits verkürzt darstellt und dazu jeweils eine Zeile verwendet. Nimmt man noch die Option -​-all hinzu, werden alle Commits angezeigt. So kann man sich mit git log -​-graph -​-oneline -​-all einen sehr guten Überblick verschaffen.
Die Aliase dieser StackOverflow-Antwort sind hierzu auch besonders empfehlenswert. Sie stellen den Verlauf der Branches mit allen wichtigen Informationen gut dar.

2. Der interaktive Modus

Vor dem Committen müssen die Änderungen ausgewählt werden, die im Commit enthalten sein soll. Häufig werden dazu die veränderten Dateien mit git add pfad/zur/datei.c hinzugefügt. Diese Methode hat allerdings ein paar Nachteile:

  • Der Dateipfad jeder Datei muss angegeben werden
  • Soll nur ein Teil der Änderungen in einer Datei hinzugefügt werden, dann müssen alle anderen Änderungen vorher rückgängig gemacht werden
  • Kleinigkeiten wie gelöschte oder hinzugefügte Leerzeilen werden ebenfalls übernommen und führen zu einer unübersichtlicheren Änderungshistorie

Deutlich effizienter ist die Verwendung von git add -p. Mit der Option -p präsentiert Git nach und nach veränderte Blöcke und man kann interaktiv entscheiden, welche davon man zum nächsten Commit hinzufügen will. Git zeigt im interaktiven Modus nach einer leeren Eingabe (Enter) an, welche Möglichkeiten es gibt. Bei git add -p sind dies die wichtigsten:

  • y – Aktuellen Block hinzufügen
  • n – Aktuellen Block nicht hinzufügen
  • q – Abbrechen (behält vorherige Änderungen allerdings bei)

Will man nur einen Teil der Änderungen eines Blocks hinzufügen, dann kann man den Block mit s weiter unterteilen oder, falls das nicht möglich ist, mit e Zeile für Zeile entscheiden. Außerdem kann man mit a und d für alle Blöcke der aktuellen Datei gleichzeitig entscheiden.
Neben den Vorteilen durch die gezieltere Wahl der Änderungen ermöglicht git add -p einem auch noch einmal, die Änderungen zu prüfen. Außerdem fallen hier Whitespace-Fehler besonders auf.

Möchte man noch nicht committete Änderungen gezielt verwerfen, dann bietet sich git checkout -p an. Der Befehl ähnelt git add -p in der Verwendung stark. Daher muss man allerdings auch auf eine Verwechslung aufpassen und man sollte sich bewusst sein, dass eine falsche Verwendung von git checkout -p zu irreversiblem Verlust der nicht committeten Änderungen führen kann. Dennoch ist der Befehl empfehlenswert.

3. Effizient committen

Ist man mit seinen ausgewählten Änderungen zufrieden, dann ist der nächste Schritt natürlich git commit. Git öffnet anschließend einen Texteditor, damit man die Commit-Nachricht angeben kann. Diesen Schritt kann man aber auch überspringen, indem man dem Befehl die Commit-Nachricht direkt übergibt: git commit -m ‚Dies ist eine Beispielnachricht‘.
Ergänzungen eines bereits erstellten Commits können mit git commit -​-amend nachgereicht werden. Mit diesem Befehl wird, anstatt einen neuen Commit zu erstellen, der Inhalt stattdessen einfach in den letzten Commit integriert. Er kann auch verwendet werden, um die Commit-Nachricht des letzten Commits zu verändern. Die Veränderung des letzten Commits ist allerdings nur empfehlenswert, wenn er noch nicht gepusht wurde.

4. Aufräumen mit git rebase

Vielen wird der Fehler bereits passiert sein, einen neuen Branch vom falschen Branch aus abzuzweigen. Natürlich kann man in dem Fall den neuen Branch löschen und an der richtigen Stelle neu erstellen, aber was, wenn man schon Änderungen committet hat? Mit git rebase [Zielcommit/-branch] kann man den aktuell ausgecheckten Branch auf den Zielcommit bzw. Zielbranch „verschieben“. Eventuell auftretende Konflikte muss man dann ebenso wie bei einem Merge lösen.
Nützlich ist dies auch, wenn man beispielsweise vor einiger Zeit einen Feature-Branch vom Master-Branch abgezweigt hat und nun sein Feature-Branch auf den neusten Stand des Master-Branchs updaten will. Zum einen kann man so mit dem neusten Stand arbeiten, zum anderen treten eventuelle Konflikte schon beim Rebasen und nicht erst hinterher beim Mergen auf, was die Arbeit der Person erleichtert, die den Branch mergen muss.

git rebase

Auch hier wird es allerdings schwierig, wenn der Branch bereits gepusht wurde. Mit -​-force kann der Branch nach dem Rebase zwar gepusht werden, aber das ist problematisch für alle anderen Personen, die sich schon auf den Branch verlassen. Daher sollte man dies nur machen, wenn man sich bewusst ist, welche Konsequenzen dies hat.
git rebase -i [Zielcommit/-branch] kann außerdem dazu verwendet werden, die Commits des aktuellen Branches zu bearbeiten. Der Befehl öffnet den für Git eingestellten Texteditor, listet die relevanten Commits auf und stellt eine Kurzzusammenfassung der Möglichkeiten dar. Unter anderem kann man hier die Commitnachrichten und Reihenfolge der Commits ändern sowie Commits vereinen oder entfernen, wodurch es natürlich wieder zu schwerwiegenden Änderungen am Repository kommen kann. Allerdings ist es schwierig, hier unabsichtlich Commits zu entfernen.

5. Rettung durch reflog

Sollten Sie einen Fehler mit Git gemacht haben, kann Sie eventuell der Befehl git reflog retten. Das reflog bzw. reference log enthält einige Informationen zu den zuvor ausgeführten Befehlen und kann unter anderem auch dazu verwendet werden, einen früheren Stand auszuchecken und somit wiederherzustellen. Hierbei gilt es zu beachten, dass das reflog nur die Änderungen am lokalen Repository enthält und regelmäßig alte Einträge gelöscht werden.
Folgendes Beispiel zeigt, wie man mit git reflog einen gelöschten Branch wiederherstellen kann. Bitte nicht nachmachen, da im Beispiel der master-Branch gelöscht wird und dies natürlich zu schwerwiegenden Änderungen führt. git reflog können Sie aber problemlos auch in Ihrem Repository ausführen, da es lediglich Informationen anzeigt.

$ git branch -D master #Nicht ausführen!
Deleted branch master (was 8f6505f).

$ git reflog
b776db8 (HEAD ->; feature_can) HEAD@{0}: commit: CAN: Fix init
db61c14 HEAD@{1}: commit: Add CAN Module
80a3258 HEAD@{2}: checkout: moving from 80a3258 to feature_can
80a3258 HEAD@{3}: checkout: moving from master to 80a3258
8f6505f HEAD@{4}: commit: Add build instructions to readme
d60b906 HEAD@{5}: commit: Add readme
80a3258 HEAD@{6}: commit (initial): Create environment

$ git checkout 8f6505f #Ursprünglich master
[...]

$ git checkout -b master
Switched to a new branch 'master'

6. Repository durchsuchen

Mit git grep kann man in den Dateien des Repositorys (genauer: ab dem aktuellen Ordner in getrackten Dateien) nach einem bestimmten Text suchen. Beispielsweise werden nach Eingabe des Befehls git grep ‚enthält‘ alle Vorkommnisse des Textes „enthält“ angezeigt. Mit der Option -n wird die Zeilennummer des Treffers ebenso dargestellt und mit -i wird Groß- und Kleinschreibung ignoriert. Regex-Ausdrücke sind als Suchbegriffe ebenso erlaubt.

git grep

Haben Sie Fragen oder weitere Tipps? Lassen Sie es uns im Kommentarbereich wissen!


Geschrieben von Falke Stephan

Falke Stephan arbeitet seit 2020 als Softwareentwickler bei MEDtech Ingenieur. Seine Aufgabengebiete umfassen unter anderem die Entwicklung von Medizingeräten basierend auf Embedded Linux.


Weitere Beiträge

  • 12/11/2024
  • Allgemein, Software, Testen, Tools

In sicherheitskritischen Softwareprojekten steht die Qualität der Software an erster Stelle. Besonders bei Klasse-C-Software, die nach strengen Normen wie IEC 62304 (Medizintechnik) zertifiziert werden muss, ist es essenziell, dass ...

Weiterlesen
  • 08/08/2024
  • Allgemein, Elektrostimulation, Software, Testen

Heutzutage sind Apps im Gesundheitsbereich sehr wichtig. Besonders Apps, die Daten von medizinischen Sensoren lesen und verarbeiten können, sind nützlich. Flutter ist ein Open-Source-Framework von Google, das sich hervorragend ...

Weiterlesen
  • 30/06/2024
  • Allgemein, Hardware, Software, Technik, Tools, Usability

KI – Was ist das denn überhaupt? Künstliche Intelligenz ist zurzeit in aller Munde, doch die wenigsten Menschen beschäftigen sich mit der Funktionsweise von künstlicher Intelligenz oder damit, was ...

Weiterlesen
Cookie-Übersicht

Die Internetseiten der MEDtech Ingenieur GmbH verwenden Cookies. Cookies sind Textdateien, welche über einen Internetbrowser auf einem Computersystem abgelegt und gespeichert werden.

Zahlreiche Internetseiten und Server verwenden Cookies. Viele Cookies enthalten eine sogenannte Cookie-ID. Eine Cookie-ID ist eine eindeutige Kennung des Cookies. Sie besteht aus einer Zeichenfolge, durch welche Internetseiten und Server dem konkreten Internetbrowser zugeordnet werden können, in dem das Cookie gespeichert wurde. Dies ermöglicht es den besuchten Internetseiten und Servern, den individuellen Browser der betroffenen Person von anderen Internetbrowsern, die andere Cookies enthalten, zu unterscheiden. Ein bestimmter Internetbrowser kann über die eindeutige Cookie-ID wiedererkannt und identifiziert werden.

Durch den Einsatz von Cookies kann die MEDtech Ingenieur GmbH den Nutzern dieser Internetseite nutzerfreundlichere Services bereitstellen, die ohne die Cookie-Setzung nicht möglich wären.

Mittels eines Cookies können die Informationen und Angebote auf unserer Internetseite im Sinne des Benutzers optimiert werden. Cookies ermöglichen uns, wie bereits erwähnt, die Benutzer unserer Internetseite wiederzuerkennen. Zweck dieser Wiedererkennung ist es, den Nutzern die Verwendung unserer Internetseite zu erleichtern. Der Benutzer einer Internetseite, die Cookies verwendet, muss beispielsweise nicht bei jedem Besuch der Internetseite erneut seine Zugangsdaten eingeben, weil dies von der Internetseite und dem auf dem Computersystem des Benutzers abgelegten Cookie übernommen wird.

Die betroffene Person kann die Setzung von Cookies durch unsere Internetseite jederzeit mittels einer entsprechenden Einstellung des genutzten Internetbrowsers verhindern und damit der Setzung von Cookies dauerhaft widersprechen. Ferner können bereits gesetzte Cookies jederzeit über einen Internetbrowser oder andere Softwareprogramme gelöscht werden. Dies ist in allen gängigen Internetbrowsern möglich. Deaktiviert die betroffene Person die Setzung von Cookies in dem genutzten Internetbrowser, sind unter Umständen nicht alle Funktionen unserer Internetseite vollumfänglich nutzbar.

Weitere Informationen erhalten Sie in unserer Datenschutzerklärung.

Unbedingt notwendige Cookies

Dieses Cookie wird benötigt, um Ihre Cookie-Einstellungen zu merken und weitere Hauptfunktionen zur Verfügung zu stellen

Um Ihnen eine Auskunft über Ihre gespeicherten personenbezogenen Daten hier (https://medtech-ingenieur.de/gespeicherte-daten-2/) geben zu können, benötigen wir einen Cookie, um Sie bei der Datenabfrage identifizieren zu können. Dieser Cookie muss aus Sicherheitsgründen deshalb aktiviert sein. Ein weiterer Cookie wird gesetzt, um diesen Banner nicht erneut anzeigen zu müssen.

Cookie-Name Beschreibung
PHPSESSID Name: PHP session
Anbieter:
Eigentümer der Webseite (MEDtech Ingenieur)
Zweck:
Wir benötigt, um Sie bei der Anfrage von personenbezogenen Daten identifizieren zu können. Das Cookie wird nur gesetzt, wenn Sie eine Anfrage hier (https://medtech-ingenieur.de/gespeicherte-daten-2/) stellen.
Laufzeit: Sitzungsende
Kategorie: Unbedingt notwendige Cookies
moove_gdpr_popup Name: Cookie-Box Einstellungen
Anbieter:
Eigentümer der Webseite (MEDtech Ingenieur)
Zweck:
Wird benötigt, um Ihre Cookie-Einstellungen zu speichern, um den Cookie-Banner nicht erneut anzeigen zu müssen.
Laufzeit: 1 Jahr
Kategorie: Unbedingt notwendige Cookies
comment_author_9c90e388e3e1be4a6c594fa6ac8a3eec
comment_author_email_9c90e388e3e1be4a6c594fa6ac8a3eec
comment_author_url_9c90e388e3e1be4a6c594fa6ac8a3eec
Name: Kommentar Einstellungen
Anbieter:
Eigentümer der Webseite (MEDtech Ingenieur)
Zweck:
Cookie wird angelegt, wenn Sie ein Kommentar auf MEDtech Ingenieur veröffentlichen wollen, um Sie als Autor identifizieren und den aktuellen Status Ihres Kommentars anzeigen zu können. Das Cookie enthält den angegebenen Namen. Das Cookie wird erst gesetzt, wenn Sie der Speicherung Ihrer personenbezogenen Daten zustimmen.
Laufzeit: 1 Jahr
Kategorie: Unbedingt notwendige Cookies
rmp-rate Name: RMP Rate
Anbieter: Eigentümer der Webseite (MEDtech Ingenieur)
Zweck: Cookie wird angelegt, wenn Sie eine Bewertung eines Blogbeitrags mithilfe des Sternebewertungssystems abgeben. Ihnen wird eine anonymisierte ID zugewiesen, um zu erkennen, ob Sie einen Artikel bereits bewertet haben oder nicht. Das Cookie wird nur verwendet, um zu verhindern, dass mehrfache Bewertung abgegeben werden und erst gesetzt, wenn Sie auf einen Stern klicken.
Laufzeit: 1 Jahr
Kategorie: Unbedingt notwendige Cookies
medtech-download-page Name: Download Page
Anbieter: Eigentümer der Webseite (MEDtech Ingenieur)
Zweck: Cookie wird angelegt, wenn Sie den Landing-Page Prozess erfolgreich durchlaufen haben. Dies geschieht nur, wenn Sie einen Content-Download von unserer Website anstreben.
Laufzeit: 1/2 Jahr
Kategorie: Unbedingt notwendige Cookies