como puxar para vários ramos de uma só vez com git?


13

Em um repositório, tenho várias ramificações, entre elas "mestre" e "desenvolvimento", configuradas para rastrear ramificações remotas "origem / mestre" e "origem / desenvolvimento".

É possível especificar que eu quero que o mestre e o desenvolvimento sejam mesclados (avanço rápido) de uma só vez?

Quando eu faço git pullagora, recebo algo parecido com isto:

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 depois git pullnovamente e, em seguida, volte a desenvolver, para obter o resultado desejado.

Eu sei que posso criar aliases / scripts que executam essas etapas. Mas 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 desencorajar ou desaprovar a personalização de script / alias do git. Eu preferiria apenas uma solução embutida, se existir :)


Eu tentei git pull origin refs/heads/develop:refs/remotes/origin/develop refs/heads/master:refs/remotes/origin/master, mas que causou o mestre remoto a ser incorporado desenvolver ..
Superole

1
Por que seria propenso a erros ou ineficiente? O Git deve ser personalizado assim. BTW, para evitar a necessidade de verificar cada ramificação, convém dividir sua pullem uma fetchseguida por uma mergeem cada ramificação.
Jjlin 23/07

@jjlin bem, se eu posso fazê-lo sem verificar cada ramo que pode ajudar na eficiência. É propenso a erros, porque a matriz de coisas que podem dar errado e os efeitos que ela pode ter no restante do script são um pouco complexos. Não estou dizendo que é inviável torná-lo seguro, mas seria uma troca. Então, eu preferiria uma solução
embutida

Respostas:


11

Você pode configurar um alias usado git fetchcom refspecs para avançar rapidamente mesclar suas ramificações com apenas um comando. Configure isso como um alias no seu .gitconfigarquivo de usuário :

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

Uso: git sync.

Aqui está o porquê de funcionar:

  1. git checkout --quiet HEADverifica diretamente seu commit atual, colocando você no estado principal desanexado . Dessa forma, se você estiver ativo masterou developdesanexar 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 estiver com check-out).

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

  3. Finalmente, git checkout --quiet -verifique 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 masterquando executou git sync, e tudo for bem sucedido, você vai deixar de estado cabeça destacada e confira o recém-atualizado master.

Veja também minha resposta ao git: atualizar uma ramificação local sem fazer check-out? .


Eu não entendo bem a mágica desanexada aqui, por que o ponteiro a dominar não pode ser movido quando o desenvolvimento é verificado? ... de qualquer maneira eu tentei isso, e parece funcionar, exceto que agora eu recebo "Sua ramificação está à frente de 'origin / develop' por 1 commit."
Superole 6/08/2013

... que é resolvido na próxima vez que eu puxar
Superole

@Superole qual ramo está à frente origin/developquando você usa o alias? Não faria sentido se fosse sua developfilial local . Além disso, o ponteiro para master pode ser movido se developestiver com check-out; o ponto é que, se masterestiver com check-out, não será possível avançar rapidamente masterporque isso afetaria sua cópia de trabalho; é por isso que você desanexou a cópia de trabalho. dele primeiro usando git checkout head. Eu vi outra resposta que a descreveu como "em pé em uma pedra"; você precisa sair da pedra antes de poder movê-la.
40XUserNotFound

foi realmente meu desenvolvimento local. E o motivo deve ser que essa busca não atualiza as ramificações de rastreamento. Como eu entendo; um puxão buscará na origem / desenvolvimento e, depois, mesclará isso no desenvolvimento.
Superole 8/08/13

É muito importante que essa resposta cause fatal: bad config line xx in file xxx. que é causado pelo ponto e vírgula. você precisa colocar o comando inteiro entre aspas duplas para evitar esse problema.
William Leung

1

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


doce! Vou verificar isso com certeza.
Superole 27/11/2015

2
heh: P As declarações de suporte do Windows estão previsivelmente ausentes. e ainda é preciso formular uma prova rigorosa de que definitivamente não mexerá com sua configuração do git, excluirá dados ou publicará comentários irrelevantes no Hacker News em seu nome. , combinado com a necessidade de Ruby, me afastou. Eu gosto do conceito embora.
Superole 27/11

Fico feliz há um método em tudo ... kinda sucky, no entanto, que cada método único exige alguns ferramenta de terceiros. Como este e os que possuem algum comando de shell "receita" ou um apelido usando um shell específico (específico da plataforma).
0xC0000022L 14/02

0

Parece que não há uma opção integrada para o git entrar em vários ramos. Pelo menos não na versão 1.8.0. embora a resposta do @ Cupcake esteja próxima disso.

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

Portanto, uma sequência um pouco mais eficiente seria:

git pull
git checkout master
git merge origin/master
git checkout -

Inevitavelmente, acabei criando um alias, mas decidi deixar de lado o problema e me concentrei em avançar rapidamente em um ramo diferente.

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

Obviamente, sem teste, esse alias pressupõe que eu forneça um nome válido de um ramo ff'able como 1º argumento e, de outra forma, tenha comportamento indefinido. Também não é ideal para casos de uso com mais de duas ramificações, mas vai me dar o que eu preciso por enquanto.

git pull
git ffwd master
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.