Wie kann ich feststellen, warum ein Git-Merge einige Zeilen Code gelöscht hat?

8

Wir hatten eine Freigabe und das fragliche Commit (daf7110) war in der Geschichte, die zurück zum Master zusammengeführt wurde. An diesem Punkt (85a13270) hat der Master die Codezeilen, die von daf7110 hinzugefügt wurden.

Als einer unserer Entwickler master in seine Zweigstelle (dev-branch) fusionierte, verschwanden die Codezeilen. Sie existierten nie in der Geschichte der Entwicklerseite der Zusammenführung. Ich habe das verifiziert mit:

%Vor%

Also:

  1. Der Code existierte vor der Zusammenführung nie auf dem Dev-Zweig.
  2. Es war auf Master, seit "git merge-base c513d2 85a13270"
  3. hinzugefügt

Wie kann ich detailliertere Informationen darüber erhalten, warum die Mergellogik von git entschieden hat, dass der Code die Zusammenführung nicht überleben sollte? Oder gibt es einen anderen Grund, warum mein Commit diese Zusammenführung nicht überstanden hätte?

    
Ryan Olson 12.04.2012, 01:18
quelle

2 Antworten

11

Ich weiß nicht, wieso das passieren würde, aber ich kann ein paar Tipps zum Debuggen geben.

Zuerst würde ich sicherstellen, dass Sie keine merkwürdigen Einstellungen haben. Führen Sie einen neuen Klon eines Repos mit diesen beiden Zweigen in einem Konto ohne Git-Konfiguration aus. Versuchen Sie eine Zusammenführung. Kommt es immer noch vor? Wenn nicht, dann überprüfe deine Einstellungen, ob etwas Ungewöhnliches passiert. Vor allem würde ich irgendwelche neuen Einstellungen misstrauisch machen. Versuchen Sie auch, die Zusammenführung mit --no-rerere-autoupdate durchzuführen, um zu sehen, ob die fraglichen Zeilen noch fallen.

Danach würde ich beginnen, indem ich die maximale Ausführlichkeit für Ihre Zusammenführung einschalte und versuche, die Zusammenführung erneut durchzuführen:

%Vor%

Dies gibt Ihnen weitere Informationen zu den Entscheidungen, die der Merge-Prozess getroffen hat.

Wenn dies nicht zu einem nützlichen Ergebnis führt, können Sie auch versuchen, festzustellen, ob dies mit unterschiedlichen Zusammenführungsstrategien oder mit unterschiedlichen Optionen für die rekursive Standardzusammenführungsstrategie geschieht. Probieren Sie git merge -s resolve aus, um eine einfachere, aber dümmere Zusammenführungsstrategie auszuprobieren. Hast du immer noch das Problem? Wie wäre es mit einer anderen Option für die rekursive Strategie, z. B. git merge -s recursive -X patience ? Aktivieren Sie das letzte mit der zusätzlichen Ausführlichkeit, und prüfen Sie, ob dies andere Entscheidungen als die Standard-Zusammenführungsstrategie trifft.

Wenn das nicht funktioniert, ist es an der Zeit zu versuchen, dies manuell auf einen minimalen Testfall zu reduzieren. Zuerst würde ich versuchen, mich auf die fragliche Datei zu beschränken. Stellen Sie sicher, dass Sie in einem Wegwerf-Repo arbeiten, und verwenden Sie git filter-branch , um alle Dateien zu löschen, von denen die Zeile fehlt. Wenn Sie das tun und versuchen, die Zusammenführung erneut durchzuführen, erhalten Sie die gleichen Ergebnisse? Wenn nicht, ist es möglich, dass die Zeilen verschwinden, weil Git verwirrt wird und denkt, dass sie in eine andere Datei verschoben haben, wenn sie es nicht wirklich getan haben.

Wenn Sie das Problem immer noch mit nur einer Datei reproduzieren können, ist es an der Zeit, den Revisionsverlauf jedes Zweigs zu wiederholen und eine Zusammenführung durchzuführen, bis das Problem behoben ist. Beginnen Sie zum Beispiel mit dem Zweig devel, springen Sie ungefähr zur Hälfte zurück, versuchen Sie, die Zusammenführung erneut durchzuführen, und prüfen Sie, ob die Zeilen vom Master immer noch verschwinden. Wenn sie es tun, versuchen Sie es noch einmal zurückzuspringen. Wenn nicht, springen Sie den Zweig devel entlang und versuchen Sie es erneut. Sobald Sie das Commit gefunden haben, das das Problem auf der Entwicklungsseite einführt, versuchen Sie das selbe auf master und ziehen Sie das Commit, das Sie zusammenführen, zurück, bis das Problem verschwindet.

Nachdem Sie so weit wie möglich zurück gegangen sind, versuchen Sie, eine vereinfachte Version des Verlaufs vor diesem Punkt zu erstellen. Erstellen Sie ein neues Git Repo, überprüfen Sie die Zusammenführungsbasis dieser beiden Commits. Dann checken Sie die beiden Commits ein, die Sie oben in separaten Zweigen zurückverfolgt haben. Können Sie diese ohne Probleme zusammenführen, oder hängt es von einem Aspekt der Zusammenführungstopologie dazwischen ab? Wenn dies der Fall ist, versuchen Sie, die vollständige Zusammenführungstopologie erneut zu erstellen. Erstellen Sie nur die Commits, die notwendig sind, um alle Merges in der Geschichte durchzuführen. Kann das dein Problem reproduzieren?

An dieser Stelle sollten Sie die einfachste mögliche Geschichte haben, um das Problem zu reproduzieren, mit nur einer einzigen Datei, die es demonstriert (oder etwas interessantes herausgefunden hat, wenn Sie es nicht weiter reduzieren und das Problem reproduzieren konnten). . Ich würde empfehlen, dieses Repo öffentlich zu veröffentlichen, damit wir es uns ansehen können, wenn es in dieser einen Datei nichts Feines gibt, oder falls ja, versuchen wir, es noch weiter zu reduzieren, jedes Commit zu bearbeiten, um alles außer dem zu entfernen relevante Zeilen. Sie sollten außerdem in der Lage sein, jede relevante Zeile durch einen Platzhalterwert zu ersetzen, sodass Sie einen minimalen Testfall erhalten, der keinen Ihrer tatsächlichen Codes enthält.

All das ist eine Menge Arbeit, aber hoffentlich finden Sie etwas Interessantes, bevor Sie alles abgeschlossen haben, oder Sie können in der Lage sein, einen minimalen Testfall zu erstellen, ohne alle Zwischenschritte zu durchlaufen. Sobald Sie einen minimaleren Testfall haben oder Ergebnisse aus einem der oben genannten Schritte erhalten, posten Sie sie und wir können genauer hinsehen.

    
Brian Campbell 12.04.2012, 04:12
quelle
2

Ich bin auf ein ähnliches Problem gestoßen. Es sieht so aus, als ob die betreffende Codezeile zuerst von einem Commit eingeführt und dann durch einen Revert entfernt wurde. Dieser Zweig wurde mit dem Master verschmolzen. Dann wurde diese Zeile auf einem Dev-Zweig wieder eingeführt, aber systematisch entfernt, als der Dev-Zweig mit dem Master verbunden wurde. Ich nehme an, dass git irgendwie den Rückfall verfolgt und davon ausgeht, dass diese Zeile nicht benötigt wird und entfernt werden muss.

    
Dominique 08.04.2015 16:33
quelle

Tags und Links