
Vonsild
Mein Kollege hat vor einiger Zeit eine Änderung vorgenommen – eine neue Funktion eingeführt – und das (erfolgreich) an Git übergeben. Jetzt ist diese Funktion jedoch verschwunden.
Verwenden git log --reverse
Ich habe es geschafft, den letzten Commit zu finden, bei dem diese Funktion noch im Code war (48d60a03). Der nächste (e6f28bfd) Commit (bei dem die fragliche Funktion verschwunden ist) ist eine Zusammenführung (von 14158e1), aber git show
Wenn Sie eines davon verwenden, wird der fehlende Code nicht gelöscht.
Mit anderen Worten, Code ist während einer Zusammenführung verschwunden, ohne dass er in einem der zusammenzuführenden Zweige gelöscht wurde.
Die Suche nach Stack Overflow für ein paar Stunden führt mich zu dem Schluss, dass es sich um einen manuellen Fehler während einer Konfliktlösung handeln muss (habe ich das richtig verstanden?). So sei es, das passiert. Die Frage ist – wie bekomme ich diesen Code zurück? Gibt es eine andere Möglichkeit, als einen neuen Commit mit dem fehlenden Code zu erstellen?
Verwandte Frage; kann ich irgendwie herausfinden, ob es noch andere fälle gibt, in denen so etwas auf wiedersehen geht? Ich mache mir etwas Sorgen 😉

Schleis
Da Ihr Verlauf bereits gepusht wurde, ist der beste Weg, einen neuen Commit durchzuführen. Andernfalls laufen Sie Gefahr, anderen Code zu verlieren und die Repos aller zu vermasseln.
Da Sie wissen, wo der Commit zuletzt die Funktion hatte, können Sie das git checkout 48d60a03 -- <name of file with function>
. Dann können Sie die alte/neue Datei mit der Funktion übergeben.
Da wahrscheinlich weitere Änderungen in der Datei vorhanden sind, werden Sie dies wahrscheinlich tun wollen git reset
um die Datei aus der Staging-Umgebung zu entfernen und zu verwenden git add -p
um nur die Änderungen für die gesuchte Funktion hinzuzufügen.
Um dies zu verhindern, empfehle ich, sich eine umfassende Testsuite zu besorgen, die Sie nach Abschluss einer Zusammenführung ausführen können. Dies kann dazu beitragen, die Wahrscheinlichkeit zu minimieren, dass Code verloren geht, wenn Tests fehlschlagen.

Alexakarpov
Änderungen, die zu einem bestimmten Zeitpunkt festgeschrieben wurden, können nur schwer vollständig verloren gehen. Versuchen Sie, „git reflog“ auszuführen, und prüfen Sie, ob Sie den verlorenen Commit erkennen können. Dann können Sie es mit dem aktuellen Zweig zusammenführen, indem Sie “git merge [SHA-1 hash value of your lost commit]”.
Wenn Sie einen identifizierbaren Abschnitt des Codes kennen, der verloren gegangen ist, können Sie möglicherweise die genaue Zusammenführung finden, durch die Ihr Code verloren gegangen ist, indem Sie verwenden git log -G regexToSearchFor -m --patch
-G <regex>
weist Git an, „Nach Unterschieden zu suchen, deren Patch-Text hinzugefügte/entfernte Zeilen enthält, die übereinstimmen <regex>
“
-m
weist Git an, Merge-Commits einzuschließen
--patch
weist Git an, ein Diff von allem zu zeigen, was es findet
Verwandte Frage; kann ich irgendwie herausfinden, ob es noch andere fälle gibt, in denen so etwas auf wiedersehen geht? Ich mache mir etwas Sorgen 😉
Versuchen git was hat sich geändert. Zum Beispiel,
git whatchanged --since="2 weeks ago" -- gitk
Zeigen Sie die Änderungen während der letzten zwei Wochen an der Datei gitk an.

LeGEC
Anscheinend (siehe diese Frage), git show
ist nicht das richtige Werkzeug, um einen klaren Überblick über die Änderungen zu haben, die durch einen Merge-Commit eingeführt werden.
Verwenden git diff
. Der Merge-Commit hat zwei Eltern:
* 8ac6131 (M) Merge branch 'B'
|\
| * 5a53959 (B) two
|
* 7cb5a06 (A) one
Verwenden git diff A M
und git diff B M
, um die Unterschiede zwischen dem Merge-Commit und einem seiner übergeordneten Elemente anzuzeigen. Sie sollten dort Ihre fehlende Funktion sehen.

Peter Mortensen
Es stellte sich heraus, dass ich mir zwei verschiedene Ordner angesehen habe (beide auf Master) und vergessen habe, die neuesten Änderungen in einen von ihnen zu ziehen.
10180300cookie-checkGit; Code für eine ganze Funktion verschwand nach einer Zusammenführungyes
Beachten Sie, dass
git show
auf einem Merge-Commit zeigt nur Änderungen an, die sich in keinem der beiden Zweige widerspiegeln, z. B. wenn Sie manuell zusätzliche Änderungen im Merge-Commit hinzufügen oder Konflikte lösen. Wenn dieser Code wirklich im Merge-Commit verschwunden ist, dann ist es im anderen Zweig passiert.– stupsen
8. Juli 2013 um 13:05 Uhr
@poke: Eine andere Möglichkeit ist, dass es einen Zusammenführungskonflikt mit dieser Funktion gab und jemand gerade entschieden hat, dass sein Code der beste ist, wodurch die Funktion gelöscht wird, die jetzt fehlt.
– Arjan
8. Juli 2013 um 13:11 Uhr
@Arjan Änderungen, die in einem Zusammenführungskonflikt aufgetreten sind, sollten im Unterschied von angezeigt werden
git show
.– stupsen
8. Juli 2013 um 13:14 Uhr
git halbieren ist ein schönerer Weg, um den Beleidiger des Commit zu finden, anstatt selbst den Verlauf durchsuchen zu müssen.
– Dylan Kali
5. Dezember 2015 um 21:58 Uhr
@Kyralessa Wir verwenden SourceTree und das scheint uns zu passieren. Während der Zusammenführung mit –no-commit zur Überprüfung der Zusammenführung sehen die Leute Dateien, die sie nicht geändert haben, und machen sie unstaging. Irgendeine Idee, ob es eine Möglichkeit gibt, zu erkennen, wann das passiert?
– Marie
14. Juni 2017 um 19:56 Uhr