Jedes Mal, wenn ich in meinem SCM einen Konflikt bei etwas wie Importen oder Änderungen der Methodensignatur (z. B. Umbenennung von Variablen) sehe, frage ich mich, ob es so etwas wie eine sprachbewusste Diff/Merge-Methode gibt, die mit den ärgerlicheren kleinen Änderungen umgehen kann, die auf einem passieren können gemeinsames Projekt. Gibt es irgendetwas, das Konflikte in einer Unix-Umgebung reibungsloser handhabt?
Java-fähiger Zusammenführungsbefehl
Ich stimme zu, dass es großartig wäre, wenn ein solches Tool existieren würde, aber es gibt keine, die mir bekannt sind. Der Grund, warum ich glaube, dass es keine gibt, liegt darin, dass der Zusammenführungsalgorithmus für jeden SCM (ob git, hg, bzr, svn usw.) auf dem kleinsten gemeinsamen Nenner arbeitet, der einfach nur Text ist. Damit diese SCM-Tools die Sprachsyntax und -semantik wirklich verstehen, müssten sie die Fähigkeit zum Parsen der Sprache beinhalten. Es scheint, dass dies einfach eine zu große Aufgabe für jedes SCM ist, um die Fähigkeit zum Parsen von Java, C#, Python, Ruby, Groovy, C, C++ usw. einzuschließen, ganz zu schweigen davon, dass jede dieser Sprachen unterschiedliche Syntaxen zwischen den Versionen hat (z. B. gab es Java-Generika bis 1.5 nicht). Der SCM müsste also die Fähigkeit beinhalten, zu erkennen oder so konfiguriert werden, dass er weiß, in welcher Sprache und Version der Sprache der Quellcode geschrieben ist.
Ich denke, dass es wahrscheinlicher wäre, dass eine sprachabhängige Zusammenführungsfunktion in einem Zusammenführungstool eines Drittanbieters zu finden wäre (z. B. die Einstellung merge > tool in .gitconfig und die Einstellung ui > merge in .hgrc). Dieses Tool könnte so konfiguriert werden, dass es weiß, dass alle .java-Dateien in Ihrem Projekt in Java 1.6 geschrieben sind, und dann die Parsing-Funktionen im JDK verwendet, um die zu generieren AST und führen Sie eine “tiefe” Analyse durch, ob die Änderung im Kontext dieser Sprache sinnvoll war.
-
Ja, das meine ich mit “Merge-Befehl”. Aber die Frage ist immer noch, ob es so etwas gibt.
– Markus
30. November 2009 um 19:42 Uhr
Ich suche genau das gleiche. Diese Anbieter von Zusammenführungstools sollten sich wahrscheinlich mit dieser Art semantischer, sprachbewusster Zusammenführung befassen. Wenn nicht, muss ich einer werden 🙂
Im Moment verarbeite ich als Trick eines armen Mannes manchmal die 3 Dateien (Basis, unsere, ihre) auf ihre „kanonische Form“, indem ich sie durch Eclipse Code Cleanup/Organize Imports/Order Members füttere.
Obwohl begrenzt, funktioniert dies gut: Beim letzten Mal wurde die Anzahl der Konflikte auf ~ 200 in 2 reduziert. Ich plane, dies in ein Skript zu packen und in das Merge-Tool von git einzubinden.
Habe auch ein Skript zur automatischen Auflösung von Java-Importkonflikten geschrieben, das einfach beide Seiten der Importe beibehält und Kommentare hinzufügt, um zu erklären, was vor sich geht und was zu tun ist: „Importe organisieren“.
-
In Bezug auf Java-Importkonflikte würde ich vorschlagen, den widersprüchlichen Importabschnitt (oder sogar alle Importe) zu löschen und die IDE sie erneut einfügen zu lassen. Damit dies funktioniert, müssen Sie sich natürlich auf eine gemeinsame Importbestellung einigen. Manchmal sind die Importe nicht eindeutig (z. B. java.util.List vs. java.awt.List), aber die Fälle ohne offensichtliche Lösung sind ziemlich selten. Eigentlich gibt es eine bessere Lösung: Entfernen Sie nur die Konfliktmarkierungen, lassen Sie möglicherweise doppelte Importe dort und lassen Sie sie schließlich von der IDE bereinigen.
– maaartinus
13. Dezember 2013 um 6:37 Uhr
-
Ja, das habe ich getan (in Bezug auf “Habe auch Skript-Autoresolve-Java-Importkonflikte geschrieben”). Danke trotzdem für die Klarstellung
– Finger
16. Dezember 2013 um 17:17 Uhr
Vielleicht möchten Sie prüfen, ob alle in Ihrem Team die gleichen IDE-Einstellungen für Dinge wie Importreihenfolge, Formatierung usw. verwenden, um zu vermeiden, dass solche Konflikte überhaupt auftreten.
-
Das löst das Problem nicht wirklich. Betrachten Sie zum Beispiel einen Java-Code “import a; import e;”. Angenommen, ich füge “import b;” hinzu. und Sie fügen “import c;” hinzu, beides in der richtigen alphabetischen Reihenfolge. Wenn es an der Zeit ist, zusammenzuführen, erhalten wir einen Zusammenführungskonflikt. Wenn wir zustimmen, Importe in alphabetischer Reihenfolge anzuordnen, besteht keine Zweideutigkeit darüber, was die richtige Zusammenführung ist – aber die Tools erzeugen Zusammenführungskonflikte, weil sie sich der Codierungskonventionen nicht bewusst sind.
– Phil
30. November 2009 um 2:15 Uhr
-
Der häufigste Fehler beim Zusammenführen scheint, dass jede Hinzufügung von Code mit jeder anderen Hinzufügung von Code an derselben Stelle kollidiert. Es sollte eine allgemeine Lösung für dieses “alle Dinge hinzufügen!” Stil des Zusammenführens, der in allen Syntaxen gut genug funktioniert. (Standardmäßig werden alle Einfügungen eingeschlossen, als Standardzusammenführung, wenn die Zusammenführung in einem bestimmten Block oder Bereich erfolgt.)
– Warren P
28. Oktober 2011 um 19:10 Uhr
löst git rebase dieses problem nicht? Alle Variablenumbenennungen werden in den zugehörigen Commits berücksichtigt. Mit git rebase können Sie mit Upstream-Commits synchron bleiben. Solange Sie häufig rebasen (täglich?), sollten Sie solche dummen Konflikte nicht bekommen, und wenn Sie es sind, sind sie wahrscheinlich echte Konflikte und können nicht von einem Java-Grammatik-Parser gelöst werden.
PBo
Um es jedem einfacher zu machen, auf dieser Seite zu landen. Diese Frage ist ein Dupe von http://stackoverflow.com/questions/523307/semantic-diff-utilities (es wird in der Hauptfrage beantwortet, ist aber nicht offensichtlich)
Und das aktuelle Tool, das mir bekannt ist (die Antwort für die obige Quest), ist Symantic Merge – https://www.semanticmerge.com
Es gibt auch https://www.devart.com/codecompare das kommt dem nahe, was du willst
Gute Idee. Klingt nach dem Konzept für dein nächstes Open-Source-Projekt 🙂
– Asaf
29. November 2009 um 22:16 Uhr
Nun, die Fälle von “low Hanging Fruits” sind so einfach, dass ich immer noch glaube, dass sich jemand darüber Gedanken gemacht haben muss, bevor ich diese Frage gestellt habe.
– Markus
30. November 2009 um 19:44 Uhr
Scheint ein Dup für stackoverflow.com/questions/523307/semantic-diff-utilities zu sein
– Markus
30. November 2009 um 19:50 Uhr
einverstanden, das sollte wohl geschlossen werden. und stimmte zu, ich habe mich immer gefragt, warum Zusammenführungen auf diese Weise nicht intelligenter gemacht werden können.
– Kevin Bourrillion
1. Dezember 2009 um 21:47 Uhr