Uma pergunta simples e agradável - a função de "git fetch" é um subconjunto estrito de git fetch --tags
?
Ou seja, se eu correr git fetch --tags
, existe alguma razão para correr imediatamente git fetch
logo depois?
Que tal git pull
e git pull --tags
? Mesma situação?
Respostas:
Nota: a partir do git 1.9 / 2.0 (primeiro trimestre de 2014) ,
git fetch --tags
busca tags além daquelas que são buscadas pela mesma linha de comando sem a opçãoVeja commit c5a84e9 de Michael Haggerty (mhagger) :
Como o Git 2.5 (segundo trimestre de 2015)
git pull --tags
é mais robusto:Ver commit 19d122b por Paul Tan (
pyokagan
) , 13 de maio de 2015.(Mesclado por Junio C Hamano -
gitster
- no commit cc77b99 , 22 de maio de 2015)Com o Git 2.11+ (quarto trimestre de 2016)
git fetch
é mais rápido.Veja commit 5827a03 (13 de outubro de 2016) por Jeff King (
peff
) .(Mesclado por Junio C Hamano -
gitster
- na confirmação 9fcd144 , 26 de outubro de 2016)Isso se aplica apenas a uma situação em que:
O Git 2.21 (fevereiro de 2019) parece ter introduzido uma regressão quando a configuração não
remote.origin.fetch
é a padrão ('+refs/heads/*:refs/remotes/origin/*'
)O Git 2.24 (quarto trimestre de 2019) adiciona outra otimização.
Veja commit b7e2d8b (15 set 2019) de Masaya Suzuki (
draftcode
) .(Incorporado por Junio C Hamano -
gitster
- in commit 1d8b0df , 07 out 2019)fonte
git fetch <remote> <branch>
tags de acompanhamento automático (uma vez que já atualiza os rastreamentos remotos CONTRA intenções originais): public-inbox.org/git/…Nota: esta resposta é válida apenas para o git v1.8 e anterior.
Muito disso foi dito nas outras respostas e comentários, mas aqui está uma explicação concisa:
git fetch
busca todas as cabeças de ramificação (ou todas especificadas pela opção de configuração remote.fetch), todas as confirmações necessárias para elas e todas as tags que são acessíveis a partir dessas ramificações. Na maioria dos casos, todas as tags são acessíveis dessa maneira.git fetch --tags
busca todas as tags, todas as confirmações necessárias para elas. Ele não atualizará os cabeçalhos das ramificações, mesmo que sejam acessíveis a partir das tags que foram buscadas.Resumo: se você realmente deseja estar totalmente atualizado, usando apenas a busca, você deve fazer as duas coisas.
Também não é "duas vezes mais lento", a menos que você queira digitar na linha de comando; nesse caso, os aliases resolvem o seu problema. Essencialmente, não há custos adicionais ao fazer os dois pedidos, pois eles estão solicitando informações diferentes.
fonte
git remote update
não é realmente um substituto paragit fetch
egit fetch --tags
.git remote update
não atualizará as tags existentes que foram alteradas, embora traga novas tags. Somentegit fetch --tags
atualizará as tags já existentes.Eu mesmo vou responder isso.
Eu determinei que há uma diferença. "git fetch --tags" pode trazer todas as tags, mas não traz nenhum novo commit!
Acontece que é preciso fazer isso para estar totalmente "atualizado", ou seja, replicado um "git pull" sem a mesclagem:
É uma pena, porque é duas vezes mais lento. Se apenas o "git fetch" tivesse a opção de fazer o que normalmente faz e trazer todas as tags.
fonte
git remote update myRemoteRepo
': isso buscaria conteúdo e tags remotos ?git fetch
isso o tempo todo e, consistentemente, retira todos os novos commit e novas tags. Qual versão do Git você está executando?git fetch
não pega tags que não estão no log de confirmação de uma ramificação. A interface do usuário do jQuery faz isso, por exemplo, em uma tag de lançamento. Fazemosgit checkout -b temp-branch
, fazemos nosso lançamento, adicionamos os arquivos necessários para o lançamento, atualizamos a versão etc., egit commit -m "1.10.x" ; git tag 1.10.x; git push --tags
depois excluímos nosso ramo temporário local. Não há ramificação remota que atinja essa tag egit fetch
nunca fará o download.O problema geral aqui é que
git fetch
será buscado+refs/heads/*:refs/remotes/$remote/*
. Se algum desses commits tiver tags, essas tags também serão buscadas. No entanto, se houver tags inacessíveis por qualquer filial no controle remoto, elas não serão buscadas.A
--tags
opção muda o refspec para+refs/tags/*:refs/tags/*
. Você pode pedirgit fetch
para pegar os dois. Tenho certeza de que, basta fazer um,git fetch && git fetch -t
você usaria o seguinte comando:E se você quiser tornar isso o padrão para este repositório, poderá adicionar um segundo refspec à busca padrão:
Isso adicionará uma segunda
fetch =
linha na.git/config
para este controle remoto.Passei um tempo procurando a maneira de lidar com isso em um projeto. Isto é o que eu vim com.
No meu caso, eu queria esses recursos
refs/*:refs/*
+
antes do refspec-u
-p
-f
fonte
--tags
opção alterna o refspec para+refs/tags/*:refs/tags/*
". Emboraman git-fetch
,, parece especificar esse refspec sem o líder+
(refs/tags/*:refs/tags/*
).remote.origin.fetch
o padrão+refs/heads/*:refs/remotes/origin/*
é, ou seja, a+
versão, não é? (O que significa, origem / ramo será substituído, não importa onde origem / filial é agora localmente.)git --tags
buscavam tags , além de todo o resto. Veja a resposta de @VonC.Na maioria das situações,
git fetch
deve fazer o que deseja, que é 'obter algo novo do repositório remoto e colocá-lo na sua cópia local sem mesclar-se às suas filiais locais'.git fetch --tags
faz exatamente isso, exceto que ele não recebe nada, exceto novas tags.Nesse sentido, não
git fetch --tags
é de forma alguma um superconjunto degit fetch
. Na verdade, é exatamente o oposto.git pull
, é claro, não passa de um invólucro para agit fetch <thisrefspec>; git merge
. É recomendável que você se acostume a fazer agit fetch
ing manual egit merge
ing antes de saltar paragit pull
simplesmente porque ajuda a entender o quegit pull
está fazendo em primeiro lugar.Dito isto, o relacionamento é exatamente o mesmo que com
git fetch
.git pull
é o superconjunto degit pull --tags
.fonte
git pull
se não obter todas as marcas, mas apenas aqueles acessível a partir das cabeças de filiais atuais. No entanto,git pull --tags
busca todas as tags e é aparentemente equivalente agit fetch --tags
.funciona muito bem, ele receberá apenas novas tags e não receberá nenhuma outra base de código.
fonte
upstream
é normalmente chamadoorigin
. Eu acho queupstream
é um nome usado pelo GitHub. De qualquer forma, o nome a ser usado é o mostrado porgit remote
.