Git: Como rebase muitos ramos (com a mesma base de commit) de uma só vez?

Eu tenho uma ramificação mestre no meu projeto, que uso para puxar mudanças de outras pessoas. A partir disso, eu geralmente tenho vários ramos de tópicos nos quais estou trabalhando atualmente.

A minha pergunta é: há uma maneira de eu fazer novas alterações no meu mestre e, em seguida, rebase todos os meus tópicos para isso de uma só vez?

Esta é a situação:

D--E topic1 / A--B--C master \ F--G topic2 

E eu quero fazer isso com um único comando (H veio do upstream):

                D '- E' topic1
               /
     A - B - C - H mestre
               \
                F '- G' topic2

Agora, eu sei que posso fazer isso rebaixando topic1 e topic2 para master, e eu poderia até escrever um script para automatizar isso. Mas e se eu tiver vários outros ramos, criar novos e excluir outros com frequência e receber alterações de envio o tempo todo?

Esta operação (várias rebases), quando feita manualmente, é cansativa e propensa a erros.

Existe um caminho mais fácil?

Obrigado!

Tenho quase certeza de que não há como fazer isso automaticamente. Lembre-se de que “git rebase master” também pode retornar ao shell que precisa resolver conflitos de mesclagem, portanto, se você quiser escrever um script para automatizar tudo isso, é necessário levar isso em conta.

Você pode facilmente rastrear quais filiais precisam ser atualizadas. Hmm, para qualquer ramificação, “git rev-list branch..master” produzirá saída se o branch não estiver atualizado wrt (ou seja, apenas commits on top of) master. Então você precisa percorrer todos os headers locais, exceto o mestre, para produzir um relatório (nb “git show-branch” fará aproximadamente isso):

 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 

Então, se você estivesse se sentindo corajoso, poderia replace o “git diff” por algo como “git checkout $ branch & git rebase master” (ou talvez apenas “git pull –rebase” se você configurou isso). Eu acho que você teria então que verificar a existência de um diretório “.git / rebase-apply” ou verificar o índice de arquivos não mesclados (“git ls-files -u”) para testar se ficamos esperando para faça uma mesclagem.

Claro, se não há conflitos, então é fácil … está produzindo algo que também funciona quando não é fácil que é o problema: p

E isso não necessariamente aborda o que acontece se uma de suas ramificações for baseada em outra coisa … é por isso que mencionei usando “git pull –rebase”, porque isso seria rebase de acordo com a configuração da ramificação, não cegamente do mestre . Embora a detecção não seja baseada na configuração da ramificação … talvez seja mais fácil apenas verificar cada ramificação e fazer “git pull” e deixar que a configuração da ramificação lide com tudo, incluindo a possibilidade de rebase ou mesclagem?

Você sempre pode simplesmente escrever um shell de uma linha como esta:

 for branch in topic1 topic2 topic3;do git rebase master $branch;done 

Como os ramos de tópicos que você gostaria de rebase provavelmente mudarão ao longo do tempo, esta é uma solução rápida e direcional 🙂

Eu transformei isso em um script robusto, mantido em meu repository de extensões de 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 " ..."] [N] [-i|--interactive] [options]