Kann ich git fsck dazu bringen, Commit-Namen anzuzeigen?

8

Ich habe eine gelöschte Festschreibung unter vielen gelöschten Festschreibungen, die ich wiederherstellen möchte. Ich habe von dem Befehl fsck --lost-found erfahren. Großartig!

Das Problem ist, dass ich über hundert unerlaubte Commit-Anweisungen mit sehr wenigen Informationen habe.

%Vor%

Wenn es den Commit-Namen mit dem sha einfach rausschmeißen könnte, wäre das eine große Hilfe. So wie es ist, muss ich die Git-Show auf jedem einzeln ausführen, um das richtige Commit zu finden. Gibt es einen einfacheren Weg?

    
IcedDante 10.06.2015, 15:20
quelle

2 Antworten

3

Das ist keine Antwort, die das mit git fsck löst, sondern etwas, das in dieser Situation funktionieren könnte.

git reflog gibt eine Liste vergangener HEADs im Repository aus. Wenn Sie beispielsweise von einem Branch-Master zu einem Zweig devel wechseln, wird ein Reflog-Eintrag mit dem HEAD des Master-Zweiges erzeugt.

Wenn also das Commit zu einem bestimmten Zeitpunkt Teil eines Branches war, sind die Chancen groß, dass Sie es mithilfe einer Kombination aus git reflog , git log und ein bisschen Handarbeit wiederherstellen können.

Es gibt einige Fälle:

  1. Starten Sie git reflog und blättern Sie durch. Wenn es die Commit-Nachricht anzeigt, nach der Sie gesucht haben, ist das großartig! Kopieren Sie die Commit-ID und verwenden Sie sie für beliebige Zwecke (z. B. git cherry-pick oder speichern Sie sie in einer Verzweigung mit git branch save-my-commit commitid ).

  2. Das Commit ist nicht direkt in git reflog , aber Sie sehen ein Commit, das Sie nach Commit gemacht haben, das Sie finden möchten (und bevor Sie es löschen). In diesem Fall verwenden Sie die Commit-ID der Commit, die Sie anschließend in git reflog erstellt haben, und übergeben Sie sie als Argument an git log : git log commitid . Blättern Sie durch die Ausgabe und sehen Sie, ob Sie Ihren Commit finden können. Verwenden Sie die Commit-ID wie in Fall 1.

  3. Das Commit ist nicht direkt in git reflog und Sie finden kein Commit, von dem Sie wissen, dass Sie nach dem Commit, das Sie gelöscht haben, und vor dem Löschen gemacht haben .

    Dies ist der langwierigste Fall, in welchem ​​Fall es leichter ist, die anderen Prozesse hier zu durchlaufen. Ich bin mir nicht sicher, ob sie tatsächlich als dangling commits aufgelistet werden, also ist es einen Versuch wert, wenn du deinen commit nicht mit git fsck finden kannst.

    Gehen Sie alle Einträge in git reflog durch und verwenden Sie die Commit-IDs als Argument für git log , wie in Fall 2 beschrieben. Versuchen Sie, das Commit zu finden, nach dem Sie suchen.

Viel Glück!

    
Jonas Wielicki 10.06.2015, 15:51
quelle
8

Dies funktioniert auf Linux und Mac:

%Vor%

Ich bin mir nicht sicher, ob Sie in der Windows-Git-Shell grep und xargs haben.

Erläuterung:

  • git fsck findet die Daten
  • grep reduziert das auf nur die dangling commits
  • cut lässt nur die Commit-ID
  • übrig
  • xargs führt den Befehl git show --stat mit den IDs
  • aus

[EDIT] Dieser Befehl wurde für Fälle, in denen mehrere dangling-Commits auftreten, korrigiert.

    
Aaron Digulla 10.06.2015 15:35
quelle

Tags und Links