GustavoHenrique.net

  • About
  • Contact
  • RSS Feed
  • Twitter

 

12
Mar

Comandos básicos do Git

By gustavohenrique|git, Linux|12 Comments


Git é um sistema de controle de versão distribuído, open source, rápido e eficiente. Desenvolvido inicialmente por Linus Torvalds, mesmo criador do kernel do Linux, começou a ganhar notariedade quando passou a ser utilizado como sistema de versionamento padrão para o projeto do kernel. Em 2008, com o lançamento do github, uma espécie de rede social para compartilhamento de códigos, o git deu um grande salto rumo a popularização.
Vou abordar de forma rápida e resumida alguns comandos. Informações mais detalhadas podem ser encontradas na documentação do projeto ou vem vários tutoriais existentes pela web.

Primeiros Passos

Configurando informações sobre o autor dos commits:

git config --global user.name "Gustavo"
git config --global user.email "gustavo@gustavohenrique.net"

É possível alterar essas informações no arquivo ~/.gitconfig

Criando um repositório local:

cd meuprojeto
git init

Para ter certeza que o repositório foi criado:

git status

Áreas de Trabalho

O git possui 4 áreas de trabalho:
1. O diretório .git que é o repositório contendo todos os arquivos versionados;
2. Working Area que é um snapshot do .git dentro de um determinado momento no tempo;
3. Stage que é um local temporário que armazena a referência para arquivos a serem versionados antes de serem commitados;
4. Stash que também é um local temporário que pode armazenar e esconder arquivos que estão no Stage.

Adicionando arquivos novos ou modificados no Stage:

git add arquivo.txt
git add *.py
git add . (para add todos os arquivos)
git add -i (para modo interativo. 1-5 ou 1,2,3,4 e -3 para retirar)

Removendo arquivos não versionados do Stage:

git rm --cached arquivo.txt
git clean -fd (remove todos arquivos e diretórios)

Removendo arquivos versionados e modificados do Stage:

git reset HEAD arquivo.txt
git reset HEAD (todos os arquivos)

Desfazendo modificações de arquivos versionados no Stage:

git checkout -- arquivo.txt

Trabalhando com o Stash:

git stash (Move todos os arquivos do Stage para o Stash)
git stash save "Mensagem" (Move todos os arquivos do Stage para o Stash e os identifica com uma mensagem)
git stash list
git stash apply (Recupera os arquivos do último Stash de volta para o Stage mantendo cópia no Stash)
git stash apply <ID> (Recupera os arquivos do Stash identificado pelo ID obtido pelo git stash list. Ex.: stash@{0})
git stash pop (Faz o mesmo que apply porém apaga os arquivos do Stash)
git stash drop <ID> (Apaga completamente o Stash)
git fsck --unreachable | grep commit (Recupera arquivos apagados do Stash)

Commits

Apenas arquivos no Stage podem ser commitados.

git commit -m "Mensagem"
git commit -a -m "Mensagem" (commita também os arquivos versionados mesmo nao estando no Stage)

Refazendo commit quando esquecer de adicionar um arquivo no Stage:

git add arquivo.txt
git commit -m "Mensagem" --amend

O amend é destrutivo e só deve ser utilizado antes do commit ter sido enviado ao servidor remoto.

Voltando commits anteriores:

git reset --hard HEAD~1 (volta ao último commit)
git reset --soft HEAD~1 (volta ao último commit e mantém os últimos arquivos no Stage)
git reset --hard XXXXXXXXXXX (Volta para o commit com a hash XXXXXXXXXXX)

Recuperando commit apagado pelo git reset:

git reflog (Para visualizar os hashs)
git merge <hash>

Logs

Visualizando logs:

git log
git log --stat (Mostra o que foi modificado em cada commit)
git log --graph (Mostra gráfico do log)
git log --pretty=oneline (Mostra os commits linha por linha)
git log --pretty=format:"%an %ad %h %s" (Exibe o autor, data, sha1 abreviado e texto do commit)
git log --since=30.minutes ou 1.hour ou 2.hours (Exibe commits dos últimos 30 minutos, 1h ou 2h)
git log --since=10.hours --until=2.hours (Exibe commits entre as últimas 10h e últimas 2h)
git log --before="2010-12-25" (Exibe commits antes do dia 25/12/2010)
git reflog (Mostra commits apagados pelo git reset)

