2015-06-06 6 views
0

Я пытаюсь сделать вишневое выделение определенной фиксации из одного плеча в другое. Допустим, моя история выглядит следующим образом:Git: вставки вишневых вставок из других коммитов

A - B - C - D (master) 
     \ 
     X - Y  (feature) 

Теперь, скажем, я хочу, чтобы применить только изменения совершают D на мастера в эту ветку, сразу после Y. Когда я пытаюсь сделать это, есть слияния конфликтов, и я могу видеть следы фиксации C при слиянии, хотя я хотел только вишневый захват. D.

Что мне не хватает?

ответ

2

git cherry-pick master или git cherry-pick <id-of-D> делает различия от C к D, а затем пытается применить эту диф к текущему дереву/фиксации (в данном случае, дерево для Y). Вы, как вы заметили, «увидите следы фиксации C», если D вносит изменения в объекты, которые также были изменены в C, потому что diff несет контекст. Это тот контекст, который позволяет git найти, что нужно изменить в Y, в случае линий или функций или целых файлов, были перемещены (например, в X и/или Y).

Git не понимает семантики, только синтаксис: это будет только вишневого выбор чисто, если синтаксис совпадает, и он будет нуждаться в помощи от вас (и не знаю, что не, чтобы показать вам), если нет.

+0

Он буквально добавляет строки кода, которые были добавлены в commit C. Эти строки действительно рядом с теми, которые добавлены в commit D. Это поведение, которое вы ожидаете? –

+0

Мне нужно было бы убедиться, что фактическая фиксация (и), чтобы сказать наверняка. Но вы можете 'git show' совершить' D', чтобы узнать, что git считает необходимым. – torek

+0

Больше не могу сказать. Эти фиксации и филиалы заменяются или удаляются. (Я действительно узнал некоторые новые навыки git, большое спасибо :)) –