Git вишневый выбор в другую ветку

Интересно, есть ли способ скопировать одно сообщение в другую ветку, не проверяя эту ветвь.

Например, у меня есть две ветки: master и parallel_version.

Я на ветке parallel_version, и я обнаружил ошибку в файле, общий для этих ветвей.

Я исправил это и совершил. Как дублировать эту фиксацию на другую ветку, предполагая, что я использую git -svn?

Обычно я бы сделал:

$ git checkout master
$ git cherry-pick parallel_version
$ git checkout parallel_version

Есть ли лучший способ сделать это?

Ответы

Ответ 1

Это невозможно - просто представьте, что произойдет, если возникнет конфликт, который не может быть разрешен автоматически. По той же причине вы также не можете обновлять ветки, которые в настоящее время не удалены (даже если бы была возможность быстрой перемотки вперед).

Ответ 2

https://github.com/lennartcl/gitl предоставляет сценарии "git cherry-copy" и "git cherry-move", которые делают это и обрабатывают большинство угловых случаев.

Ответ 3

Сумасшедшая идея (на основе комментария mnaoumov), если вы действительно хотите не трогать извлеченные файлы (скажем, вы не хотите нарушать вашу систему сборки)… это то, что я в любом случае хочу.

  1. Клонировать весь репозиторий git во временный каталог.
  2. Делай работу в клоне.
  3. Добавьте клон в качестве удаленного.
  4. git fetch clone && git branch mybranch clone/mybranch -f
  5. Убирайся

Это было бы вещь для автоматизации. Если у вас есть снимки файловой системы, клонирование всего репо обходится дешево - возможно, не все так безумно…

Ответ 4

Вот небольшой скрипт, который создает временный клон репозитория, как предложено user2394284:

/usr/bin/git-tmp-clone или ~/bin/git-tmp-clone

#!/bin/bash

gitTopLevel=$(git rev-parse --show-toplevel)

# Unique name for the temporary clone.
totalhash=$(tar -c "$gitTopLevel/.git" 2> /dev/null | sha256sum | head -c8)

tmprepo="/tmp/$(basename $(pwd))_${totalhash}"

git clone "$gitTopLevel" ${tmprepo}

# Start an interactive shell in the clone. Pass any
# arguments as initial commands to be executed.
/bin/bash --init-file <(echo "cd ${tmprepo}; [email protected]")

# Clean up the clone.
rm -rf ${tmprepo} && echo "Deleted ${tmprepo}"

(Этот скрипт менее надежен, но, похоже, работает на Ubuntu.)

Вы можете использовать это, чтобы выбрать вишню, например, последний коммит на текущем брахе в другую ветку, запустив

git-tmp-clone "git checkout TARGET_BRANCH
            && git cherry-pick $(git rev-parse --short @)
            && git push origin HEAD"

(Обратите внимание, что в этом примере rev-parse оценивается в исходном хранилище перед созданием клона! Именно поэтому он указывает на самый последний коммит. При необходимости адаптируйтесь.)