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), если вы действительно хотите не трогать извлеченные файлы (скажем, вы не хотите нарушать вашу систему сборки)… это то, что я в любом случае хочу.
- Клонировать весь репозиторий git во временный каталог.
- Делай работу в клоне.
- Добавьте клон в качестве удаленного.
-
git fetch clone && git branch mybranch clone/mybranch -f
- Убирайся
Это было бы вещь для автоматизации. Если у вас есть снимки файловой системы, клонирование всего репо обходится дешево - возможно, не все так безумно…
Ответ 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
оценивается в исходном хранилище перед созданием клона! Именно поэтому он указывает на самый последний коммит. При необходимости адаптируйтесь.)