Heute habe ich festgestellt, dass in meinem Git-Repository Code fehlt. Ich kannte einige der fehlenden Texte und die Datei, in der sie sich befanden, also habe ich sie verwendet git log -S'missingtext' /path/to/file
.
Das einzige, was zurückkam, war das Commit, in dem ich die Zeile mit dem fehlenden Text hinzufügte. Der Text war in HEAD nicht vorhanden, und das Commit, das ihn hinzugefügt hat, war in meinem Zweig vorhanden. Daher wusste ich, dass einer der Commits in der Geschichte meines Zweigs ihn entfernt haben muss, aber er wurde nicht angezeigt.
Nach einigen manuellen Suchen stellte sich heraus, dass die Zeile versehentlich entfernt wurde, während ein Konflikt für eine Zusammenführung gelöst wurde. Also frage ich mich:
- Ist dies der Grund, warum pickaxe das Commit, das die Zeile gelöscht hat, nicht finden konnte?
- Wie hätte ich herausfinden können, wo "fehlender Text" gelöscht wurde, ohne den Verlauf manuell zu durchsuchen?
Jeder Einblick in # 1 wäre großartig (ich nahm an, das git log -S
würde mir meine Antwort geben), aber meine eigentliche Frage ist # 2, da ich dies in Zukunft vermeiden möchte.
git log -p
und/missingtext
während inless
ist ein schneller und schmutziger Weg, dies zu tun.Antworten:
git log
Standardmäßig wird kein Unterschied für Merge-Commits angezeigt. Die-c
oder--cc
Flags sollten den Trick machen:git log -c -S'missingtext' /path/to/file
Weitere Diskussion / Erklärung finden Sie hier .
quelle
git log -c -S'missingtext' -- /path/to/file
./path/to/file
und einfach ausführengit log -c -S'missingtext'
Auf Super User gibt es eine gute Antwort darauf: Git: Wie finde ich, welches Commit eine Zeile gelöscht hat?
Dies zeigt für jede Zeile das letzte Commit an, bei dem die Zeile vorhanden war - sagen wir Hash 0123456789. Das nächste Commit, das folgt, ist dasjenige, das es entfernt hat. Verwenden Sie
git log
und suchen Sie nach Hash 0123456789 und dann seinem Nachfolger Commit.quelle
Schneller und schmutziger Weg Nr. 2 - Verwenden Sie eine for-Schleife.
Dies schließt alle Änderungen beim Zusammenführen ein, da das Basis-Commit für das Diff explizit angegeben wird. Ich habe
git log -c -S...
mir das ausgedacht, weil ich eine Menge falsch positiver Ergebnisse erhalten habe. Wenn ich im erstengit log
Befehl einen Dateipfad angegeben habe, wurde das gesuchte Commit übersprungen.Da dies eine Weile dauern kann, können Sie
-n
imgit log
Befehl angeben oder ein&& break
am Ende der Schleife einfügen, wenn Sie nur 1 Ergebnis benötigen.quelle