Ответ 1
Повторите попытку своей вишни после:
git config merge.conflictstyle diff3
Вы получите более подробный diff:
<<<<<<< HEAD
||||||| parent of 5b2a14c... dev add line c
b
=======
b
c
>>>>>>> 5b2a14c... dev add line c
Это показывает, что при применении патча, представленного dev
HEAD (b
и c
), Git не знает общего предка; он отказывается:
- непосредственный родитель из собранной вишни фиксации (показывая, что он добавляет строку "
c
" после строки "b
" ) - фиксация назначения (которая вообще не показывает строку
b
, поверх которой она может применить добавленное изменение "c
" )
Следовательно, конфликт.
Cherry-picking не похож на merge (который ищет merge-base).
Черри-выбор принимает фиксацию, а применяет изменение, которое оно вводит.
Здесь внесенное изменение: add c
поверх b
.
И конечная фиксация вообще не имеет значения b
, поэтому для Git:
- команда upstream (destination) commit "удалила
b
" (или никогда не имела ее в первую очередь, что здесь имеет место, но Git этого не знает), - исходный коммит имеет
b
, поверх которого добавленc
.
Насколько известно Git при попытке применить этот патч (и это все git cherry-pick
делает: примените патч. Он вообще не ищет историю собранного вишни), то есть конфликт: одновременная модификация.
Если вы уверены в том, как это разрешение должно идти, вы можете сделать:
> git cherry-pick -Xtheirs dev
[master 7849e0c] dev add line c
Date: Wed Aug 17 08:25:48 2016 +0200
1 file changed, 2 insertions(+)
Затем вы увидите, что b
и c
добавлены к исходной фиксации без каких-либо конфликтов (поскольку вы указали, как разрешить ее с опцией "-Xtheirs
", переданной в стратегия объединения по умолчанию recursive
)