Что пошло не так в этом тривиальном слиянии? - PullRequest
1 голос
/ 30 июня 2019

Редактировать : Это определенно не является хорошей практикой для стекопотока, и я искренне извиняюсь, но, как мне кажется, я был очень неясен относительно точных шагов, которые я делал, вызывая путаницу. Поэтому я решил переписать пост и прояснить, какие именно команды я выполнял и в каком порядке воспроизвести мой опыт.

Поскольку раньше мне приходилось сталкиваться с фиктивными слияниями в Mercurial, я провел небольшой эксперимент:

cd example
hg init

создать example.dart

num add(num a, num b) {
  return a - b;
}
hg add .\example.dart
hg commit -m "bogus add()"
hg branch other

добавить к example.dart:

num sub(num a, num b) {
  return a - b;
}
hg commit -m "correct sub()"
hg update default
hg commit -m "fix add()"

(note by me: Mercurial messes up some characters)
hg log -G
@  ─nderung:        2:19a3c127981b
|  Marke:           tip
|  Vorgõnger:       0:ac1d30ac2dda
|  Nutzer:          Marvin
|  Datum:           Mon Jul 01 19:31:24 2019 +0200
|  Zusammenfassung: fix add()
|
| o  ─nderung:        1:645416c58a38
|/   Zweig:           other
|    Nutzer:          Marvin
|    Datum:           Mon Jul 01 19:23:40 2019 +0200
|    Zusammenfassung: correct sub()
|
o  ─nderung:        0:ac1d30ac2dda
   Nutzer:          Marvin
   Datum:           Mon Jul 01 19:19:47 2019 +0200
   Zusammenfassung: bogus add()

hg update other
hg graft 19a3c127981b

hg log -G
@  ─nderung:        3:567c99a23b17
|  Zweig:           other
|  Marke:           tip
|  Vorgõnger:       1:645416c58a38
|  Nutzer:          Marvin
|  Datum:           Mon Jul 01 19:31:24 2019 +0200
|  Zusammenfassung: fix add()
|
| o  ─nderung:        2:19a3c127981b
| |  Vorgõnger:       0:ac1d30ac2dda
| |  Nutzer:          Marvin
| |  Datum:           Mon Jul 01 19:31:24 2019 +0200
| |  Zusammenfassung: fix add()
| |
o |  ─nderung:        1:645416c58a38
|/   Zweig:           other
|    Nutzer:          Marvin
|    Datum:           Mon Jul 01 19:23:40 2019 +0200
|    Zusammenfassung: correct sub()
|
o  ─nderung:        0:ac1d30ac2dda
   Nutzer:          Marvin
   Datum:           Mon Jul 01 19:19:47 2019 +0200
   Zusammenfassung: bogus add()

Это дает ожидаемый результат в example.dart:

num add(num a, num b) {
  return a + b;
}

num sub(num a, num b) {
  return a - b;
}
hg update default
hg merge other
hg commit -m "merge with other"

hg log -G
@    ─nderung:        4:a76695f39931
|\   Marke:           tip
| |  Vorgõnger:       2:19a3c127981b
| |  Vorgõnger:       3:567c99a23b17
| |  Nutzer:          Marvin
| |  Datum:           Mon Jul 01 19:37:18 2019 +0200
| |  Zusammenfassung: merge with other
| |
| o  ─nderung:        3:567c99a23b17
| |  Zweig:           other
| |  Vorgõnger:       1:645416c58a38
| |  Nutzer:          Marvin
| |  Datum:           Mon Jul 01 19:31:24 2019 +0200
| |  Zusammenfassung: fix add()
| |
o |  ─nderung:        2:19a3c127981b
| |  Vorgõnger:       0:ac1d30ac2dda
| |  Nutzer:          Marvin
| |  Datum:           Mon Jul 01 19:31:24 2019 +0200
| |  Zusammenfassung: fix add()
| |
| o  ─nderung:        1:645416c58a38
|/   Zweig:           other
|    Nutzer:          Marvin
|    Datum:           Mon Jul 01 19:23:40 2019 +0200
|    Zusammenfassung: correct sub()
|
o  ─nderung:        0:ac1d30ac2dda
   Nutzer:          Marvin
   Datum:           Mon Jul 01 19:19:47 2019 +0200
   Zusammenfassung: bogus add()

История теперь выглядит ожидаемой. Тем не менее, результат слияния не:

num add(num a, num b) {
  return a + b;
}

num sub(num a, num b) {
}

Интересно, что алгоритм слияния чисто вырезает тело sub(), не вызывая конфликтов.

Эксперимент проводился на машине с Windows 10 со свежеустановленным Mercurial 4.9.1. Единственный установленный diff-инструмент - KDiff3, который поставляется с Mercurial и TortoiseHg (который я не использовал). Стандартные настройки не были изменены, и никакие плагины не были активированы.

