Вы, похоже, неправильно понимаете, что git merge
и git cherry-pick
делают.
Вы начинаете со следующей истории:
Init --- A' : target
\
\-- A --- B : source
Что происходит, когда вы объединяете source
в target
, это то, что git
берет две подсказки ветви и сравнивает их. Здесь две ветви четко различаются (и A 'не является предком источника, следовательно, нет слияния в ускоренном режиме), поэтому git объединяет две подсказки ветви и записывает новый коммит слияния.
Init --- A' ---------- C : target, source
\ /
\-- A --- B -- /
Вы можете рассматривать две ветви, которые были объединены как отдельные одноранговые узлы с равными правами ( как примечание, вы можете объединить более двух ветвей в одну ). При слиянии был зафиксирован коммит с двумя предками (кончики ветвей обеих ветвей слияния (здесь кончики ветвей A и B)), в котором записываются изменения, произошедшие в обеих ветвях.
Если вы хотите избежать слияния, вы должны применить коммиты в исходной ветке к вашей целевой ветке. Для этого вы обычно используете git rebase
, а не git merge
. Тот факт, что при выполнении двух cherry-pick
не возникает конфликта, объясняется тем, что выполнение здесь дважды cherry-pick
аналогично выполнению ребазирования (но с сохранением исходной ветви)