Irgendwann in unserer Vergangenheit wurden Entwicklungszweige in git zusammengelegt. Die falsche Zusammenführungsentscheidung wurde jedoch getroffen, und daher hat es ein Code nicht in den Master-Zweig geschafft, von dem wir erwarteten, dass er dort wäre. (Es gab mehrere Zusammenführungen von verschiedenen Zweigen vor einer endgültigen Zusammenführung zu einem Hauptzweig. Daher war der Verzweigungs- und Zusammenführungsverlauf ziemlich komplex.)
Gibt es eine einfache Möglichkeit, ein Git-Repository zu durchsuchen, um zu bestimmen, bei welcher Zusammenführung die "falsche" Entscheidung getroffen wurde?
(Ich kenne bereits die Antwort für diesen speziellen Fall, aber der Prozess der Suche war ein wenig langweilig.)
BEARBEITEN: Der Grund, warum die Schuld sich als unzureichend erwiesen hat, ist, dass die Linie in einem Commit irgendwann nach dem Merge-Fehler berührt wurde.
Wenn Sie eine Zeile in einer Datei kennen, die durch die git branch merge geändert wurde, können Sie 'git blame file.txt' eingeben und die Hash-Nummer des Commits bestimmen und den Autor der Zeile in der Datei festschreiben. Dann können Sie das Git-Protokoll durchgehen und das genaue Commit aufrufen, das mit dem Zusammenbruch des fehlerhaften Zweigs verbunden ist.
BEARBEITEN: Als Reaktion auf die Kommentare des Autors könnte, wenn Sie nach dem Verschwinden einer bestimmten Zeile suchen, 'git diff' kombiniert mit grep und binärer Suche das sein, was Sie wollen. Nehmen wir an, Sie haben Zahlen 0,1,2,3,4,5,6. Sie wissen, dass die Zeile in Revision 0 existierte, aber in Revision 6 verschwand. Verwenden Sie 'git diff' plus grep, um nach dem Verschwinden zu suchen.
%Vor%In der ersten Iteration sehen Sie die Zeile, die Ihnen am Verschwinden liegt. Dann schneiden Sie die Revisionsnummer in zwei Hälften und versuchen es erneut
%Vor%Wenn der grep die Zeile immer noch verschwinden lässt (mit dem '-' Zeichen), dann weißt du, dass die Zeile in Revision 0 bis 3 verschwunden ist. Wenn grep nicht zeigt, verschwindet die Zeile , dann verschwand die Linie in den Revisionen 4-6.
Reduziere die Revisionen immer in zwei Hälften, bis du den Täter gefunden hast.
Ohne weitere Details kann ich nur auf mögliche Lösungen hinweisen. Wenn Sie die betroffene Datei oder Zeile kennen, können Sie entweder git-blame ( git blame *file*
, oder git blame *revision* *file*
), oder Sie können eine so genannte ' Spitzhacke Suche' mit git-log , dh git log -S'*line*
versucht eine Revision zu finden, die eine gegebene Zeile einführte oder eine bestimmte Zeile löschte. Sie können alle Zusammenführungen finden und untersuchen, zum Beispiel über git log -p -m --grep=Merge
, und untersuchen, wie sie sich auf ihre Eltern beziehen ( -m
zeige Diffs für alle Eltern; alternativ zeigt -c
kombiniertes diff, zeigt aber keine trivialen Zusammenführungsänderungen, d wenn eine Seite genommen wurde).
Git log verfügt über leistungsstarke Suchoptionen. Da es einen Hinweis darauf gibt, dass ein Teil des Codes verschwunden ist, können Sie nach dieser Zeichenfolge suchen
git log <HERE>..<THERE> -S"line I care about" --diff-filter=M
Sucht von HERE nach THERE für die Zeichenfolge nach -S
und nur dort, wo die Zeile geändert wurde (hinzugefügt oder entfernt)
Sie können Ihre Suche noch präziser machen, wenn Sie -G anstelle von -S verwenden. -G bietet reguläre Ausdruckssuche anstelle von String-Literal-Suche mit -S.