git pull

O comando git pull é usado para ir buscar e descarregar conteúdo de um repositório remoto e actualizar imediatamente o repositório local para corresponder a esse conteúdo. A fusão de alterações remotas a montante no seu repositório local é uma tarefa comum nos fluxos de trabalho de colaboração baseados em Git. O comando git pull é na realidade uma combinação de dois outros comandos, git fetch seguido por git merge. Na primeira fase da operação git pull executará um git fetch escopado para a sucursal local que HEAD é apontado. Uma vez descarregado o conteúdo, git pull irá entrar num fluxo de trabalho de fusão. Um novo commit da fusão será criado e HEAD actualizado para apontar para o novo commit.

Git pull usage

The git pull command first runs git fetch which downloads content from the specified remote repository. Depois é executado um git merge para fundir o conteúdo remoto refs e cabeças num novo commit local de fusão. Para melhor demonstrar o processo de puxar e fundir, vamos considerar o seguinte exemplo. Suponha que temos um repositório com um ramo mestre e uma origem remota.

Neste cenário, git pull irá descarregar todas as alterações a partir do ponto em que o local e o mestre divergiram. Neste exemplo, esse ponto é E. git pull irá buscar os compromissos remotos divergentes que são A-B-C. O processo pull irá então criar um novo commit local de fusão contendo o conteúdo dos novos commits remotos divergentes.

No diagrama acima, podemos ver o novo commit H. Este commit é um novo commit de fusão que contém o conteúdo dos commits remotos A-B-C e tem uma mensagem de registo combinada. Este exemplo é um dos poucos git pull estratégias de fusão. A --rebase opção pode ser passada para git pull para usar uma estratégia de fusão de rebase em vez de um commit de fusão. O exemplo seguinte irá demonstrar como funciona um rebase pull. Suponha que estamos num ponto inicial do nosso primeiro diagrama, e que executámos git pull --rebase.

Neste diagrama, podemos agora ver que um rebase pull não cria o novo commit H. Em vez disso, o rebase copiou os commits remotos A–B–C e reescreveu os commits locais E–F–G para aparecer depois deles no histórico de commits de origem local/master.

Opções Comuns

git pull <remote>

p>Vai buscar a cópia do remoto especificado do ramo actual e funde-a imediatamente na cópia local. Isto é o mesmo que git fetch <remote> seguido por git merge origin/<current-branch>.

git pull --no-commit <remote>

Simples à invocação padrão, vai buscar o conteúdo remoto mas não cria um novo compromisso de fusão.

git pull --rebase <remote>

O mesmo que o anterior em vez de usar git merge para integrar o ramo remoto com o local, usar git rebase.

git pull --verbose

Dê saída verbosa durante um puxão que mostra o conteúdo a ser descarregado e os detalhes da fusão.

Git pull discussion

P>Pode pensar em git pull como a versão de Git de svn update. É uma forma fácil de sincronizar o seu repositório local com as alterações a montante. O diagrama seguinte explica cada passo do processo de puxar.

Começa a pensar que o seu repositório está sincronizado, mas depois git fetch revela que a versão de origem do master progrediu desde a última vez que a verificou. Então git merge integra imediatamente o master remoto no local.

Git pull and syncing

git pull é um dos muitos comandos que reivindicam a responsabilidade de ‘sincronizar’ o conteúdo remoto. O comando git remote é utilizado para especificar em que pontos finais remotos os comandos de sincronização irão funcionar. O comando git push command é utilizado para carregar conteúdo para um repositório remoto.

O comando git fetch pode ser confundido com git pull. Ambos são utilizados para descarregar conteúdo remoto. Uma importante distinção de segurança pode ser feita entre git pull e get fetchgit fetch pode ser considerada a opção “segura” enquanto que, git pull pode ser considerada insegura. git fetch irá descarregar o conteúdo remoto e não alterará o estado do repositório local. Alternativamente, git pull descarregará o conteúdo remoto e tentará imediatamente alterar o estado local para corresponder a esse conteúdo. Isto pode causar involuntariamente que o repositório local fique num estado conflituoso.

Puxar via Rebase

A opção --rebase pode ser usada para assegurar um histórico linear, impedindo compromissos de fusão desnecessários. Muitos programadores preferem a rebase à fusão, uma vez que é como dizer: “Quero pôr as minhas alterações em cima do que todos os outros fizeram”. Neste sentido, usando git pull com o --rebase bandeira é ainda mais parecido com svn update do que um simples git pull.

Na verdade, puxar com --rebase é um fluxo de trabalho tão comum que existe uma opção de configuração dedicada para ele:

git config --global branch.autosetuprebase always

Após executar esse comando, todos os comandos git pull serão integrados através de git rebase em vez de git merge.

Git Pull Examples

Os exemplos seguintes demonstram como utilizar git pull em cenários comuns:

Comportamento por defeito

git pull

Executar a invocação por defeito de git pull será equivalente a git fetch origin HEAD e git merge HEAD onde HEAD está a apontar para o ramo actual.

Git pull on remotes

git checkout new_feature
git pull <remote repo>

Este exemplo executa primeiro um checkout e muda para o ramo. Depois disso, o git pull é executado com ser passado. Isto irá implicitamente puxar para baixo o ramo da nova funcionalidade a partir de . Uma vez concluída a descarga, iniciará um git merge.

Git pull rebase em vez de merge

O exemplo seguinte demonstra como sincronizar com o ramo principal do repositório central usando um rebase:

git checkout master
git pull --rebase origin

Isto simplesmente move as suas alterações locais para o topo do que todos os outros já contribuíram.