Branches

Cada branch deve ter uma única funcionalidade. É recomendado criar um novo branch a partir do master e aplicar os merges nele para efeito de simulação.

git branch (Lista os branches)
git branch -a (Mostra também os branches do repositório remoto)
git branch -d novobranch (Apaga o branch)
git branch -D novobranch (Força a remoção do branch)
git checkout -b novobranch (Cria um branch contendo os mesmos commits do branch de origem)
git checkout -b novobranch origin/outrobranch (Cria novobranch a partir do outrobranch no repositório remoto)
git checkout -b [branch, tag, sha1]
git checkout -b <branch> v1.0 (Cria um branch a partir da tag v1.0)
git checkout master (Retorna ao branch master)
git rebase master (Atualiza um branch com o que há de novo no master)
git merge novobranch (Faz um merge do que foi feito em novobranch)
git merge novobranch --squash (Permite definir uma nova mensagem em vez das mensagens de todos os commits do novobranch)

Conflitos

Quanto mais tempo demorar para atualizar um branch a partir do master (git rebase), maior será a chance de haver conflitos depois.
O rebase é destrutivo, se estiver trabalhando em um servidor remoto deve usar o merge.

git rebase --skip (Perde o arquivo novo)
git rebase --abort (Cancela o rebase)
git rebase --continue (Para continuar após lidar com o conflito manualmente)

Repositórios

Clonando repositórios:

git clone repo1 repo2 (Clona um repositório e add o repo1 como orign no repo2)
git remote show origin (Origin é uma convenção para o primeiro remote)
git push origin (Envia o commit local para o repositório remoto)
git push origin outrobranch (O mesmo acima mas para um determinado branch)
git remote add origin repo (Adiciona um repositório como remoto)
git pull (Atualiza a partir do repositório remoto)
git pull origin outrobranch (O mesmo acima mas a partir de um determinado branch)
git remote rm origin (Remove o repositório remoto)

Trabalhando como repositórios remotos:
Antes de dar um git push, dar um git fecth e um git rebase para não criar conflitos para outros usuários.

git init --bare (Cria um repositório sem área de trabalho)
git fetch origin (Puxa novos commits do repositório remoto)
git fetch remote <branch> (Puxa novos commits do repositório remoto para o branch)
git push origin <branch> (Envia o que está no branch atual para o branch no repositório remoto)
git push origin v1.0 (Envia a tag v1.0)
git pull (Atualiza o repositório local a partir do remoto. Similar a usar "fecth" + "merge")
git pull origin <branch> (Atualiza o branch local a partir do branch remoto)

Github

Criando seu próprio projeto:
Crie um projeto pelo site do github. Em seguida, na máquina local, crie um par de chaves pública e privada, copie e cole no campo apropriado no github.

ssh-keygen -t rsa

Depois copiar o conteudo de ~/.ssh/id_rsa.pub e colar na página do github.

Fazendo um fork de um projeto:
Faça um fork de um repositório, um clone para sua máquina, altere o código, commit e no site clique no link “pull request”. O dono do repositório original deve adicionar a URL do repositório fork com git remote add usuario urlfork. Depois executar um git fecth para trazer os branches do fork. Usar git diff usuario/ para ver as alterações. Para aceitar, git merge (resolver conflitos caso apareça), criar um novo commit e enviar com o git push. O usuário que fez o fork deve executar o mesmo procedimentos para manter o fork sincronizado com o repositório original.

Patches

Trabalhando com patches:

git format-patch <branch> --stdout > patch.diff (Cria um patch)
git am patch.diff (Aplica o patch)

Tags

Uma tag é utilizada para criar uma versão de lançamento.

git tag v1.0 (Cria a tag v1.0)
git push origin v1.0 (Envia a tag v1.0)
git push --tags (Envia todas as tags)
git checkout -b <branch> v1.0 (Cria um branch a partir da tag v1.0)

git-svn

Lidando com svn:

git svn clone svn://repo (Clona um repositorio svn)
git svn clone -r10:HEAD URL NOME (clone de um intervalo de revisões svn)
git svn dcommit (Envia commit para o repositório svn)
git svn fecth (Atualiza a partir do repositório svn)

Links

http://git-scm.com/
http://www.kernel.org/pub/software/scm/git/docs/

