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.
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.
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.
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.
git remote add origin git@github.com:ajudadoprogramador/git-remoto.git
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.
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.
git push origin master
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:
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.
git pull origin master
O comando acima terá o retorno:
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.
git fetch
O retorno será:
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.
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.
git merge origin/teste
git push origin master
Agora o projeto está atualizado e idêntico ao repositório remoto como visto no log:
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.
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:
git push origin branch_d
Pronto, nosso Branch foi enviado como mostra o log:
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
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.
git fetch
git merge origin/master
O retorno do merge será:
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.
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:
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.