2016-09-01 3 views
3

Normalerweise zu erkennen, wenn die Überprüfung merge verpflichtet, tun wir git diff-tree --cc <commit> (oder einfach git show <commit>), aber ich bin mit dem folgenden Problem konfrontiert:Wie merge Meinung verpflichtet falsche hunks

Sagen Sie bitte B in A und während des Konflikts fusionieren Auflösung müssen Sie ein Stück aus entweder A oder B Zweig wählen, um es zu lösen. Nehmen wir an, dass der Brocken in A den Brocken in B aus irgendeinem Grund ersetzt, aber da Sie vielleicht nicht davon wissen und einfach durch z.B. Commit-Datum, wählen Sie Hunk aus B Zweig.

Wenn Sie keine weiteren Änderungen vornehmen, zeigt das Multi-Parent-Differential über git show keine Diff-Ausgabe an, da das resultierende Hunk vollständig in einem der Eltern-Commits enthalten ist.

weiter zu erarbeiten, wenn Sie diesen Konflikt haben:

<<<<<<< HEAD 
aaa 
======= 
bbb 
>>>>>>> b 

Und entfernen Sie entweder aaa Hunk und wählen bbb, oder umgekehrt, wird die git show <merge_commit> überhaupt nicht so zeigen alles, Sie zu verhindern, was zu sehen Hunk wurde während der Zusammenführung gewählt.

Dies kann möglicherweise zu einer Regression führen, die schwer zu finden ist.

Wie konnte ich sehen, welche hunks während einer Konfliktlösung ausgewählt wurden?

Edit: was ich will, ist nur die Hunks, die im Konflikt waren (also nicht automatisch zusammengeführt) zu sehen.

+0

Zeigt 'git show' nicht den Unterschied in Bezug auf A? – Jeremy

+0

von [docs] (https://git-scm.com/docs/git-show) und Erfahrung, zeigt identische Ausgabe zu "diff-tree -cc", also in Bezug auf sowohl "A" als auch "B" . – Dwelle

+0

Was meinst du damit, wenn du sagst, dass das Multi-Eltern-Diff über Git-Show nichts auflisten wird? – Jeremy

Antwort

1

Edit: was ich bin nach ist nur die hunks zu sehen, die in Konflikt waren (also nicht automatisch zusammengeführt).

Nicht die Antwort, die Sie gesucht haben: Dies ist mit git Befehle nicht möglich.git verfolgt nicht, wie eine Zusammenführung in irgendeiner Weise oder Mode aufgelöst wurde (außer für den Cache git rerere, der uns hier jedoch nicht hilft). Du brauchst etwas wie ein "4-Wege-Diff" (A, B, gemeinsames Eltern- und Merge-Ergebnis), von dem ich noch nie gehört habe.

Theoretisch könnten Sie zurückgehen und schreiben Sie ihnen ein Programm, das wieder tut den ursprünglichen 3-Wege-Merge die Zwischendatei (mit den Konfliktmarken) und dass zum merge Ergebnis diff zu erzeugen. git hat keine Bestimmungen, um das für Sie zu tun.

EDIT: erwähnt git rerere, obwohl es hier nicht hilft.

+0

Ja, ich hatte etwas wie "Wiederspielen der Zusammenführung, um konfliktreiche Kerle herauszufinden". Dachte, es wäre möglich, über 'git' allein zu machen. Akzeptiert als traurige Wahrheit. – Dwelle

1

Vergleichen Sie die Zusammenführung mit einem bestimmten übergeordneten Element (oder allen übergeordneten Elementen).

Normalerweise sind die Eltern mit zu vergleichen, ist der erste Elternteil, das heißt, HEAD^1 oder HEAD~1 oder HEAD^ oder HEAD~ (alle das gleiche bedeuten). Um mit dem zweiten Elternteil zu vergleichen, wählen Sie HEAD^2 (es gibt keine andere kurze Möglichkeit, das zweite Elternteil auszudrücken: Sie müssen das Hüttensuffix und die Nummer verwenden).

Ersetzen Sie HEAD durch die Zusammenführungs-Commit-ID, wenn die Zusammenführung nicht das aktuelle (HEAD) Festschreiben ist.

Um diffs gegen alle Eltern zu sehen, können Sie einfach git show -m <commit>, die (nur intern) „Splits“ die Zusammenführung, so dass anstelle des Seins kombiniert-diff-ed begehen, dann ist es diff-ed ein Elternteil in einer Zeit, gegen jeden Elternteil.

Daraus folgt:

git show -m <commit> 

(und stoppen, wenn Sie genug gesehen haben, oder es bis zum Ende spielen, wenn Sie mögen) oder:

git diff <commit>^ <commit> 
+0

Ich hatte auf etwas gehofft, das nur die Kerle zeigen würde, die in Konflikt standen. Ansonsten zeigt dies zu viel irrelevanten Code, besonders wenn Sie beide Elternteile scannen müssen. Dies könnte funktionieren, wenn Sie wissen, wonach Sie suchen. Für häufige Zusammenführungsüberprüfungen nicht sehr nützlich, wenn die zusammengeführten Zweige zu Beginn groß waren. – Dwelle

+0

Ja, definitiv nicht eingebaut. Es ist einfach genug, die Zusammenführung erneut durchzuführen (tun Sie es mit einem temporären Index und Arbeitsbaum und entweder losgelöste HEAD oder no-commit Flag), außer dass Sie nicht sagen können, welche Merge-Strategie ('-s') oder erweiterte Argumente (' -X our', '-X rename-threshold',' -X ignore-space- * ', etc) wurden zu diesem Zeitpunkt angewendet. – torek