В git легко и полезно использовать diff3 в качестве стиля конфликта в случае конфликтов слияния, в которых блоки конфликтов состоят из нашей / базовой / их версий.
Однако, когда я использую jGit для слияния, он сообщает только о нас и их, я не нашел API для настройки diff3 в качестве стиля конфликта.
Я пытался выполнить поиск в Google, но большинство результатов связано с Git. И я также погрузился в исходный код jGit, но кажется, что MergeFormatterPass (https://github.com/eclipse/jgit/blob/master/org.eclipse.jgit/src/org/eclipse/jgit/merge/MergeFormatterPass.java) необходимо изменить, чтобы сохранить базовый контент в конфликтных блоках.
Хотя jGit является открытым исходным кодом на Github, но он не допускает проблем.
private String mergeTextually(String leftContent, String baseContent, String rightContent) {
String textualMergeResult = null;
try {
// TODO merge with diff3 conflict style
RawTextComparator textComparator = RawTextComparator.WS_IGNORE_ALL;
@SuppressWarnings("rawtypes")
MergeResult mergeResult =
new MergeAlgorithm()
.merge(
textComparator,
new RawText(Constants.encode(baseContent)),
new RawText(Constants.encode(leftContent)),
new RawText(Constants.encode(rightContent)));
ByteArrayOutputStream output = new ByteArrayOutputStream();
(new MergeFormatter())
.formatMerge(
output,
mergeResult,
Side.BASE.asString(),
Side.OURS.asString(),
Side.THEIRS.asString(),
StandardCharsets.UTF_8);
textualMergeResult = new String(output.toByteArray(), StandardCharsets.UTF_8);
} catch (Exception e) {
e.printStackTrace();
}
return textualMergeResult;
}
Ожидаемые конфликтные блоки в diff3:
<<<<<<<
/**
* The path that was passed in the constructor.
*/
public Path getRoot() {
return root;
=======
private Path getRoot() {
return root;
|||||||
public JavaParser getJavaParser() {
return javaParser;
}
public SourceRoot setJavaParser(JavaParser javaParser) {
this.javaParser = javaParser;
return this;
>>>>>>>
Фактические конфликтные блоки, сгенерированные jGit:
<<<<<<<
/**
* The path that was passed in the constructor.
*/
public Path getRoot() {
return root;
=======
public JavaParser getJavaParser() {
return javaParser;
}
public SourceRoot setJavaParser(JavaParser javaParser) {
this.javaParser = javaParser;
return this;
>>>>>>>