webentwicklung-frage-antwort-db.com.de

Holen Sie sich eine Liste aller Git-Commits, einschließlich der "verlorenen"

Nehmen wir an, ich habe eine Grafik wie diese:

A---B---C---D (master)
     \
      \-E---F (HEAD)

Wenn ich git log --all --oneline tue, werde ich alle sechs meiner Commits erhalten.

Aber wenn der Graph ist

A---B---C---D (master, HEAD)
     \
      \-E---F

Ich werde E und F nicht sehen. Kann ich Git bekommen, um mir alle Commits mitzuteilen, einschließlich derer auf Zweigen, die nicht genannt werden?

Vielen Dank

79
Amadan

Nicht besonders leicht - wenn Sie den Zeiger an der Spitze eines Astes verloren haben, ist es eher so, als würden Sie eine Nadel im Heuhaufen finden. Sie können alle Commits finden, die scheinbar nicht mehr referenziert zu sein scheinen - git fsck --unreachable erledigt dies für Sie - aber dies schließt Commits ein, die Sie nach einem git commit --amend weggeworfen haben Diese Commits sind wahrscheinlich viel zu viel Information, um durchzugehen.

Die flippante Antwort lautet also: Verliere nicht den Überblick über die Dinge, die dich interessieren. Ernsthafter, die Reflogs enthalten Verweise auf alle Commits, die du in den letzten 60 Tagen standardmäßig verwendet hast. Noch wichtiger ist, dass sie einen Zusammenhang darüber geben, was diese Commits are sind.

46
araqnid

Versuchen:

git log --reflog

welche alle git-Commits auflistet, indem sie vorgibt, dass alle Objekte, die durch reflogs (git reflog) erwähnt werden, in der Befehlszeile als <commit> aufgeführt sind.

50
kenorb

Wenn ich dieses Problem angehe, verwende ich den folgenden Befehl:

git reflog |  awk '{ print $1 }' | xargs gitk

Auf diese Weise kann ich die jüngsten Commits visualisieren, die ohne Kopf sind.

Ich habe dies in einen Skript-Helfer namens ~/bin/git-reflog-gitk eingepackt.

42
Kieran

Wie @Kierans Antwort, aber für die Konsole: git log --oneline --all --graph --decorate $(git reflog | awk '{print $1}')

19
Florian Fida

Ich hatte Glück, das Commit wiederherzustellen, indem ich mir den Reflog ansah, der sich unter .git/logs/HEAD befand.

Ich musste dann bis zum Ende der Datei rollen und fand das Commit, das ich gerade verloren habe.

5
GameScripting

Wie löse ich dieses Problem? Verwenden Sie git fsck und loggen Sie sich ein!

Erstellen Sie zuerst eine Datei mit verlorenen (unerreichbaren) Commits und Blobs. (HINWEIS: Wenn Sie etwas wie git gc getan haben, werden alle diese Commits nicht gesammelt, und Sie werden sie hier nicht finden!)

$git fsck --lost-found > lost_found.commits

Das gibt Ihnen eine Datei wie diese:

dangling Commit dec2c5e72a81ef06963397a49c4b068540fc0dc3
baumelnder Fleck f8c2579e6cbfe022f08345fa7553feb08d60a975
baumelnder Fleck 0eb3e86dc112332ceadf9bc826c49bd371acc194
baumelnder Fleck 11cbd8eba79e01f4fd7f496b1750953146a09502
Dangling Commit 18733e44097d2c7a800650cea442febc5344f9b3
baumelnder Fleck 1e53a5cdb3ecdde27081ec6e8b31e4070106ee05 

Sie können diese Datei dann mit Ihrem bevorzugten Texteditor öffnen, um die Commit-/Blog-Hashes von dort zu kopieren. (* Husten * Vim-Makros funktionieren gut für diese * Husten *)

Jetzt können Sie sich mit git log --oneline <commit hash> von diesem Commit zurückmelden. Alternativ sollten Gitk, Tig oder ein anderer Git-Viewer funktionieren.

Wenn Sie in Ihrem Fall den Hash für Commit F finden, zeigt Ihnen das Protokoll so etwas, 

A---B---E---F

Schnell und einfach! Nun können Sie den Kontext hinter all diesen hängenden Commits finden.

P.S. Ja, ich weiß, späte Post, aber naja, jemand könnte es hier finden und es nützlich finden. (Meistens wahrscheinlich in 6 Monaten, wenn ich das nochmal google)

5
bsimmons

Wir werden git log manchmal ist es nicht gut, alle Commits-Details zu erhalten, also, um dies zu sehen ...

Für Mac: Holen Sie sich in Ihr Git-Projekt und geben Sie Folgendes ein:

$ nano .git/logs/HEAD

um alle Commits darin zu sehen, oder:

$ gedit .git/logs/HEAD

um Sie alle zu sehen, in dem,

sie können dann in einem Ihrer bevorzugten Browser bearbeiten.

4
Vinod Joshi

Wenn Sie die Git Extensions-GUI verwenden, können Sie eine grafische Visualisierung von Dangling-Commits anzeigen, indem Sie "View -> Show reflog reference" .. auswählen. Dies zeigt Dangling-Commits wie alle anderen referenzierten. Auf diese Weise ist es viel einfacher zu finden, wonach Sie suchen.

Siehe dieses Bild zur Demonstration. Die Commits C2, C3, C4 und C5 im Bild sind baumelnd, aber immer noch sichtbar.

1
Zdovc

@bsimmons

git fsck --lost-found | grep commit

Dann erstellen Sie für jeden einen Zweig: 

$ git fsck --lost-found | grep commit
Checking object directories: 100% (256/256), done.
dangling commit 2806a32af04d1bbd7803fb899071fcf247a2b9b0
dangling commit 6d0e49efd0c1a4b5bea1235c6286f0b64c4c8de1
dangling commit 91ca9b2482a96b20dc31d2af4818d69606a229d4

$ git branch  branch_2806a3 2806a3
$ git branch  branch_6d0e49 6d0e49
$ git branch  branch_91ca9b 91ca9b

Viele Werkzeuge zeigen Ihnen nun eine grafische Darstellung dieser verlorenen Commits.

1
yakoda

Was mein Leben gerettet hat, war der folgende Befehl:

git reflog

Dort finden Sie einen Bildschirm mit Verlaufs-Commits, mit denen Sie so vorgehen können:

 enter image description here 

Zu diesem Zeitpunkt müssen Sie nur den [email protected]{X} finden, den Sie benötigen, einen temporären Zweig erstellen und wie folgt dorthin wechseln:

git checkout -b temp_branch [email protected]{X}

Auf diese Weise haben Sie eine temporäre Verzweigung mit Ihrem verlorenen Commit, ohne Ihr Git-Repository neu zu gründen oder noch mehr zu beschädigen.

Hoffe das hilft...

0
Sonhja