2013-11-06 3 views
5

Я видел разные сообщения в StackOverflow, которые объясняют, что вишня выбирает немного, но комментарии в их коде не очень специфичны относительно того, что такое ветка и что такое каталог. Пример git checkout A -- X Y не говорит мне многого.git cherry-pick or merge specific directory from another branch

В основном я хочу это:

  • Создать новую ветку featureA прочь master
  • каталог Merge /tools/my-tool из филиала dev в featureA
+1

Общее правило, когда есть '--' в команде мерзавца, как это, на левом является название филиала или commit, справа - это пути. – torek

+0

Зачем вам нужна вишня для этого? Вы можете просто создать вручную объединение каталога. –

+1

спасибо @torek. что я закончил делать, это «git checkout dev - tools/my-tool» – daleyjem

ответ

4

Примечание:

  • git cherry-pick я о применении полной фиксации (или фиксации) к другой ветке. Нет понятия «путь».
  • git checkout это об обновлении рабочего дерева (и HEAD, если не указано никакого пути, эффективного переключения ветвей)

    git checkout [-p|--patch] [<tree-ish>] [--] <pathspec>... 
    

Когда <paths> или --patch приведены, git checkout не переключается ветви ,
Он обновляет именованные пути в рабочем дереве из индексного файла или с именем <tree-ish> (чаще всего это фиксация). Аргумент <tree-ish> может использоваться для указания конкретного дерева-иша (т. Е. Фиксации, тега или дерева) для обновления индекса для заданных путей перед обновлением рабочего дерева.

Ваш git checkout dev -- tools/my-tool обновляет определенный путь, но это не «слияние» или «git cherry-pick».

10

Чтобы ответить на исходный вопрос о том, как вишнево выбрать некоторые каталоги (как коммиты вместо проверки грубой силы), это возможно. Представьте, что featureA отклонился от master, и вы хотите взять с собой tools/my-tool коммитов.

Предполагая, что вы никогда не делали каких-либо фиксаций, которые содержат как материал, из /tools/my-tool и вещи из других каталогов

Это поможет вам список коммитов к master в tools/my-tool (которые уже не в featureA) , в обратном хронологическом порядке:

git log --no-merges featureA...master tools/my-tool 

сказать, что это еще один способ:

git log --no-merges source_branch...dest_branch my/firstpath my/secondpath [...] 

Чтобы получить только совершающие вам нужно в хронологическом порядке, вы должны сначала изменить порядок входных линий (например, с tail -r или tac), затем выделить столбец для фиксации хэша (например, с cut) :

git log --format=oneline --no-merges featureA...master tools/my-tool \ 
    | tail -r \ 
    | cut -d " " -f 1 

И делать всю работу сразу, сделайте следующее:

git cherry-pick $(git log --format=oneline --no-merges featureA...master tools/my-tool | tail -r | cut -d " " -f 1) 
+4

tail -r недоступен в linux, «tac» является альтернативой tail -r – kokorins

+0

updated; благодаря! – Ian

+0

Небольшое изменение в хронологическом порядке - 'git log --pretty = tformat:"% h "--no-merges featureA ... master tools/my-too ​​| tail -r' – rh0dium