Tutorial simples: Como usar o git e o github

Ultimamente estou envolvido em vários projetos ao mesmo tempo com várias equipes diferentes, então controle de versão é essencial.

Segue um manualzinho básico para iniciar com o git, espero atualizar e complementar este passo-a-passo com mais exemplos logo.

O git serve para versionamento local, você pode compartilhar de algumas maneiras, a mais fácil é com serviços online. Neste exemplo vou usar o github, testei também o projectlocker, que dá repositórios private grátis,  mas não gostei. Outro que parece legal é o Codaset, ainda não testei.

1) Instalar git

1
$ sudo apt-get install git-core

É necessário gerar uma chave ssh e fazer um cadastro em algum repositório git. ( Esta etapa não é exatamente sobre o git, mas sobre a segurança dos repositórios. )

Confira se vc já tem alguma chave com um "ls ~/.ssh/", se já existir uma você pode utilizá-la ou gerar uma nova:

1
ssh-keygen -t rsa -C "comment"

"comment" é só um lembrete para saber do que se trata a chave, normalmente usa-se o seu nome de usuário do serviço que vai usar, por exemplo o github.

Falando nisso, está na hora de criar um usuário lá (http://github.com), vai lá que eu espero…

Depois de logado vá para https://github.com/account e clique em "SSH Public Keys" e "add another public key". A cópia da chave precisa ser exata(eu ia escrever que 'precisa ser precisa' mas é feio né), então pode-se fazer assim:

1
2
sudo apt-get install xclip
cat ~/.ssh/id_rsa.pub | xclip -sel clip

Aí é só colar com um Ctrl+V normal. Agora já dá para se comunicar com o github:

1
ssh git@github.com

Vai aparecer "ERROR: Hi codexico! You've successfully authenticated, but GitHub does not provide shell access", não se assuste com o ERROR, o que interessa é que o github te reconheceu. Qualquer duvida tem o help do github: Generating SSH keys (Linux).

Por padrão o git vai pegar o usuário do sistema, para que seu nome de usuário do github apareça corretamente use os comandos:

1
2
git config --global user.name "Your Name"
git config --global user.email codexico@gmail.com

2) Criar Projeto no github

1) Podemos criar um novo projeto ou usar um existente. Para criar um novo vá até o github e no alto da página clique em "Dashboard" e depois em "New Repository".

Crie um espaço para o projeto no comnputador:

1
2
$ mkdir nomedoprojeto
$ cd nomedodiretorio

2) Iniciar um git neste diretório:

1
$ git init

Saída do comando:

1
Initialized empty Git repository in /nomedodiretorio/.git/

Deve aparecer um diretorio oculto .git, neste .git ficam as configurações que serão usadas para este projeto.

Por exemplo:

1
2
3
$ ls .git
branches config description FETCH_HEAD HEAD hooks index info logs
objects refs