Может быть, это просто какой-то странный угловой случай, хотя мне было бы очень интересно, чем это вызвано. Я был бы очень рад за любую информацию, которую вы могли бы дать. Поддельные слияния, как это, вызывают огромные головные боли, поэтому я думаю, что это актуально.

Ответы [ 2 ]

3 голосов
/ 01 июля 2019

Я не могу воспроизвести ваш опыт. Вот моя попытка:

$ mkdir hg
$ cd hg
$ hg init
$ cat > exp.lang << 'end'
> num add(num a, num b) {
>   return a - b;
> }
> end
$ hg add exp.lang
$ hg commit -m initial
$ hg branch other
marked working directory as branch other
(branches are permanent and global, did you want a bookmark?)
$ cat >> exp.lang << 'end'
> 
> num sub(num a, num b) {
>   return a - b;
> }
> end
$ hg commit -m 'add sub()'
$ hg checkout default
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ ed exp.lang
42
2
  return a - b;
s/-/+/
w
42
q
$ hg commit -m 'fix bug'

Насколько я могу судить, это то, что вы сказали, что сделали: исправьте ошибку в ветке по умолчанию. Давайте возьмем исправление и посмотрим, выглядит ли оно правильно:

$ hg checkout other
$ hg graft -r 2
grafting 2:2670b3299c96 "fix bug" (tip)
merging exp.lang
$ hg lga                 # lga is a graphical log alias
@  3:811f4d1a7dc4:draft  other tip Chris Torek
|  fix bug (54 seconds ago)
|
| o  2:2670b3299c96:draft  Chris Torek
| |  fix bug (54 seconds ago)
| |
o |  1:a780b1c8c579:draft  other Chris Torek
|/   add sub() (112 seconds ago)
|
o  0:b085834fc520:draft  Chris Torek
   initial (3 minutes ago)

$ cat exp.lang
num add(num a, num b) {
  return a + b;
}

num sub(num a, num b) {
  return a - b;
}

Пока все хорошо, насколько я могу судить, я воспроизвел ваши настройки. Сейчас:

$ hg checkout default
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ hg merge other
warning: conflicts while merging exp.lang! (edit, then use 'hg resolve --mark')
0 files updated, 0 files merged, 0 files removed, 1 files unresolved
use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon

Слияние не удалось, потому что Mercurial нужна человеческая помощь. Вот что увидел Mercurial:

$ cat exp.lang
num add(num a, num b) {
<<<<<<< working copy
  return a + b;
||||||| base
  return a - b;
=======
  return a + b;
}

num sub(num a, num b) {
  return a - b;
>>>>>>> merge rev
}

Базовая копия файла, начиная с версии 0, содержит ошибку: add возвращает a - b. Кончик текущей ветки (по умолчанию) версии 2 выглядит следующим образом:

$ hg abort
aborting the merge, updating back to 2670b3299c96
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ cat exp.lang
num add(num a, num b) {
  return a + b;
}

что и следовало ожидать: ошибка исправлена. Ревизия, в которую мы объединяемся, имеет такое же однострочное исправление, , но также вставляет все эти другие вещи - четыре дополнительные строки - перед последней закрывающей скобкой. Какой из них должен использовать VCS: исправление одной строки или исправление пяти строк? Он не знает, поэтому останавливается, чтобы получить помощь.

0 голосов
/ 01 июля 2019

Mercurial (TortoiseHG) 4.9.1, тот же результат, что и @torek, записавший

версию THG неудачного слияния

% hg merge --config=ui.merge=:merge --verbose 3
resolving manifests
merging functions.c
warning: conflicts while merging functions.c! (edit, then use 'hg resolve --mark')
0 files updated, 0 files merged, 0 files removed, 1 files unresolved
use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon

и (ожидаемое) состояние файла в серединепроцесс (сразу после вышеуказанного слияния)

num add(num a, num b) {
  return a + b;
<<<<<<< working copy
=======
}

num sub(num a, num b) {
  return a - b;
>>>>>>> merge rev
}

Добавление

Это слияние не может быть неконфликтным слиянием для обычные инструменты слияния (представление в графическом интерфейсе будет лучше)

Merging

, потому что серая строка / (1) om снимок экрана / в результате слияния IS конфликтная область, которая (конфликт) должна быть разрешена любым способом.Но, если мы предположим после наблюдения «другого» файла (правая сторона панели слияния, (2) область на скриншоте) и вашего описанного результата

num sub(num a, num b) {
}

, что ваш инструмент слияния по умолчанию может быть инструментом,который диктует собственную политику , а не разрешение , это может быть ответом на вопрос «Почему это произошло».

Чуть более глубоко: если ваш инструмент слияния по умолчанию каким-то образом«internal: other», затем

  • Зеленый раздел (2) с «другой стороны» должен появиться в результате слияния (в соответствии с запросом, выбрав mergetool)
  • Область конфликта (1) только что проигнорировано
  • Закрывающая скобка} (3) является общим элементом для обеих сторон слияния и передается в результате слияния
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...