Eine Datei aus der git-Historie ausgraben…

Versionskontrollsysteme benutzt man bekanntlich, um die vorgenommenen Änderungen an den Dateien nachvollziehen und bei Bedarf zurückholen zu können. Wenn man das dann tatsächlich mal machen muss, stellt man fest, dass der Weg dahin gar nicht so einfach ist und es diverse unterschiedliche Herangehensweisen dafür gibt.

Bei Github hat man sogar einen Longread für die unterschiedlichen Situationen und Wege dafür verfasst (»How to undo (almost) anything with Git«). Und bei Stack Overflow findet man eine schöne Diskussion mit hervorragend erklärten Wegen (»How to revert a Git repository to a previous commit«).

Als einfachster Weg für den Fall »ich habe an einer Datei vor 47 Commits was geändert, war aber Mist und jetzt brauche ich mal den alten Stand aus genau einer Datei« hat sich in der Praxis die folgende Vorgehensweise bewährt:

Zunächst muss man wissen, in welchen Commits die Datei überhaupt geändert wurde. Das kann man mit git log –follow– herausfinden:

  git log --follow -- app/views/products/_channelproducts_form.html.haml

Das Ergebnis ist eine Liste von Commits, in der die Datei verändert wurde. Der Commit ist der, den wir brauchen:

 commit 2918261…
 Author: Ralf G… <…>
 Date:   Tue Dec 4 14:40:32 2018 +0100
    Umbau der Produktform…

Wenn man jetzt einfach den Commit mit git checkout 2918261 wieder auscheckt, befindet man sich in einem Zustand des »detached HEAD«, man ist also in keiner Branche mehr. Man kann dem zwar mit git checkout master wieder entfliehen. Gerade für Menschen, die das nicht so oft machen, ist die Gefahr groß, durch Änderungen und Checkouts ein kleines Durcheinander zu produzieren.

Der sichere Weg ist das Auschecken des Commits in eine neue Branche:

  git checkout -b alte_produkt_form 2918261

Die Branche alte_produkt_form befindet sich nun auf dem Stand des Commits 2918261. Man kann in dieser in aller Ruhe rummachen, ohne die anderen Branches anzurühren.

Wenn man fertig ist und gefunden hat was man braucht, kann man sich die alte Datei über verschiedene Wege (gute alte Zwischenablage oder Stash) in seinen Master übernehmen und den alten Stand dort als neuen Commit einchecken. Was die Änderung dann im Log deutlich leichter nachvollziehbar macht als ein Löschen des Commits mit anschließendem Rebase.

git

Autor: