Git вишня-выбрать или слить конкретный каталог из другой ветки

Я видел разные сообщения в StackOverflow, которые объясняют немного вишни, но комментарии в их коде не очень специфичны относительно того, что такое ветка и какой каталог. Пример git checkout A -- X Y не говорит мне много.

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

  • Создать новую ветку featureA off master
  • Слить каталог /tools/my-tool с ветки dev в featureA

Ответ 1

Чтобы ответить на исходный вопрос о том, как вишнево выбрать некоторые каталоги (как коммиты вместо проверки грубой силы), это возможно. Представьте, что 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)

Ответ 2

Примечание:

  • 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 вишневый выбор".