Finden Sie heraus, wann die Zeile gelöscht wurde

74

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:

  1. Ist dies der Grund, warum pickaxe das Commit, das die Zeile gelöscht hat, nicht finden konnte?
  2. 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 -Swürde mir meine Antwort geben), aber meine eigentliche Frage ist # 2, da ich dies in Zukunft vermeiden möchte.

matthewwithanm
quelle
7
git log -pund /missingtextwährend in lessist ein schneller und schmutziger Weg, dies zu tun.
Nneonneo
1
Mögliches Duplikat von Wie kann ich eine gelöschte Zeile "beschuldigen"
hypehuman

Antworten:

98

git logStandardmäßig wird kein Unterschied für Merge-Commits angezeigt. Die -coder --ccFlags sollten den Trick machen:

git log -c -S'missingtext' /path/to/file

Weitere Diskussion / Erklärung finden Sie hier .

Brief zwei
quelle
2
Wenn Sie herausfinden möchten, wann eine Zeile aus einer gelöschten Datei entfernt wurde, können Sie verwenden git log -c -S'missingtext' -- /path/to/file.
Jonathan
3
Wenn Sie nicht wissen, welche Datei den fehlenden Text enthielt, können Sie das weglassen /path/to/fileund einfach ausführengit log -c -S'missingtext'
Aryeh Beitz
1
Unter Windows musste ich git log -c -S "fehlender Text" / path / to / file
ausführen
12

Auf Super User gibt es eine gute Antwort darauf: Git: Wie finde ich, welches Commit eine Zeile gelöscht hat?

git blame --reverse START.. file.ext

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 logund suchen Sie nach Hash 0123456789 und dann seinem Nachfolger Commit.

James
quelle
3

Schneller und schmutziger Weg Nr. 2 - Verwenden Sie eine for-Schleife.

for commit in $(git log --pretty='%H'); do
    git diff -U0 --ignore-space-change "$commit^" "$commit" | grep '^-.*missingtext' > /dev/null && echo "$commit"
done

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 ersten git logBefehl einen Dateipfad angegeben habe, wurde das gesuchte Commit übersprungen.

Da dies eine Weile dauern kann, können Sie -nim git logBefehl angeben oder ein && breakam Ende der Schleife einfügen, wenn Sie nur 1 Ergebnis benötigen.

Wolverdude
quelle