Exemplos e comandos úteis de git Laboratório de Programação Luísa Lima, Pedro Vasconcelos, DCC/FCUP Março 2015 Configuração # username e email que aparece nos commits git config --global user.name "Tio Patinhas" git config --global user.email "patinhas@disney.com" # configurar cores e editor git config --system core.editor emacs git config --global color.ui auto As configurações são guardadas num ficheiro de texto no diretório casa (~/.gitconfig). Também podemos guardar configurações por cada repositório (repo/.git/config) Inicializar um repositório local mkdir my_repo cd my_repo git init Cria um directório Git em my_repo/.git contendo: ficheiro de configuração (my_repo/.git/config) estrutura de repositório (inicialmente vazio) Experimente listar o conteúdo (ls.git) mas não remova ficheiros ou diretórios. 1
(Localmente) Acrescentar ou modificar ficheiros cd my_repo # editar um ficheiro README.txt #... git add README.txt # adicionar à "staged area" git commit -m "Criar o novo README." # registar alteração Experimente fazer git show para ver o resultado do seu commit e para ver o histórico de commits. (Localmente) Consultar o estado atual git status # estado dos ficheiros no diretório trabalho # modified/staged/etc. git diff # consultar as diferenças entre o "commit" anterior e os ficheiros "modified" git diff --cached # consultar as diferenças entre o "commit" anterior e aquilo que # está na "staged area" # listar commits efectuados (Remoto) Inicializar o repositório remoto Na primeira vez que criamos um repositório, temos de o inicializar com um commit. Este exemplo assume que o repositório já foi criado (mas não inicializado) no servidor remoto por exemplo, no gitlab ou github. cd my_repo git init. git remote add origin <https://...repo.git> git commit -m "Primeiro commit." -u origin master 2
(Remoto) Clonar um repositório remoto Para clonar um repositório existente e inicializado via HTTP ou SSH: git clone <https://...repo.git> (Remoto) Sincronizar com o remoto Deve-se fazer sempre a sincronização com o remoto, antes de se começar a trabalhar, para ir buscar as alterações mais recentes. Exemplo Para efeitos de demonstração, vamos simular dois utilizadores a usarem o repositório em duas máquinas, fazendo clone do repositório em dois directórios distintos e editando em paralelo. O Tio Patinhas inicializa o repositório remoto Primeiro vamos correr uns comandos para simular a área do Tio Patinhas: mkdir patinhas cd patinhas mkdir businessplan cd businessplan git init git config --local user.name "Patinhas" O repositório remoto está criado mas ainda não há nenhum commit. O Tio Patinhas vai inicializar o repositório remoto com um ficheiro README. git remote add origin https://gitlab01.alunos.dcc.fc.up.pt/disneyland/businessplan.git echo "# Plano de negócios" > README.md git commit -m "Cria um README." -u origin master 3
O Pato Donald clona o repositório Primeiro vamos correr uns comandos para simular a área do Pato Donald: mkdir donald cd donald O Pato Donald pode agora clonar o repositório que o Tio Patinhas criou. git clone https://gitlab01.alunos.dcc.fc.up.pt/disneyland/businessplan.git cd businessplan git config --local user.name "Donald" Exemplo - Pato Donald faz mudança - I O Pato Donald acrescenta um ficheiro novo: # Pato Donald echo "Olá, mundo" > OLA.md git add OLA.md git commit -m "Acrescenta o olá mundo." O Tio Patinhas pode agora ver o que o Pato Donald fez: # Tio Patinhas git show Exemplo - Pato Donald faz mudança - II O Pato Donald continua a modificar o mesmo ficheiro: # Pato Donald echo "Olá, mundo de novo" >> OLA.md git add OLA.md git commit -m "Diz olá ao mundo duas vezes." O Tio Patinhas tenta agora criar outro ficheiro, mas esqueceu-se de ir buscar as alterações do Pato Donald antes: 4
# Tio Patinhas echo "Sim, quero!" > DINHEIRO.md git add DINHEIRO.md git commit -m "Acrescenta mais uma vertente do projecto." # error: failed to push some refs... # anotar o "merge" Resolver conflitos - I O Tio Patinhas agora decide editar de novo o README. # Tio Patinhas echo "Quero mais dinheiro" >> README.md git commit -m "Modifica prioridades do projecto" Resolver conflitos - II O Pato Donald decide editar a mesma linha do README, e por isso, vai ter um conflito que vai ter de resolver. # Pato Donald echo "Quero a minha querida Margarida" >> README.md git commit -m "Adiciona os meus objectivos do projecto" # error: failed to push some refs... # CONFLICT (content): Merge conflict in README.md # editar README.md git commit -m "Coloca as prioridades certas." Comandos úteis - visualização Variações úteis do e show: 5
--author="donald@disneyland.com" -i --grep="readme" git show HEAD~2..HEAD Comandos úteis - desfazer o staging Quando nos enganámos ao acrescentar ficheiros ao staging, podemos retirar essas alterações do staging usando o git reset: echo "xalalala" >> README.md git status git diff --cached git reset README.md git status As alterações vão continuar no ficheiro, mas não vão ser consideradas caso façamos agora commit. Comandos úteis - desfazer alterações a um ficheiro Quando nos enganámos a fazer alterações a um ficheiro, e queremos voltar à versão que está no último commit: echo "xalalala" >> README.md git checkout README.md 6