Introdução ao Git Laboratório de Programação Luísa Lima, Pedro Vasconcelos, DCC/FCUP Março 2015 Porquê controlo de versões? Um sistema de controlo de versões (VCS) é um ferramenta integrada que possibilita • • • • • • arquivo e recuperação de ficheiros “undo” de curto e longo prazo rastreamento de alterações sincronização entre computadores colaboração entre programadores experimentação (“sandboxing”) . . . requirindo o mínimo esforço. Controlo de Versões Local Sistemas de controlo de versões convencionais permitem alguns destes benefícios registando mudanças de ficheiros numa base de dados local. 1 Qualquer ficheiro pode ser reconstruído a partir das mudanças registadas na base de dados. Controlo de Versões Centralizado Para permitir sincronização e colaboração, a base de dados pode ser guardada num servidor central; todos os colaboradores utilizam a mesma base de dados. Problemas: um ponto único de falha, não permite trabalhar offline. Controlo de Versões Distribuído (1) Os sistemas de controlo de versões distribuidos (DVCSs) ultrapassam os problemas de centralização mantendo uma cópia completa da base de dados em cada posto de trabalho. Este modelo de VCS é simultamenente mais simples e poderoso que o modelo centralizado. 2 Controlo de Versões Distribuído (2) Vantagens dos sistemas distribuídos • todas as cópias do repositório contêm o historial completo (e não apenas o seu estado atual) • permite trabalhar localmente registando alterações mesmo sem acesso a rede • facilita a recuperação de dados (não há um ponto único de falha) • facilita a introdução de mudanças experimentais separadas das estáveis (“branching”) O que é o Git • • • • Sistema de controle de versões distribuído Desenvolvido desde 2005 para controle de versões do kernel Linux Também muito usado em projetos open-source (github.com) Características: – – – – – rapidez design simples adequado a projectos grandes suporte para desenvolvimento não linear (“branching”) completamente distribuído 3 O Git dá-te super-poderes! Utilizar git é um método de trabalho valioso: • garantimos a integridade dos nossos ficheiros (diga adeus às pen-drives para transportar ficheiros entre casa e trabalho) • usando um repositório remoto, temos sempre um backup caso algo corra mal • permite experimentar e explorar sem termos medo das consequências (dá sempre para voltar atrás caso seja necessário) • as mensagens de commits permitem-nos rever os motivos das alterações Como funciona • cada repositório rastreia um conjunto de ficheiros e diretórios (um “mini” sistema de ficheiros) • podem mudar ao longo do tempo: – acrescentar/remover ficheiros – editar o conteúdo • quando o utilizador regista uma modificação (commit): – guarda o estado atual de todos os ficheiros marcados (snapshot) – para os ficheiros não modificados: guarda apenas uma referência para o estado anterior • um repositório Git é uma sequência de “snapshots” Git Básico - Fluxo de trabalho Três fases: 1. Modify: modificar os ficheiros no directório de trabalho. 2. Stage: adicionar snapshots dos ficheiros à “área de estágio” (staging area). 3. Commit: registar esse snapshots na base de dados do Git juntamente com uma mensagem de arquivo. 4 Git Básico - Operações locais Git Básico - Commit • uma “imagem” dos ficheiros tal como estavam quando estagiados; • uma mensagem de arquivo que descreve a alteração efetuada; • meta-informação do autor e data. Qualquer commit pode ser inspecionado e recuperado se assim quisermos. Git Básico - Ciclo de Vida Os ficheiros no directório de trabalho podem estar em quatro estados diferentes em relação ao commit atual. 5 Prática - Configuração inicial do Git Antes de usar Git pela primeira vez: Escolher a sua identidade git config --global user.name "John Doe" git config --global user.email [email protected] Mais configurações (opcionais) git config --list Obter ajuda git help <verb> Prática - Inicializar um repositório local cd my_repo git init • inicializa um diretório my_repo/.git • o repositório começa vazio: temos de adicionar ficheiros e/ou diretórios 6 Prática - Adicionar ficheiros git add <fich1> git add <fich2> Tambem podemos adicionar vários ficheiros de uma só vez: git add <fich1> <fich2> NB: os ficheiros ficam na área de “estágio” — temos de fazer um commit para os registar na base de dados do Git. Prática - Primeiro Commit git commit -m "Iniciar o meu repositório" NB: podemos também adicionar ou remover ficheiros mais tarde. Prática - Modificar ficheiros Podemos fazer alterações aos ficheiros usando um qualquer editor. Quando estivermos devemos devemos: 1. adicionar os ficheiros à àrea de estágio 2. registar um commit com uma mensagem descritiva. emacs # editar fich1 fich2 ... git add fich1 fich2 git commit -m <mensagem> Prática - Mudar nomes Podemos usar git mv para mudar o nome de um ficheiro e preservar a história de alterações. git mv <fich-atual> <fich-novo> 7 Git Básico - Repositórios remotos Em Git todos os repositórios são iguais (i.e. têm a mesma importância). Um repositório remoto é apenas uma ligação para um outro diretório Git. Prática - Começar a usar um servidor remoto Para usar um repositório já inicializado (i.e. com um diretório Git) basta fazer clone do repositório: git clone <caminho-para-repositório> • podemos referir um servidor remoto usando https://... ou ssh://... • obtemos uma cópia local completa do repositório, que podemos modificar livremente Prática - Usar um repositório remoto Podemos fazer alterações aos ficheiros da cópia local tal como num repositório local. emacs # editar fich1 ... git add fich1 git commit -m <mensagem> Para já este commit existe apenas na cópia local do repositório — nada foi enviado ao servidor remoto! Prática - Enviar modificações Para enviar os seus commits locais para o repositório remoto devemos usar o comando push. git push 8 Prática - Receber modificações Para receber alterações que outros tenham enviado ao repositório remoto usamos pull: git pull Este comando pede e aplica commits remotos. Como coordenar com colaboradores Há várias formas de usar o git com repositórios remotos: • com um branch único partilhado por todos os colaboradores — semelhante ao uso de um repositório centralizado (CVS, SVN ); • com branches distintos para desenvolvimento separado (caso particular: gitflow). Nesta cadeira Sugerimos usar o git de forma semelhante ao SVN : • com um repositório central, que serve como o único ponto de sincronismo para todas as mudanças; • com um único branch (master). Gitlab — repositório central • Alternativa “self-hosted” ao github • Disponível em https://gitlab01.alunos.dcc.fc.up.pt. Prática - Sumário Sumário de um fluxo de trabalho mínimo com Git: • • • • • clone de um repositório remoto add os ficheiros alterados à àrea de estágio commit para registar alterações no diretório Git push para enviar alterações ao repositório remoto pull para receber alterações do repositório remoto 9 That’s all, folks E é apenas isto. Vamos ver alguns exemplos. Nota: alguns cuidados a ter • Fazer bons commits: – use o git add para juntar apenas as alterações relacionadas – escolha boas mensagens: o porquê do commit, não a descrição dos ficheiros (desnecessária!) • Ter em atenção que, se alterarmos a história do repositório de forma descuidada, não estamos apenas a afectar-nos mas também aos nossos colegas de trabalho. Maus exemplos de mensagens git git git git git git git git commit commit commit commit commit commit commit commit -m -m -m -m -m -m -m -m "Últimas alterações." "Alterações do Pedro." "Adiciona o Jogador.java." "Alterações no Jogador.java." "Adiciona cenas." "Revision" "Blablabla" "WTF WTF WTF" Bons exemplos de mensagens git commit -m "Resolve o bug do premio." git commit -m "Remove duplicação de código." git commit -m "Acrescenta a contagem da pontuacao." Referências • • • • Git Community Book Pro Git Git Reference Github 10 • Atlassian git tutorial • Git immersion GUIs para Git • Sourcetree (MacOS, Windows) • Giggle (Linux) A obrigatória referência ao XKCD 11