Das macht mich verrückt.
Wie finde ich gelöschten Code?
Am Ende fand ich heraus, wo es damit erstellt wurde:
$ git log --pretty=oneline -S'some code'
Und das ist gut genug, aber ich war auch neugierig zu finden, wo es gelöscht wurde, und bisher keine Würfel.
Zuerst habe ich versucht git diff HEAD..HEAD^|grep 'some code'
, den Bereich jedes Mal zu erweitern, bis ich die Linien gefunden habe, in denen er entfernt wurde. Schön, also nimm an, ich habe es in Reichweite gefunden HEAD^^..HEAD^^^
, dann tue ich es git show HEAD^^^
und git show HEAD^^
mit grep
, aber der Code ist nirgends zu finden!
Dann habe ich ein bisschen nachgelesen git bisect
, und sicher gibt es mir eine einzige Revision, in der der Täter sein soll ... Wieder git show rev|grep 'some code'
kommt leer ...
Was zum? Was mache ich falsch?
Vielen Dank!
log
, sollte es inshow
... sichtbar sein, oder? Oder vielleicht verstehe ich die Frage falsch.Antworten:
Hmph, arbeitet für mich:
Oder meinst du das nicht?
quelle
git log -SWorld
das die Unterschiede nicht anzeigt. Ich vermute (habe es nicht ausprobiert), dass Sie mit dem letzten Befehlgit show 00f3fd0134d0d54aafbb9d959666efc5fd492b4f | grep World
das Verhalten erhalten würden, nach dem Sie suchen.git log -S<string>
erledigt den Job, aber wenn Sie komplexere Suchvorgänge durchführen müssen, können Sie verwendengit log -G<regex>
.Aus dem
man
:quelle
Ich habe Ihre Frage gefunden, als ich selbst verrückt geworden bin, und bisher war keine Antwort ausreichend. Ich habe einen Weg gefunden, um das spezifische Commit zu finden, aber es wird nur angezeigt, wenn zwischen diesen Commits unterschieden wird. Ich kann nicht erklären, warum Git so funktioniert, aber ich werde meine Ergebnisse näher erläutern:
Problem erklärt
Mit '-S' oder '-G' können wir nur finden, wo es hinzugefügt und nicht entfernt wurde. Um näher darauf einzugehen:
$ git log --format="%H" -S"127.0.124.1" 857aa361293abbb351d6d6becaa55ec011aebc93 $ git show 857aa361293abbb351d6d6becaa55ec011aebc93 | grep "127.0.124.1" # remove grep to see full diff + return "127.0.124.1", nil
Schritt für Schritt
Ich habe die Idee von miku86 auf dev.to . Zuerst versuchen wir, das letzte Commit zu finden, bei dem unsere Zeichenfolge vorhanden war:
$ git --no-pager grep "127.0.124.1" $(git rev-list --all) # | head -n1 | cut -d: -f1 # uncomment to only show the hash of the first one ba0b2d348f4e33857c96acf5a6231cf9d89ddb1b:some/file.go: return "127.0.124.1" 0d19a98d6434da0b4b5cc2bac190b9b1de36d992:some/file.go: return "127.0.124.1" 84274c5712bacbbee1dca5567cef77a2b6f356d2:some/file.go: return "127.0.124.1" 42e692643ff8a5dce7a89e985062b3d38c60fcc0:some/file.go: return "127.0.124.1"
Das Ergebnis
ba0b2d348f4e33857c96acf5a6231cf9d89ddb1b
ist unser gesuchtes Commit. Als nächstes versuchen wir, das folgende Commit bis HEAD zu finden:$ git rev-list ba0b2d348f4e33857c96acf5a6231cf9d89ddb1b.. # | tail -n1 # uncomment to only show the last one [...] c82d040f7be2f8955075655843400a36ceb75303 aa0568b543db57564770d73e736aaf50fd749fb4 dde61dae0cf648e7f4dd8a5c194bcf9be1745793
Das ist
dde61dae0cf648e7f4dd8a5c194bcf9be1745793
, da dies der letzte in dieser Liste ist, den wir suchen.Das heißt also,
dde61dae0cf648e7f4dd8a5c194bcf9be1745793
sollte diese Entfernung enthalten sein?$ git show dde61dae0cf648e7f4dd8a5c194bcf9be1745793 | grep "127.0.124.1" # remove grep to see full diff #<no output>
Nein?!? Nun, was ist dann der Unterschied zu unserem ersten gefundenen Commit?
$ git diff ba0b2d348f4e33857c96acf5a6231cf9d89ddb1b..dde61dae0cf648e7f4dd8a5c194bcf9be1745793 | grep "127.0.124.1" # remove grep to see full diff - return "127.0.124.1"
Hier haben wir es gefunden. Das ist seltsam. Aber da wir einen Unterschied zwischen Commits verwenden, habe ich einen Fehler gemacht und es gibt andere Commits dazwischen?
$ git log --pretty=oneline ba0b2d348f4e33857c96acf5a6231cf9d89ddb1b..dde61dae0cf648e7f4dd8a5c194bcf9be1745793 dde61dae0cf648e7f4dd8a5c194bcf9be1745793 network interface
Nein, wir scheinen keinen Fehler gemacht zu haben. Das ist seltsam. Aber ja, so weit bin ich gekommen, um die Stelle zu finden, an der die Saite verschwunden ist.
zusätzlich
Ich kann bestätigen,
git bisect
dass diesdde61dae0cf648e7f4dd8a5c194bcf9be1745793
das Commit ist, nach dem ich gesucht habe.# bisecting a while... $ git bisect bad dde61dae0cf648e7f4dd8a5c194bcf9be1745793 is the first bad commit commit dde61dae0cf648e7f4dd8a5c194bcf9be1745793 Author: ... Date: Fri Oct 18 11:04:26 2019 +0200 network interface :100644 100644 242e81c363c2c7069efb018821821553b98f2c97 416c27f5351a9d92a6914b34846c6de51d83dd0d M go.mod :040000 040000 715c3ab5b3f4579d8054618f1e11fc05fb425324 e6731408a1ac1ff0428128ccbb1fbfaad4c789ab M network [...]
quelle
git --no-pager grep "127.0.124.1" $(git rev-list --all)
nur funktioniert, wenn Sie eine relativ kleine Anzahl von Commits haben, andernfalls haben Sie einen Bash-Fehler 'Argumentliste zu lang'