sexta-feira, 1 de junho de 2012

Git do zero

  • GIT
    • Repositório distribuído: o git não trabalha com um servidor centralizado de repositório, como o SVN. Sempre que um usuário clona um repositório ele baixa todo o conteúdo (claro!) juntamente com todo o histórico de commits já feitos.
    • Instalação em Ubuntu
      • sudo aptitude install git
    • Instalador do Windows
    • Instalação em Mac
      • sudo brew install git
    • GIT com repositório local
      • Inicialização do repositórioc e criação de novos arquivos
        • git init .
        • git status
        • echo "arquivo readme" > readme # echo: simplesmente manda pra tela o parâmetro que recebeu. No caso, a saída está sendo redirecionada para um arquivo também chamado readme (O > serve para salvar a saída em tela de um comando qualquer em arquivo. Isto é, o que fica depois do > é o arquivo que é usado como saída do comando que está antes do >).
        • git status
        • git add . # o que estiver depois do # o interpretador de comandos ignora (pelo menos no linux, no windows eu acho que substituindo por ;REM funciona)
        • git commit -m "criação do readme"
      • Configuração de ferramentas gráficas
        • git config --global diff.tool # diff
        • git config --global merge.tool # merge
        • # (recomendo o meld como ferramenta de diff/merge)
      • Modificando arquivo e visualizando as diferenças
        • echo "Arquivo readme" > readme
        • git status
        • git diff
        • git difftool # Esta linha e a anterior são duas forma diferentes de se fazer a mesma coisa, só pra constar
        • git add readme
        • git status
        • git commit -m "Melhoria no readme"
      • Excluindo arquivos
        • rm readme # equivalente windows: del readme
        • git status
        • git rm readme
        • git status
        • git commit -m "Exclusão do arquivo readme"
      • Descartando alterações não commitadas
        • echo "arquivo leiame" > leiame
        • git add leiame
        • git commit -m "Criação do leiame"
        • echo "Alteração indesejada\!" >> leiame # Não sei se o >> funciona no win, a idéia é concatenar conteúdo ao final do arquivo
        • git status
        • cat leiame # win: more leiame
        • git checkout leiame
        • # Observação: o Eclipse não enxerga automaticamente mudanças feitas por ferramentas externas, então é preciso ir no Eclipse e dar um F5 no projeto que foi modificado
        • cat leiame
        • git status
      • Adicionando pastas inteiras ao controle de versão
        • mkdir pasta # win: md (eu acho, mas isso só cria uma pasta)
        • echo file1 > pasta/file1 # win: trocar / por \
        • echo file2 > pasta/file2
        • git status # Notar que neste ponto não são mostrados os arquivos da pasta criada
        • git add .
        • git status # Agora o git já olhou dentro da pasta e já sabe quais são os arquivos que ele precisa adicionar
        • git commit -m "Nova pasta"
        • git status
        • Pastas vazias
          • mkdir emptyfolder
          • ls -l # win: dir (sem o -l no windows)
          • git add . # Ignora a pasta pois está vazia
          • git status # Diz que não há nada a commitar, um git commit depois disso não iria funcionar
          • rmdir emptyfolder # win: rd emptyfolder
          • # Isto é: o git não versiona pastas vazias
        • Excluindo pastas inteiras
          • rm -rv pasta # win: del, já falei!
          • ls -l
        • Criando novas branches e navegando entre elas (localmente)
          • git branch # lista as branchs existentes, a que tem o * é a branch ativa
          • git branch branch1 # Cria uma nova branch chamada branch1
          • git checkout branch1 # Muda a branch ativa
          • git branch
          • ls -l # Vamos ver que branch1 foi criada com base no que tinha na master, mas poderia ter sido criada com base em qualquer branch
          • echo "Ideia maluca" > ideia_maluca
          • echo "leiame versão branch1" >> leiame
          • git add .
          • git commit -m "Ideia maluca"
          • ls -l
          • cat leiame
          • cat ideia_maluca
          • git checkout master
          • ls -l
          • cat leiame
          • git branch -D branch1 # Notar que o -D força a exclusão da branch, enquanto o parâmetro -d é menos agressivo, nesse caso o -d não permitiria excluir pois as alterações feitas na branch1 serão perdidas, como é isso o que eu quero, usei o -D
        • Merge entre branches (localmente)
          • git branch branch1
          • git checkout branch1
          • echo "Ideia maluca" > ideia_maluca
          • echo "leiame versão branch1" >> leiame
          • git add .
          • git commit -m "Ideia maluca"
          • #ok, criamos uma branch que está mais atualizada que a master, agora vamos colocar tudo no lugar
          • git checkout master
          • git merge branch1
          • ls -l
          • cat leiame
          • cat ideia_maluca
        • Merge entre branches (locais) com conflito
          • echo "versão branch master" >> leiame
          • git add .
          • git commit -m "Alteração no readme"
          • git checkout branch1
          • echo "versão branch1" >> leiame
          • git add .
          • git commit -m "Alteração no readme"
          • git checkout master
          • # Nesse ponto o leiame tem uma versão na master e outra na branch1
          • git mergetool leiame # *1
          • git status
          • ls -l
          • cat leiame
          • # *1 Uma opção bem útil é fazer o merge com a opção --no-commit. Esta opção apenas faz o merge, mas não commita nada, permitindo resolver o merge manualmente (e mais facilmente). Ainda é possível usar ferramenta gráfica de merge dessa maneira.
        • Merge com conflito de pastas (localmente, passo opcional, é uma situação menos frequente)
        • Visualizando o histórico de commits: git log
          • git log --graph --name-only --all --decorate
          • Mostra o log bem formatado, o git log tem inúmeras opções
        • Voltando o repositório para commits antigos
          • O "git checkout" pode receber os seguintes parâmetros: branchs, tags ou hashs de commit. O hash de commit é aquela sequencia enorme de numeros que aparece no log.
        • Visualizando a árvore de branches e o histórico de commits: gitk
        •  
           
Este pequeno tutorial só cobriu os principais aspectos do git usando o repositório local, nada foi falado sobre os comandos de sincronia remota (pull e push) e seus efeitos, fica pra um próximo post.