Bookmark It

Add to Del.icio.us Add to Diigo Add to Facebook Add to Google Bookmarks Add to LinkedIn Add to Mister Wong Add to Twitter Add to Yahoo My Web
Tagged as: git, github
Add your comment →

12 Comments

  1. git cheatsheet:
    http://www.ndpsoftware.com/git-cheatsheet.html

    By: gustavohenrique Reply → Author
    April 22, 2011 at 11:23 am
  2. Muito bom o post. Parabéns.

    By: roberson Reply →
    October 6, 2011 at 1:23 pm
  3. Edita seu $HOME/.gitconfig e coloca:

    [alias]
    st = status
    ci = commit
    [color]
    ui = auto
    branch = auto
    diff = auto
    interactive = auto
    status = auto

    By: Paulo Coutinho Reply →
    October 26, 2011 at 3:37 pm
  4. Muito bom, abrange todo o necessário e + um pouco. As vezes me da um branco e preciso de uma referência objetiva como essa, favoritei.

    By: Vinycius Maia Reply →
    February 27, 2012 at 9:03 pm
  5. Git e suas magias:
    http://gustavodutra.com/geek/git-e-suas-magias-alguns-comandos-uteis

    By: gustavohenrique Reply → Author
    May 15, 2012 at 8:42 am
  6. Vlw Gustavo, esse post acaba de me salvar numa parada que eu stava fazendo aqui agora!

    By: Henrique Reply →
    July 1, 2012 at 2:45 pm
  7. Post muito útil! Obrigado e Parabéns!

    By: Acemir Reply →
    August 8, 2012 at 2:08 am
  8. git e suas magias alguns comandos uteis:
    http://gustavodutra.com/geek/git-e-suas-magias-alguns-comandos-uteis

    By: gustavohenrique Reply → Author
    October 17, 2012 at 11:48 am
  9. A few git tips you didn’t know about:
    http://mislav.uniqpath.com/2010/07/git-tips/

    By: gustavohenrique Reply → Author
    February 22, 2013 at 11:37 am
  10. Muitíssimo útil esse post!!! Ajudou pra cara**o! rs

    By: Demis Meneghetti Reply →
    April 3, 2013 at 12:18 pm
  11. Excelente post cara! O git é fantastico mesmo, vi esse aqui que me ajuda muito tbm: http://blog.glaucocustodio.com/2013/03/06/git-nosso-de-cada-dia-git-cheatsheet/

    Abraços!

    By: Cleiton Reply →
    May 17, 2013 at 12:01 pm

Pingbacks

  1. O Git salvando sua vida | anselmo barbosa – blog - Dicas de desenvolvimento de software, boas práticas, boas ferramentas e muita informação

Leave your comment below! Cancel Reply

View More Posts:
  • ←
  • →

Tags

admin Django extjs firewall grails jquery KingHost liberações Linux manual model modelform mod_wsgi moeda brasileira mudanças mysql nível de serviço oo PagSeguro pdf php PIL pisa problemas proxy python qa qos real relacionamento roteamento service desk shell script sites tdd tipsforlinux traducao ubicomp ubuntu urllib virtualhost Webservices wikipedia xsol __init__

Recent Posts

  • Configurando um servidor LDAP no CentOS 6.2
  • Introdução ao padrão MVC no Ext JS 4
  • Virtualização com KVM
  • Autenticação Facebook no Grails
  • Grails com Sqlite3 no Ubuntu 11.04
  • Deploy no tomcat usando django-jython
  • Deploy múltiplas versões do Django no Nginx com VirtualEnv
  • Comandos básicos do Git
  • Introdução ao Apache Wicket
  • Feliz 2011

Archives

Categories

My tweets

  • Public Domain, a documentary about the problems of Rio de Janeiro http://t.co/UcTUoPRo 2012-10-10
  • Adobe has released "Source Code Pro", a new open source font designed for software developers http://t.co/AHxrVP9W #protip 2012-09-28
  • http://t.co/9TlbWvWN #protip 2012-09-27
  • 10 things IT architects should consider when choosing data storage technologies http://t.co/6BjGXICI 2012-09-20
  • tá com calor? http://t.co/d3XQQO84 2012-09-20
  • More updates...

Powered by the inLine Minimal WordPress Theme