Geralmente, tenho pelo menos três filiais remotas: mestre, preparação e produção. Eu tenho três filiais locais que rastreiam essas filiais remotas.
Atualizar todas as minhas filiais locais é entediante:
git fetch --all
git rebase origin/master
git checkout staging
git rebase origin/staging
git checkout production
git rebase origin/production
Eu adoraria poder fazer um "git pull-all", mas não consegui fazê-lo funcionar. Parece fazer uma "busca - tudo" e, em seguida, atualiza (avanço rápido ou mescla) o ramo de trabalho atual, mas não os outros ramos locais.
Ainda estou preso alternando manualmente para cada filial local e atualizando.
Respostas:
O comportamento para o qual você descreve
pull --all
é exatamente como o esperado, embora não seja necessariamente útil. A opção é passada para o git fetch, que busca todos os refs de todos os controles remotos, em vez do necessário;pull
depois mescla (ou, no seu caso, rebase) a ramificação única apropriada.Se você quiser conferir outras filiais, precisará verificá-las. E sim, a mesclagem (e a reformulação) exige absolutamente uma árvore de trabalho, para que não possam ser feitas sem verificar os outros ramos. Você pode agrupar as etapas descritas em um script / alias, se quiser, embora eu sugira associar os comandos
&&
para que, caso um deles falhe, ele não tente seguir adiante.fonte
Eu uso o
sync
subcomando do hub para automatizar isso. Eu tenhoalias git=hub
no meu.bash_profile
, então o comando que eu digito é:Isso atualiza todas as ramificações locais que possuem uma ramificação upstream correspondente. Na página do manual:
Ele também lida com as alterações não confirmadas ocultas / desimpedidas na ramificação atual.
Eu costumava usar uma ferramenta semelhante chamada git-up , mas não é mais mantida e
git sync
faz quase exatamente a mesma coisa.fonte
git config --global git-up.rebase.auto false
.Sei que esta pergunta tem quase 3 anos, mas me perguntei a mesma pergunta e não encontrei nenhuma solução pronta. Então, eu criei um script de shell de comando git personalizado.
Aqui está, o
git-ffwd-update
script faz o seguinte ...git remote update
para buscar as revs latesgit remote show
para obter uma lista de ramificações locais que rastreiam uma ramificação remota (por exemplo, ramificações que podem ser usadas comgit pull
)git rev-list --count <REMOTE_BRANCH>..<LOCAL_BRANCH>
quantos commit a filial local está atrás do controle remoto (e vice-versa)git branch -f <LOCAL_BRANCH> -t <REMOTE_BRANCH>
o script pode ser chamado como:
O script completo deve ser salvo como
git-ffwd-update
e precisa estar noPATH
.fonte
git branch
chamada. Eu removi o -l para alterar a chamadagit branch -f $LB -t $ARB >/dev/null;
e agora o script funciona como deveria.Não é tão difícil de automatizar:
fonte
git rebase origin/$branch
paragit pull
, para que ele seja buscado no ramo de rastreamento apropriado (presumivelmente na origem) e seja mesclado ou reformulado conforme determinado pela configuração.fetch
. Editou; recursos / correções extras, tudo o que for necessário para o OP.pull
(ou verificarbranch.<branch>.rebase
), para não refazer acidentalmente um ramo que está configurado para puxar normalmente (mesclagem).set -e
vez de|| exit 1
para fazer o intérprete sair no primeiro erro.Isso ainda não é automático, como eu gostaria que houvesse uma opção para - e deve haver alguma verificação para garantir que isso só ocorra em atualizações de avanço rápido (e é por isso que fazer um pull manualmente é muito mais seguro !!), mas ressalvas, você pode:
para atualizar a posição de sua filial local sem precisar fazer check-out.
Nota: você estará perdendo sua posição atual de ramificação e movendo-a para onde está a ramificação de origem, o que significa que, se você precisar mesclar, perderá dados!
fonte
git fetch origin other-branch:other-branch
Há muitas respostas aqui, mas nenhuma é usada
git-fetch
para atualizar diretamente a referência local, o que é muito mais simples do que verificar filiais e mais segura do quegit-update-ref
.Aqui usamos
git-fetch
para atualizar ramificações não atuais egit pull --ff-only
para a ramificação atual. Isto:e aqui está:
Na página de manual para
git-fetch
:Ao especificar
git fetch <remote> <ref>:<ref>
(sem nenhum+
), obtemos uma busca que atualiza a ref local apenas quando ela pode ser encaminhada rapidamente.Nota : isso pressupõe que as ramificações locais e remotas tenham o mesmo nome (e que você deseja rastrear todas as ramificações); deve realmente usar informações sobre quais ramificações locais você possui e o que elas estão configuradas para rastrear.
fonte
c*n
etapas (em vez de 1), ondec
há algum número de comandos repetidos en
o número de ramificações.git branch -r | grep -v ' -> ' | while read remotebranch
paragit branch -r | grep -v ' -> ' | grep -f <(git branch | cut -c 3- | awk '{print "\\S*/"$0"$"}') | while read remotebranch
limitá-lo a ramos que eu já tenho localmente. Também adicionei umgit fetch --prune
no início para atualizar a lista de ramificações remotas antes de fazer qualquer coisa, o que evita alguns avisos.Esse problema ainda não está resolvido, pelo menos não com facilidade / sem script: veja este post na lista de discussão git de Junio C Hamano explicando a situação e fornecendo uma solução simples.
O principal raciocínio é que você não precisa disso:
A chamada para uma solução era uma opção ou script externo para remover as ramificações locais que seguem agora as ramificações de rastreamento remoto, em vez de mantê-las atualizadas pelo avanço rápido, como o pôster original solicitado.
Nota: a partir do git 2.10, essa solução não existe. Observe que o
git remote prune
subcomando, egit fetch --prune
trata da remoção da ramificação de rastreamento remoto da ramificação que não existe mais no controle remoto, não trata da remoção da ramificação local que rastreia a ramificação de rastreamento remoto (para a qual a ramificação de rastreamento remoto é a ramificação upstream).fonte
Há muitas respostas aceitáveis aqui, mas parte do encanamento pode ser um pouco opaca para os não iniciados. Aqui está um exemplo muito mais simples que pode ser facilmente personalizado:
Se você adicionar
~/bin/git
ao seuPATH
(assumindo que o arquivo seja~/bin/git/git-update-all
), basta executar:fonte
Adicionar este script para
.profile
no Mac OS X:fonte
Aqui está uma boa resposta: Como buscar todos os ramos git
fonte
git fetch
egit pull
, em vez de apenasgit pull
?origin/
prefixoUm script que escrevi para o meu GitBash . Realiza o seguinte:
git checkout branch
git pull origin
** Eu uso isso, mas não testei completamente, use por sua conta e risco. Veja um exemplo desse script em um arquivo .bash_alias aqui .
fonte
Se você estiver no Windows, poderá usar o PyGitUp, que é um clone do
git-up
Python. Você pode instalá-lo usando pip compip install --user git-up
ou através do Scoop usandoscoop install git-up
[
fonte
Apenas postando uma resposta atualizada.
git-up
não é mais mantido e, se você ler a documentação, eles mencionam que a funcionalidade agora está disponível no git .Você também pode definir isso para todos os
git pull
itens do Git 2.9 (obrigado @VonC, veja a resposta aqui )fonte
git-up
documentação porque eles não mencionar quegit-up
.git-up
:)Me deparei com o mesmo problema desta pergunta ...
Pensando nisso, fiz uma pequena função de alias dentro do meu
.bashrc
arquivo:Trabalhou para mim (:
fonte
Se refs / heads / master puder ser encaminhado rapidamente para refs / remotes / foo / master , a saída de
deve retornar o ID SHA1 ao qual refs / heads / master aponta. Com isso, é possível montar um script que atualize automaticamente todas as ramificações locais que não tiveram confirmação de desvio aplicada a elas.
Este pequeno script de shell (eu chamei de git-can-ff ) ilustra como isso pode ser feito.
fonte
Para concluir a resposta de Matt Connolly, esta é uma maneira mais segura de atualizar as referências da filial local que podem ser encaminhadas rapidamente, sem fazer check-out da filial. Ele não atualiza ramificações que não podem ser encaminhadas rapidamente (ou seja, que divergiram) e não atualiza a ramificação que está com check-out no momento (porque a cópia de trabalho também deve ser atualizada).
fonte
Um script um pouco diferente que apenas encaminha antecipadamente ramificações cujos nomes correspondem à ramificação upstream. Ele também atualiza a ramificação atual, se for possível avançar rapidamente.
Verifique se todas as ramificações upstream de suas ramificações estão definidas corretamente executando
git branch -vv
. Defina o ramo upstream comgit branch -u origin/yourbanchname
Copie e cole em um arquivo e chmod 755:
fonte
O one-liner a seguir encaminha rapidamente todas as ramificações que possuem uma ramificação upstream, se possível, e imprime um erro caso contrário:
Como funciona?
Ele usa um formato personalizado com o
git branch
comando Para cada ramificação que possui uma ramificação upstream, ela imprime uma linha com o seguinte padrão:Isso pode ser canalizado diretamente
sh
(assumindo que os nomes das ramificações estejam bem formados). Omita o| sh
para ver o que está fazendo.Ressalvas
O one-liner não entrará em contato com seus controles remotos. Emita um
git fetch
ougit fetch --all
antes de executá-lo.A filial com check-out atualmente não será atualizada com uma mensagem como
Para isso, você pode recorrer a regular
git pull --ff-only
.Alias
Adicione o seguinte ao seu
.gitconfig
paragit fft
executar este comando:Veja também o meu
.gitconfig
. O alias é uma abreviação de "fast-forward tracking (branches)".fonte
hub
soluction propsed por @ John para ele é a melhor saída.git push
fato de ser totalmente o oposto do que você esperaria. Qual o segredo?git push
?git push
tem semântica de upload - Eu tenho alguns commits localmente que desejo enviar upstream.git pull
tem semântica de download - quero obter algumas confirmações remotas upstream na minha filial local. Como estamos falando sobre o download de novos commits do controle remoto para o local,git pull
é a escolha óbvia. Mas não, esse truque usagit push
. Comogit push
resulta em mudanças remotas na minha filial local ?!git push
também pode ser usado para atualizar ramificações locais, desde que seja uma atualização de avanço rápido.O script de @larsmans, melhorou um pouco:
Depois que termina, deixa a cópia de trabalho com check-out do mesmo ramo que estava antes do nome do script.
A
git pull
versão:fonte
Parece que muitos outros contribuíram com soluções semelhantes, mas pensei em compartilhar o que descobri e convidar outras pessoas a contribuir. Esta solução possui uma boa saída colorida, lida com o seu diretório de trabalho atual graciosamente e é rápida porque não faz checkout e deixa seu diretório de trabalho intacto. Além disso, é apenas um script de shell sem outras dependências além do git. (testado apenas no OSX até agora)
https://github.com/davestimpert/gitup
Desculpe, também parece ter surgido com o mesmo nome da outra ferramenta acima.
fonte
Isso pode ser feito usando o script abaixo ... Ele primeiro buscará todos os ramos e fará o checkout um por um e atualizará por si próprio.
fonte
Você não pode fazer isso com apenas um comando git, mas pode automatizá-lo com uma linha bash.
Para atualizar com segurança todos os ramos com uma linha, eis o que eu faço:
Se não conseguir avançar rapidamente um ramo ou encontrar um erro, ele o interromperá e o deixará nesse ramo, para que você possa retomar o controle e mesclar manualmente.
Se todas as ramificações puderem avançar rapidamente, ela terminará com a ramificação em que você estava atualmente, deixando-o onde estava antes de atualizar.
Explicações:
Para uma melhor legibilidade, ele pode ser dividido em várias linhas:
git fetch --all && ...
=> Busca todas as referências de todos os controles remotos e continua com o próximo comando, se não houver erro.git branch | sed '/*/{$q;h;d};$G' | tr -d '*'
=> Na saída degit branch
,sed
pegue a linha com a*
e mova-a para o final (para que a ramificação atual seja atualizada por último). Em seguida,tr
basta remover o*
.for branch in $(...) ; do git checkout $branch && git merge --ff-only || break ; done
=> Para cada nome de ramificação obtido do comando anterior, faça check-out dessa ramificação e tente mesclar com um avanço rápido. Se falhar,break
é chamado e o comando para aqui.Claro, você pode substituir
git merge --ff-only
porgit rebase
se é o que você deseja.Finalmente, você pode colocá-lo no seu bashrc como um alias:
Ou, se você tem medo de estragar o 'e ", ou simplesmente prefere manter a legibilidade sintática no seu editor, pode declarar isso como uma função:
Bônus:
Para aqueles que gostariam da explicação da
sed '/*/{$q;h;d};$G'
parte:/*/
=> Procure a linha com a*
.{$q
=> Se estiver na última linha, saia (não precisamos fazer nada porque o ramo atual já é o último na lista).;h;d}
=> Caso contrário, armazene a linha no buffer de espera e exclua-a na posição atual da lista.;$G
=> Quando atingir a última linha, acrescente o conteúdo do buffer de retenção.fonte
&&
colocando-oset -e
no topo do script.Não, eu não posso. Para o avanço rápido, acabei de escrever uma pequena ferramenta para fazer isso. https://github.com/changyuheng/git-fast-forward-all
Vantagens desta ferramenta:
hub sync
não suporta vários controles remotos no momento.)fonte
git fetch . refspec
. O.
diz para buscar a partir do repositório atual em vez do um controle remoto.A partir do git 2.9:
git pull --rebase --autostash
Consulte https://git-scm.com/docs/git-rebase
fonte
De fato, com o git
version 1.8.3.1
, ele funciona:Na ramificação mestre, você pode atualizar todas as outras ramificações. @Cascabel
Eu não sei qual versão quebrar / corrigi-lo, em 2.17 (que eu uso), ele pode funcionar.
fonte