Git; Code für eine ganze Funktion verschwand nach einer Zusammenführung

Lesezeit: 6 Minuten

Benutzer-Avatar
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 showWenn 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 😉

  • 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

Benutzer-Avatar
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.

  • Ich würde meinen rechten Arm für eine umfassende Testsuite hergeben, aber das scheint leider keine Option zu sein.

    – Vonsild

    9. Juli 2013 um 7:28 Uhr

  • Leider enthält diese Antwort keine Informationen über wie so etwas passiert. Wie können Zeilen hinzugefügt werden und dann vollständig verschwinden, ohne dass entsprechende Löschungen aufgezeichnet werden? Ein Kollege und ich haben heute etwas Ähnliches gesehen. Es schien durch eine schlechte Zusammenführung verursacht worden zu sein, aber es gibt keine Aufzeichnungen in der Geschichte darüber, wo und wann die Linien verschwunden sind.

    – Ryan Lundy

    1. März 2017 um 13:26 Uhr

  • Ja, der Verlust des gesamten Dateiverlaufs kann zu allerlei Verwirrung führen, da er überall verloren gehen kann, ohne dass Sie sich dessen jemals bewusst sind. Das Aufspüren kann in manchen Fällen Stunden dauern.

    – Jeremy Ray Brown

    29. August 2017 um 20:30 Uhr


Benutzer-Avatar
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]”.

  • Das Problem ist, dass es sich nicht um einen fehlenden Commit handelt. Es ist ein Fall einer bösen Verschmelzung. Wie es passiert ist, verstehe ich immer noch nicht, aber es ist passiert.

    – Vonsild

    9. Juli 2013 um 7:30 Uhr

  • Sie, mein Freund, haben mir den Arsch gerettet und mir den Glauben an den größeren Plan der Dinge zurückgegeben.

    – cmc

    6. Juni 2014 um 14:15 Uhr

  • git-reflog ist das lokale Aktivitätsprotokoll eines Repo-Benutzers. Wenn Sie versuchen, etwas zu finden, das benutzerübergreifend ist, ist reflog wahrscheinlich weniger relevant.

    – JAR.JAR.bohnen

    22. Juli 2014 um 11:12 Uhr

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

  • Danke, das hat sehr geholfen, die passenden Commits zu finden. EIN viel einfacher als halbieren. Es zeigte jedoch zwei, wo der Code hinzugefügt wurde, keinen, wo er gelöscht wurde. Immer noch ratlos.

    – Gringo Suave

    10. Januar 2019 um 1:27 Uhr


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.

Benutzer-Avatar
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.

  • Habe dies versucht, aber der Code, der beim Zusammenführen verschwunden ist, wird nicht als gelöscht mit diff angezeigt.

    – Gringo Suave

    10. Januar 2019 um 1:31 Uhr

  • @GringoSuave: Nachdem ich meine Antwort noch einmal gelesen hatte, dachte ich, dass das ‘..’ seltsame Auswirkungen haben könnte. Können Sie es mit der bearbeiteten Antwort versuchen?

    – LeGEC

    10. Januar 2019 um 8:45 Uhr

Benutzer-Avatar
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.

  • Habe dies versucht, aber der Code, der beim Zusammenführen verschwunden ist, wird nicht als gelöscht mit diff angezeigt.

    – Gringo Suave

    10. Januar 2019 um 1:31 Uhr

  • @GringoSuave: Nachdem ich meine Antwort noch einmal gelesen hatte, dachte ich, dass das ‘..’ seltsame Auswirkungen haben könnte. Können Sie es mit der bearbeiteten Antwort versuchen?

    – LeGEC

    10. Januar 2019 um 8:45 Uhr

1018030cookie-checkGit; Code für eine ganze Funktion verschwand nach einer Zusammenführung

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy