Trabalhando com repositórios remotos com o GIT usando o Git Hub ou Git Lab.

Vamos trabalhar com repositórios remotos usando os sistemas do Git Hub ou Git Lab usando os comandos push, pull, fetch, entre outros.

Autor: André Rodrigues

2192

CONTEÚDO

Olá amigos, tudo bem?

Trabalhar com o GIT localmente é possível, mas o seu grande poder vem do trabalho com repositórios remotos. Existem vários repositórios on-line dos quais sempre indico 2, o Git Hub e o Git Lab. Nos nossos artigos, iremos usar o Git Hub como padrão.

O Git Lab é muito bom e te dá repositórios privados gratuitos, ao contrário do Git Hub, que só tem repositórios privados em sua versão paga. A escolha do Git Hub é apenas por ser usado por mais pessoas. Fique a vontade para escolher qualquer um dos 2 ou outra opção.

Antes de começar, você leu nossos artigos sobre "Trabalhando localmente com o GIT." e "Trabalhando com log no GIT."? Seria muito bom você ter lido antes de continuar esse artigo.

Preparando tudo

Primeiro, vamos preparar tudo para fazer nosso primeiro push no repositório remoto.

Terminal
git init
echo A > a.txt
echo B > b.txt
git add .
git commit -m "Commit inicial"

Estamos prontos para configurar nosso repositório remoto. Primeiro, entre no seu repositorio remoto e pegue o link do projeto. Nós sempre usamos a versão com SSH. Depois disso iremos adicionar o link pelo comando git remote.

Terminal
git remote add origin git@github.com:ajudadoprogramador/git-remoto.git
Entendendo o comando:
git remote = Comando.
add = Adicionar remoto.
origin = Nome padrão do repositório.
git@github.com... = Link do repositório.

Para ver seu repositório adicionado, use o comando git remote -v.

Terminal
git remote -v
origin	git@github.com:ajudadoprogramador/git-remoto.git (fetch)
origin	git@github.com:ajudadoprogramador/git-remoto.git (push)

Enviando para repositório remoto

Com tudo pronto, iremos subir nosso primeiro commit no repositório remoto. Para isso, iremos usar o comando git push.

Terminal
git push origin master
Entendendo o comando:
git push = Comando.
origin = Repositório local.
master = Master on-line.

Assim que executar o comando basta colocar a senha da sua chave pública (Se for configurado por chave pública) e continuar. Quando terminar o processo de upload o retorno será assim:

Terminal
git push origin master
Counting objects: 4, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (4/4), 257 bytes | 0 bytes/s, done.
Total 4 (delta 0), reused 0 (delta 0)
To github.com:ajudadoprogramador/git-remoto.git
 * [new branch]      master -> master

Ao final do processo, será criado um novo Branch master em seu repositório remoto e seu projeto já pode ser acessado por qualquer pessoa.

Fazendo download do projeto com PULL

Agora que temos um projeto no ar, iremos copiar os arquivos dele. Para isso, temos 2 formas de fazer: a primeira é usando o git pull. Para simular o pull, foi criar o arquivo README no repositório remoto. Com isso, meu repositório local está atrás do remoto e precisa ser atualizado.

Terminal
git pull origin master

O comando acima terá o retorno:

Terminal
git pull origin master
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
From github.com:ajudadoprogramador/git-remoto
 * branch            master     -> FETCH_HEAD
   0ea4429..9d292cd  master     -> origin/master
Updating 0ea4429..9d292cd
Fast-forward
 README.md | 6 ++++++
 1 file changed, 6 insertions(+)
 create mode 100644 README.md

Como podemos ver, o retorno acima mostra o download do arquivo README.md com 6 linhas e deixa o nosso repositório local idêntico ao repositório remoto.

Fazendo download do projeto com FETCH

O outro modo de atualizar seu projeto é através do comando git fetch. Vamos imaginar que alguém fez alguma alteração no repositório remoto mas não subiu no master e sim em um Branch. Quando você executar o comando git pull origin master, ele não vai atualizar seu projeto porque as alterações estão em outro branch.

Para simular o fetch, foi criado um Branch chamado teste no repositório remoto com o arquivo teste.php:

teste.php

Agora use o git fetch para atualizar o projeto.

Terminal
git fetch

O retorno será:

Terminal
git fetch
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
From github.com:ajudadoprogramador/git-remoto
 * [new branch]      teste      -> origin/teste

Como podemos ver, foi criado um Branch chamado origin/teste. Todo Branch baixado do repositório remoto começa com o a string "origin/". Se dermos um log em nosso repositório local, veremos melhor como está nosso repositório local e remoto.

Terminal
git log --oneline --decorate --all --graph
* 22c6bdb (origin/teste) Criacao do teste.php
* 9d292cd (HEAD -> master, origin/master) Criacao do README
* 0ea4429 Commit inicial

O Branch master local e o remoto (origin/master) estão apontados para o mesmo local junto do HEAD e o Branch origin/teste está na frente do nosso master. Agora podemos dar um Merge e subir a alteração para o repositório remoto.

Terminal
git merge origin/teste
git push origin master

Agora o projeto está atualizado e idêntico ao repositório remoto como visto no log:

Terminal
git log --oneline --decorate --all --graph
* 22c6bdb (HEAD -> master, origin/teste, origin/master) Criacao do teste.php
* 9d292cd Criacao do README
* 0ea4429 Commit inicial

IMPORTANTE

Tente usar sempre o Fetch. O Pull além de não baixar os branches do repositório remoto ao fazer o download, dá Merge automaticamente, se tudo estiver certo, não vai ter problema, mas se tiver algum conflito, ele dará o Merge e você vai ter que resolver o conflito direto no master.

Enviado Branch para repositório remoto

As vezes é preciso enviar um Branch local para o repositório remoto. Para isso, basta mudar o comando do push passando o Branch desejado. Primeiro, vamos preparar o ambiente.

Terminal
git checkout -b branch_d
echo D > d.txt
git add d.txt
git commit -m "Adicionar arquivo d.txt"

Agora vamos dar o push:

Terminal
git push origin branch_d

Pronto, nosso Branch foi enviado como mostra o log:

Terminal
git log --oneline --decorate --all --graph
* e178806 (HEAD -> branch_d, origin/branch_d) Adicionar arquivo d.txt
* 22c6bdb (origin/teste, origin/master, master) Criacao do teste.php
* 9d292cd Criacao do README
* 0ea4429 Commit inicial

Resolvendo conflitos

Chegamos na parte que dá muita dor de cabeça para alguns: a hora de resolver os conflitos. Para isso alterei o arquivo teste.php do repositório remoto para:

teste.php

Agora vamos mudar o arquivo teste.php no repositório local e comitar a alteração:

teste.php

Terminal
git add teste.php
git commit -m "Mudanca no teste.php no local"

Terminado isso, vamos agir normalmente, fazer o fetch e tentar dar o merge.

Terminal
git fetch
git merge origin/master

O retorno do merge será:

Terminal
git merge origin/master
Auto-merging teste.php
CONFLICT (content): Merge conflict in teste.php
Automatic merge failed; fix conflicts and then commit the result.

O retorno informa que existe um conflito no arquivo teste.php e que o auto Merge falhou. Se você acessar o arquivo teste.php ele estará dessa forma:

teste.php

Temos que corrigir o conflito e comitar o resultado. O arquivo fica dividido entre "<<<<<<< HEAD" e "=======", que são os scripts que estão em seu repositório local, e "=======" e ">>>>>>> origin/master", que são os scripts que estão no seu repositório remoto.

Para corrigir o conflito, iremos deletar a segunda parte entre o "=======" e ">>>>>>> origin/master" e deletar o "<<<<<<< HEAD", deixando apenas o script que estava no nosso arquivo local. Com isso, as linhas 4, 8, 9, 10, 11e 12 serão apagadas. Agora basta comitar o resultado e enviar para o repositório remoto.

Terminal
git add teste.php
git commit -m "Correcao do conflito do teste.php"
git push origin master

Pronto, tudo foi resolvido e enviado para o repositório remoto, como podemos ver no retorno:

Terminal
git push origin master
Counting objects: 4, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 480 bytes | 0 bytes/s, done.
Total 4 (delta 2), reused 0 (delta 0)
remote: Resolving deltas: 100% (2/2), completed with 1 local object.
To github.com:ajudadoprogramador/git-remoto.git
   2d21897..70515e0  master -> master

IMPORTANTE

O conflito pode ser resolvido usando algum programa com interface gráfica, aqui é usado o Editor Atom (Desenvolvido pelo GitHub), que já vem com esse suporte.

Pronto pequeno Padawan! Agora você está pronto para usar o GIT e resolver a maioria dos problemas. Esse artigo ficou grande mas não abordou tudo o que podia, eu sugiro a leitura da documentação do GIT para entender melhor o seu funcionamento. Tenho certeza que com o uso diário, você vai ter várias dúvidas e, só assim, você vai conseguir usar o GIT de forma eficaz.

Quer aprender tudo sobre o GIT? Clique aqui e veja todos os artigos.

AGUARDE
CARREGANDO SITE