3) Adicionar o repositório, neste exemplo vou usar um que criei para este tutorial, pode ser também o repositório criado no passo 1, o endereço fica na página do projeto (neste caso https://github.com/codexico/tutorial-github):

1
$ git remote add origin git@github.com:codexico/tutorial-github.git

Formato do comando:

"git remote add" adiciona um repositório ao git que foi iniciado neste diretório, "origin" é o apelido para o projeto, "git@github.com:codexico/tutorial-github.git" é o endereço do projeto.

Resultado:(apareceu a parte [remote "origin"])

1
2
3
4
5
6
7
8
9
$ cat .git/config
  [core]
  repositoryformatversion = 0
  filemode = true
  bare = false
  logallrefupdates = true
  [remote "origin"]
  url = git@github.com:codexico/tutorial-github.git
  fetch = +refs/heads/*:refs/remotes/origin/*

4) Baixar(pull=puxar) o projeto:

1
$ git pull origin master

Formato do comando:

1
git pull apelidoDaOrigem apelidoParaDestino

Saída do comando:

1
2
3
4
5
6
7
remote: Counting objects: 52278, done.
  remote: Compressing objects: 100% (10917/10917), done.
  remote: Total 52278 (delta 40975), reused 51715 (delta 40669)
  Receiving objects: 100% (52278/52278), 8.33 MiB | 189 KiB/s, done.
  Resolving deltas: 100% (40975/40975), done.
  From git@github.com:codexico/tutorial-github.git
  * branch  master -> FETCH_HEAD

3) Usar o git

Exemplo (escolha um nome diferente para o arquivo teste):

1
$ touch testegit

1) Adicionar as alterações:

– Podemos adicionar somente uma alteração:

1
$ git add testegit

– Ou adicionar todas as alterações:

1
$ git add .

Neste passo as alterações ainda não estão sob o controle de versão, elas somente foram adicionadas para quando der um commit.

2) Comitar as alterações:

1
$ git commit -m "mensagem teste para o tutorial"

É obrigatório acrescentar uma mensagem.

Saída do comando:

1
2
3
[master de2f5ce] teste para o tutorial
  1 files changed, 1 insertions(+), 0 deletions(-)
  create mode 100644 testegit

Agora as alterações foram adicionadas ao controle de versão. Mas ainda estão somente na máquina local.

3) Enviar(push=empurrar) as alterações:

1
$ git push origin master

Saída do comando:

1
2
3
4
5
6
7
Counting objects: 4, done.
  Delta compression using up to 2 threads.
  Compressing objects: 100% (2/2), done.
  Writing objects: 100% (3/3), 288 bytes, done.
  Total 3 (delta 1), reused 0 (delta 0)
  To git@github.com:codexico/tutorial-github.git
  3be4c21..de2f5ce  master -> master

Se durante o tempo em que fez o pull e o push outra pessoa que também participe do projeto fez alterações o push será rejeitado. Então é necessário atualizar o projeto local antes de enviar novas alterações.

1
$ git fetch origin

Atualizar antes de enviar é uma boa prática a ser seguida para quem usa svn ou cvs e é obrigatória no git.

4)Pronto, confira as alterações no navegador acessando o endereço do projeto (http://github.com/codexico/tutorial-github neste exemplo).

Dica final: para que não precise digitar sempre a senha do ssh siga os passos desse link: http://help.github.com/working-with-key-passphrases/

Atualizado em 09/09/2010, mudei o repositório e adicionei instruções para gerar a chave ssh.

  • Muito bacana o tutorial! valeu! :-)

  • Kleber Correia

    Parabéns pela iniciativa! Mto bom tuto!!!

    Vale lembrar: é necessário criar a chave rsa… id_rsa e id_rsa.pub….
    http://help.github.com/msysgit-key-setup/

    Abraços!!!

    ;)

  • Hehehe, 2 comentários de 2 Kleber.

    @Kleber1 – estamos aí pra isso, qq coisa é só chamar!

    @Kleber2 – valeu, eu fiz o tutorial só para o linux né, vários já me pediram para colocar as instruções para windows também, estou pensando se atualizo este ou faço um outro post, o lance é que raramente uso windows, então vou ter q aprender e testar as ferramentas antes para poder escrever, me ajuda?

  • Kleber Correia

    Então cara e só uso linux tb! Ubuntu 10.04… não meu caso foi necessário gerar a chave….
    Da uma olhada:

    http://help.github.com/linux-git-installation/

    http://help.github.com/linux-key-setup/

  • marco antonio

    Olá, parabéns pelo tutorial.
    Uma sugestão: faltou dizer como se faz para recuperar um commit.
    Abraço!

  • Anônimo

    Para recuperar modificações há algumas possibilidades:1) O arquivo foi modificado mas ainda não foi dado commit:

    1
    git checkout -- arquivomodificado

    2) O arquivo foi modificado e foi dado commit:

    1
    git log --pretty=oneline

    Identifique o SHA do commit que deseja que seja o atual e substitua no comando:

    1
    git reset --hard b8551c9354ee071349f104e3867e57ea7b220c69

    O problema é que pode ser que vc queira de novo as modificações e é difícil recuperar (git reflog, git log -g ), a melhor maneira é criar um branch para o código com as modificações e só depois excluir os commits no branch priincipal.Vou mostrar como funcionam branchs e merges na parte 2 do tutorial.

  • Muito bom o post!

  • Nataliel Vasconcelos

    Otimo post! parabens

  • Filipe Acácio

    Ótimo post! Parabéns!

  • Régis

    Codexico, como você configura esses códigos pra ficar numerado com fundo preto no blog? Eu li o código fonte da página mas não consegui.

  • Muito simples e útil seu tutorial. valeo!

  • Muito simples e útil seu tutorial. valeo!

  • Muito simples e útil seu tutorial. valeo!

  • Curti o tutorial codexico. Nas várias leituras que fiz essa semana sobre o assunto, foi esse post que abriu minha mente. Esse conceito de gerenciamento local eu nunca tinha me tocado.

  • Guilherme Souza

    Aprendi com este tutorial e já estou fazendo uso do conhecimento adquirido. Muito bacana a iniciativa. Foi muito bem detalhado e de fácil aprendizado. Parabéns!!!

  • Quelzita2008

    muito bom o post!! gostei e ja divulguei para alguns amigos!! 

  • Olá,, já possuía um projeto no Git mas tive que formatar  meu pc… Estou tentando continuar o projeto mas não está dando… quando dou o comando git push origin master ele retorna “Permission denied (publickey).
    fatal: The remote end hung up unexpectedly”

  • Siya

    Eu não tenho palavras para apreciar este post ….. estou realmente impressionado…. a pessoa que criou este post certamente sabia bem o assunto .. obrigado por compartilhar isso conosco. 
    Gali Gali Chor Hai Songs

  • Simar

    Eu estava na necessidade real de tal site.I um estou muito ajudado por este sitecomo eu sempre recebo here.Thanks post de inspiração e de instrução para tomar o tempo para conversar tudo de tal maneira ao longo this.Go.
    Jodi Breakers Songs

  • Pingback: ()

  • Diego Souza

    Obrigado! me ajudou a descomplicar o Git/Github

  • Felipe Duarte

    Prezado(a),

        Muito bom este artigo meu ajudou bastante..

  • Olá! Muito fera teu tutorial! Grato! e Parabéns!

  • pra cada projeto (php, java, whatever) que eu crio eu tenho que criar um repositório? 
    Com subversion eu tenho um repositório só e quando preciso mexer em um projeto só baixo o diretório daquele projeto, há algo parecido no git ou tenho que clonar o repositório inteiro?

    • Hélio, para trabalhar dessa maneira teria que clonar o repositório todo mesmo. Mas é fácil criar novos repositórios e tem a vantagem de que se der algum problema, algo que ocorre menos no git do que no svn, o problema ocorre em um só.
      Com um repositório para cada projeto pode-se por exemplo usar um gitignore diferente para os projetos em php e java, também o repositório não fica tão grande se for separado e se você estiver em um computador diferente é só clonar o projeto que quiser.
      O processo de deploy fica facilitado se usar um repositório para cada projeto, você pode configurar por exemplo para enviar os arquivos ao servidor de testes ou ao de produção automaticamente dependendo de qual branch estiver usando.
      Só vejo vantagens em usar um repositório para cada projeto.

    •  Hélio, para trabalhar dessa maneira teria que clonar o repositório todo mesmo. Mas é fácil criar novos repositórios e tem a vantagem de que se der algum problema, algo que ocorre menos no git do que no svn, o problema ocorre em um só.
      Com  um repositório para cada projeto  pode-se por exemplo usar um gitignore diferente para os projetos em php e java, também o repositório não fica tão grande se for separado e se você estiver em um computador diferente é só clonar o projeto que quiser.
      O processo de deploy fica facilitado se  usar um repositório para cada projeto, você pode configurar por exemplo para enviar os arquivos ao servidor de testes ou ao de produção automaticamente dependendo de qual branch estiver usando.
      Só vejo vantagens em usar um repositório para cada projeto.

  • robmachado

    Muito, mas muito útil mesmo !!! me ajudou bastante … um excelente mini tutorial.

  • Vanderson

    Cara muito bom o tuto aqui em, me ensinou bastante. Vaelu!

  • Minha dúvida pode ser boba porém acho válida, quando estou construindo um sistema sozinho e do zero, usar GIT é uma boa pedida? estou testando aqui porém acho que ele ta me deixando pouco produtivo pois sempre tenho que alterar arquivos e corrigir bugs e construir coisas. gosto do git porém ele não seria melhor para controlar um sistema depois que ele sai do desenvolvimento? ja ganha sua primeira TAG e por ai adiante?

    • É Renato, muitas vezes a gente vai desenvolvendo sozinho e do zero, fazendo partes meio aleatórias do projeto, naquela fase em que na verdade a gente tá criando mesmo algo, tem muita coisa que a gente vai colocando e tirando no código muito rápido, a gente tá fazendo uma parte e descobre que precisava fazer outra antes e por aí vai, pode ser um pouco mais ágil fazer commits mais esparsos.

      Como vc disse, depois que o projeto estiver mais consistente aí dá pra controlar melhor.
      Nesse caso acho que a melhor regra seria “fiz algo importante que vale a pena perder algum tempinho para commitar e explicar?”.

      O git vai melhor quando a gente usa alguma metodologia tipo scrum ou algo assim onde a gente divide as tarefas.
      Eu gosto das metodologias ágeis, mesmo quando estou fazendo algo sozinho e do zero. Na verdade eu uso pra mim mesmo GTD + pomodoro, o GTD para dividir as tarefas e o pomodoro para controlar a execução, assim eu paro de tempos em tempos para rever e que fiz e aproveito e dou um git.

  • Lorena Adrian

    Dúvida: como faço para dar “check out” quando estou trabalhando com 1 solução – ou seja, tenho 1 projeto de software, vários usuários acessando esse repositório e preciso dar checkout para que outro não consiga alterar enquanto estou mexendo???

    • O git não tem um needs-lock como no svn, a ideia é essa mesma, ser um sistema distribuído em que todos podem trabalhar offline e os conflitos sejam resolvidos no merge.

      Uma opção é ter um repositório central onde você pode controlar os merges, então cada desenvolvedor manda para um branch e você decide se aquela alteração entra no repositório central, como um pull-request.

      Quem sabe algo como a opção core.sharedRepository pode ajudar também.

  • Daniel Albino

    Vlw bróder!!!
    Estava patinando pra configurar essa parada, mas com seu tutorial eu consegui.
    []’s

  • Marcelo

    Valeu! Ajudou bastante,

  • Rafael Freitas

    Seu tutorial foi de grande utilidade para mim, muito obrigado!

  • Fabiano Maximiano

    Parabens pelo tutorial, estava levando um coro e nao sabia nem por onde começar a utilizar o GIT.
    Agora vou deixar de ser junior!!!

  • Henrique Souza

    Muito bom artigo! Agora.. fiquei com uma dúvida: como faço para apagar os arquivos e diretórios do GitHub via Git?

  • Gabriel Darezzo

    Legal segui seu tutu e foi certinho

    Tive problemas só pra gerar ssh
    Peguei mais info no oficial:
    https://help.github.com/articles/generating-ssh-keys

  • Cléber Otaviano

    Sensacional!!!

  • Danilo Agostinho

    Boas dica, apenas precisam serem atualizadas. O post foi publicado em 2010, mais ainda dá pra seguir direitinho.

  • o meu ta dando erro, não consigo commitar, num tem uma parte de uma parte de configuração de token

    git config –global github.token your_token

  • Caio Cutrim

    valeu brother :)

  • Cornélio José Wiedemann

    amazing brow
    valeu ai negrao
    curti pacas
    :D

  • Jones

    rapaz nem sei por onde começar, não entendi nada! =/

  • Jonatan Alves

    Pessoal , vocês conhecem uma forma de pesquisar projetos do github e retornar com download todos os projetos de uma vez ? Por exemplo na api do git (https://api.github.com/search/repositories?q=forks:20+language:java&sort=stars&order=desc) consigo retornar todos os projetos em java , com maiores estrelas e com 20 forks . mas não consigo fazer download desses projetos encontrados . Não é trivial fazer o download de um por um , seria necessário download em lote , sei ainda que o git bloqueia 20 downloads de projetos por minuto , mas não sei como fazer estes download em lote . Alguém conhece um script que faça isso ou tem alguma ideia ? Obrigado !

    • kndrio

      Faz um script dando git clone dos projetos que você encontrou.

  • husmeck

    $ git remote add origin git@github.com:codexico/tutorial-github.git

    eu tentei usando esses passos mas n vejo nada no meu github

  • Renoir Faria

    Olá, excelente tutorial!!

    btw, qual é o plugin que você usa para mostrar códigos?

    • O plugin é esse: https://wordpress.org/plugins/codecolorer/
      Ainda bem que perguntou, fui olhar e está sem atualizações faz 2 anos, talvez seja hora de mudar, apareceram alguns problemas já, em outro post cortou um pouquinho do código.
      Valeu!

  • Muito Bom !