Git: как перебазировать сразу несколько ветвей (с одним и тем же базовым коммитом)?
у меня есть главная ветка в моем проекте, которую я использую, чтобы тянуть изменения от других людей. Из этого у меня обычно есть несколько тематических ветвей, над которыми я сейчас работаю.
мой вопрос: есть ли способ для меня, чтобы вытащить новые изменения в мой мастер, а затем перебазировать все мои ветви темы на это сразу?
такая ситуация:
D--E topic1
/
A--B--C master
F--G topic2
и я хочу выполнить это с помощью одной команды (H пришел из upstream) :
D'--E' topic1
/
A--B--C--H master
F'--G' topic2
теперь я знаю, что могу сделать это, перебазировав topic1 и topic2 на master, и я мог бы даже написать сценарий для автоматизации этого. Но что делать, если у меня есть несколько других ветвей, создавать новые и удалять другие часто, и я получаю вверх по течению изменения все время?
эта операция (несколько перебазирует), когда делается вручную, как утомительно и чревато ошибками.
есть ли более простой способ?
спасибо!
3 ответов:
Я совершенно уверен, что нет способа автоматически сделать это. Помните, что "git rebase master" также может вернуть вас в оболочку, необходимую для разрешения конфликтов слияния, поэтому, если вы хотите написать сценарий для автоматизации всего этого, вам нужно принять это во внимание.
вы можете довольно легко отслеживать, какие ветви нуждаются в обновлении, хотя. Хм, для любой ветки, " git rev-list branch..мастер " будет производить вывод, если ветка не является актуальной wrt (т. е. просто фиксируется поверх) мастер. Поэтому вам нужно пройти через все локальные головы, кроме master, чтобы создать отчет (NB" git show-branch " примерно сделает это):
git for-each-ref 'refs/heads/*' | \ while read rev type ref; do branch=$(expr "$ref" : 'refs/heads/\(.*\)' ) revs=$(git rev-list $rev..master) if [ -n "$revs" ]; then echo $branch needs update git diff --summary --shortstat -M -C -C $rev master fi doneпоэтому, если вы чувствовали себя храбрым, вы могли бы заменить этот "git diff" чем-то вроде "git checkout $branch && git rebase master" (или, возможно, просто "git pull --rebase", если вы это настроили). Я думаю, что тогда вам придется проверить наличие ".git/rebase-apply" каталог или проверьте индекс для несвязанных файлов ("git ls-files-u") чтобы проверить, если мы остались ждать, чтобы сделать слияние.
конечно, если нет конфликтов, то это легко... он производит что-то, что также работает, когда это не так просто, вот в чем проблема :p
и это не обязательно касается того, что происходит, если одна из ваших ветвей основана на чем-то другом... вот почему я упомянул использование "git pull --rebase" вместо этого, потому что это будет перебазироваться в соответствии с конфигурацией ветви, а не слепо от мастера. Хотя обнаружение не зависит от конфигурации филиала... может быть, было бы проще всего просто проверить каждую ветвь и сделать "git pull" и позволить конфигурации ветвей обрабатывать все, включая ли перебазировать или объединить?
вы всегда можете просто написать оболочку сценарий такой:
for branch in topic1 topic2 topic3;do git rebase master $branch;doneпоскольку ветви темы, которые вы хотели бы перебазировать, вероятно, будут меняться со временем, это быстрое и гибкое решение: -)
Я превратил это в надежный скрипт, поддерживаемый в мой репозиторий Git-расширений:
$ git-urebaselocalbr --help Rebase all / the last committed N local branches (except for the current branch and master) to the updated upstream head. Usage: git-urebaselocalbr [--continue|--skip|--abort] [--branches "<branch1> ..."] [N] [-i|--interactive] [options]
Comments