2010-09-03 4 views
11

Kann ich Git so einstellen, dass ich den Dreiwege-Vergleich in KDiff3 verwenden kann?Drei-Wege-Vergleich mit Git und KDiff3

Ich habe zwei Zweige, die viel zu unterschiedlich sind, um sie automatisch zusammenzuführen, ich muss einfach jeden Zusammenführungspunkt prüfen, und ich denke, der beste Weg wäre, den Zweig zu überprüfen, möchte ich die Änderungen aus dem anderen Zweig und sagen

git difftool HEAD_OF_OTHER_BRANCH -- . 

Und dann wählen Sie Datei in KDiff3 zusammenführen. Nachdem ich die Dateien durchgegangen bin, die ich gerade gemacht habe.

Ich habe merge.conflictstyle und diff.conflictyle zu diff3 eingerichtet, aber KDiff3 startet immer noch mit einem bidirektionalen diff. Ist das möglich? Ich denke, wenn Git auch den Hash des gemeinsamen Vorfahrens als Parameter sendet, ist das möglich, aber tut es das?

Es gibt discussion darüber, wie dies mit SVN und BC3 zu tun, aber ich konnte nichts für Git und KDiff3 finden.

+0

Wenn Sie versuchen, eine dreifache Zusammenführung zu tun, warum verwenden Sie nicht mergetool (anstelle von difftool)? –

+1

Ich möchte nicht, dass Git irgendetwas automatisiert. Ich habe herausgefunden, dass ich vielleicht .gitattributes verwenden kann, um Git zu sagen, dass er nicht automatisch agieren soll. Trotzdem wird Merge das gesamte massive System auf einmal zusammenführen, ich würde das eher auf Verzeichnisbasis behandeln. Ja, das ist ein Durcheinander, aber meine Absicht ist es, es zu reinigen. Dafür muss ich leider etwas Handarbeit machen. – Makis

+0

@Makis: Es scheint sinnvoll, eine ordnungsgemäße Zusammenführung durchzuführen, aber eine Strategie zu verwenden, die den 'binären' Merge-Treiber nicht über '.gitattributes' automatisch macht oder erzwingt, um Konflikte für den Benutzer zu lösen. Auf diese Weise können Sie mit mergetool kdiff3 auf logische Weise starten. –

Antwort

2

Es scheint, dass git diff nur ein 2-Wege-diff (was Sinn machen, Patch usw.), außer in einem Zusammenführungszustand, müssen Sie eine Zusammenführung für das tun. Ich war neulich in einer ähnlichen Situation und endete mit der Strategie ours. Das hat funktioniert, war aber nicht ideal. Vielleicht brauchen wir eine "nicht-resolve" Verschmelzungsstrategie, die nicht versucht, Konflikte zu lösen. Möglicherweise können Sie dies emulieren, indem Sie die Dateien .git/MERGE_ * optimieren und alle Dateien als widersprüchlich festlegen.
Ansonsten ist die offensichtliche Lösung ist 3 verschiedene Verzeichnis zur Kasse und führen kdiff3, aber ich denke, Sie für eine elegantere Lösung suchen

+0

Die Überprüfung auf verschiedene Verzeichnisse wäre in Ordnung, außer wie erstellt man das dritte Verzeichnis, das die gemeinsamen Vorfahren enthält? Solange ich an einem einzigen Repo arbeite, stellt Git die gemeinsamen Vorfahren für mich heraus. – Makis

+1

@makis können Sie den 'git merge-base' Befehl verwenden, um den gemeinsamen Vorfahren von zwei Commits zu finden, praktisch. – mb14

+0

Hm, also ist der gemeinsame Vorfahr für alle Dateien gleich? Ich dachte, das könnte je nachdem, wann eine Datei bearbeitet wird, unterschiedlich sein. Wenn es für jede Datei gleich ist, dann wäre dies definitiv eine praktikable Lösung. – Makis

9

Run dies auf der Kommandozeile:

git config --global mergetool.kdiff3.path /path/for/your/kdiff3/binary 

Dann, wenn Konflikte zu lösen Sie müssen nur Folgendes tun:

git mergetool --tool=kdiff3 
+0

genau das, was ich gesucht habe! –