como puxar em várias ramificações de uma só vez com o git?

10

Em um repositório, eu tenho várias ramificações, entre elas "master" e "develop", que são configuradas para rastrear ramificações remotas "origin / master" e "origin / develop".

É possível especificar que eu quero mestre e desenvolver para ser mesclado (avanço rápido) de uma só vez?

Quando eu faço git pull agora recebo algo assim:

remote: Counting objects: 92, done.
remote: Compressing objects: 100% (56/56), done.
remote: Total 70 (delta 29), reused 28 (delta 8)
Unpacking objects: 100% (70/70), done.
From scm.my-site.com:my-repo
   5386563..902fb45  develop    -> origin/develop
   d637d67..ba81fb2  master     -> origin/master
Updating 5386563..902fb45
Fast-forward

todas as ramificações remotas são buscadas, mas apenas a ramificação em que estou atualmente é mesclada com sua ramificação remota correspondente.

Então eu tenho que fazer git checkout master ...

Switched to branch 'master'
Your branch is behind 'origin/master' by 106 commits, and can be fast-forwarded.

... e, em seguida, git pull novamente e, em seguida, volte a desenvolver para obter o resultado desejado.

Eu sei que posso criar aliases / scripts que executem essas etapas. Mas eu quero evitar isso, se possível, pois é propenso a erros e não é muito eficiente .
Edit: ok, deixe-me reformular isso. Meu objetivo não era desestimular ou desaprovar a customização de script / alias do git. Eu preferiria apenas uma solução embutida se existir:)

    
por Superole 23.07.2013 / 17:37

3 respostas

8

Você pode configurar um alias que use git fetch com refspecs para avançar rapidamente suas ramificações com apenas um comando. Configure isso como um alias no seu usuário .gitconfig file:

[alias]
    sync = "!sh -c 'git checkout --quiet --detach HEAD && \
                    git fetch origin master:master develop:develop ; \
                    git checkout --quiet -'"

Uso: git sync .

Eis por que funciona:

  1. git checkout --quiet HEAD verifica diretamente o seu commit atual, colocando você no estado head desanexado . Dessa forma, se você estiver em master ou develop , você separará sua cópia de trabalho desses ponteiros de ramificação, permitindo que eles sejam movidos (o Git não permitirá que você mova as referências de ramificação enquanto sua cópia de trabalho as verificar out).

  2. git fetch origin master:master develop:develop usa refspecs com fetch para avançar rapidamente as ramificações master e develop em seu repositório local. A sintaxe diz basicamente ao Git "aqui está um refspec do formulário <source>:<destination> , pegue <destination> e avance rapidamente para o mesmo ponto que <source> ". Portanto, as origens no alias são as ramificações de origin , enquanto os destinos são as versões de repositório locais dessas ramificações.

  3. Por fim, git checkout --quiet - || git checkout --quiet - verifica o ramo em que você esteve por último, independentemente de haver ou não uma falha nos comandos anteriores. Então, se você estava em master quando você executou git sync , e tudo deu certo, você vai deixar o estado da cabeça desanexado e confira o recém atualizado master .

Veja também minha resposta para git: atualizar um ramo local sem verificar? .

    
por 03.08.2013 / 16:11
1

Instale git-up . Ele fornece o comando git-up , o qual puxará todas as ramificações locais em seu repositório.

    
por 17.11.2015 / 09:10
0

Parece que não há uma opção incorporada para o git entrar em várias ramificações. Pelo menos não na versão 1.8.0. Embora a resposta do @Cupcake esteja próxima disso.

No entanto, comentário do @jjlin me fez perceber que pelo menos eu não preciso puxar duas vezes.

Portanto, uma seqüência um pouco mais eficiente seria:

git pull
git checkout master
git merge origin/master
git checkout -
Inevitavelmente eu acabei criando um pseudônimo, mas decidi abandonar o assunto e me concentrei apenas no avanço rápido de um ramo diferente.

[alias]
ffwd = "!_() { git checkout $1 && git merge --ff-only origin/$1 && git checkout -; }; _"

É claro que, sem testar esse alias, pressupõe-se que eu forneça um nome válido de uma ramificação ff'able como primeiro argumento e, caso contrário, tenha um comportamento indefinido. Também não é ideal para casos de uso com mais de dois ramos, mas isso me dará o que eu preciso agora.

git pull
git ffwd master
    
por 08.08.2013 / 13:27

Tags