Capítulo 1 Introdução ao Controle de Versão com Git
Transcrição
Capítulo 1 Introdução ao Controle de Versão com Git
Introdução ao Controle de Versão com Git Software Carpentry 2 Sumário 1 Introdução ao Controle de Versão com Git 7 Pré-requisitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 Tópicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 Outros recursos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 2 Configurando o Git 9 Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 Proxy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 3 Criando um repositório 13 Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 Onde posso criar meu repositório? . . . . . . . . . . . . . . . . . . . . 14 4 Monitorando alterações 15 Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 Onde estão minhas mudanças? . . . . . . . . . . . . . . . . . . . . . . 17 Comitando alterações no Git . . . . . . . . . . . . . . . . . . . . . . . 22 Repositório bio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 5 Explorando o histórico 25 Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 Simplificando o Caso Comum . . . . . . . . . . . . . . . . . . . . . . . 29 Recuperando versões antigas de um arquivo . . . . . . . . . . . . . . . 29 3 4 SUMÁRIO 6 Ignorando Arquivos Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 Colaborando 31 31 35 Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 HTTPS vs SSH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 Proxy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 Gerenciadores de Senhas . . . . . . . . . . . . . . . . . . . . . . . . . . 40 A opção ‘-u’ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 Praticando sozinho . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 Marcação de tempo no GitHub . . . . . . . . . . . . . . . . . . . . . . 43 8 Conflitos 45 Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 Resolvendo conflitos que você criou . . . . . . . . . . . . . . . . . . . . 50 Conflitos em arquivos que não são texto plano . . . . . . . . . . . . . . 50 9 Ciência Aberta 51 Objetivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 Controle de versão de cadernos de anotações científicos eletrônicos . . 52 Licenciamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 Licenciamento de produtos que não são programas de computador 54 Hospedagem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 Posso utilizar uma licença aberta? . . . . . . . . . . . . . . . . . 56 Posso utilizar uma licença aberta? . . . . . . . . . . . . . . . . . . . . 56 Meu trabalho pode ser público? . . . . . . . . . . . . . . . . . . . . . . 56 10 Motivação 59 Por que utilizar Controle de Versão? . . . . . . . . . . . . . . . . . . . 59 Por que Git? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 Próximos Passos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 5 SUMÁRIO 11 Referência 61 Configurando o Git . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 Criando um repositório . . . . . . . . . . . . . . . . . . . . . . . . . . 61 Monitorando alterações . . . . . . . . . . . . . . . . . . . . . . . . . . 61 Explorando o histórico . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 Ignorando Arquivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 Colaborando . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 Conflitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 Ciência Aberta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 Glossário . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 12 Discussão 65 Frequently Asked Questions . . . . . . . . . . . . . . . . . . . . . . . . 65 More Advanced Git Configuration . . . . . . . . . . . . . . . . . . . . 65 Styling Git’s Log . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 Version Controlling the Gitconfig . . . . . . . . . . . . . . . . . . . . . 67 Non-text Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 Non-text Version Control . . . . . . . . . . . . . . . . . . . . . . . . . 69 13 Guia para Instrutores 71 Legend . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 Overall . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 Teaching Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 Setting Up Git . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 Creating a Repository . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 Tracking Changes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 Exploring History . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 Ignoring Things . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 Collaborating . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 Conflicts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 Open Science . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 6 SUMÁRIO 14 Licença 75 Material . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76 Trademark . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76 Capítulo 1 Introdução ao Controle de Versão com Git Lobisomem e Drácula foram contratados pelo Universal Missions (uma agência de serviços espaciais da Euphoric State University) para descobrir onde a companhia deveria enviar sue próximo robô explorador. Eles desejam trabalhar nos planos ao mesmo tempo mas tiveram problemas ao fazer isso no passado. Se eles trabalharem em turnos, cada um deles irá gastar muito tempo esperando o outro terminar mas se eles trabalharem em sua cópia e trocarem emails com as mudanças alguma coisa acabará se perdendo, sendo reescrita ou duplicada. A solução é eles utilizarem controle de versão para gerenciar o trabalho. Controle de versão é melhor que trocar arquivos por email pois: • Nada que é salva no controle de versão pode ser perdido. Isso significa que ele pode ser utilizado como a ferramenta “desfazer” de um editor de texto e como todas as versões anteriores dos arquivos estão salvas sempre é possível voltar no tempo para saber quem escreveu o que em um dia particular ou que versão de um programa foi utilizado para gerar um resultado. • Ele mantem um registro de quem fez cada mudança e quando ela foi feita e assim, se alguém tiver perguntas depois saberá a quem perguntar. • É difícil (mas não impossível) de acidentalmente sobrescrever as mudanças de alguém: o sistema de controle de versão automaticamente avisa o usuário quando existe um conflito entre o trabalho de duas ou mais pessoas. Controle de versão é o caderno de laboratório do mundo digital: é o que profissionais utilizam para manter registro do que fizeram e para colaborar com outras pessoas. Todo grande projeto de desenvolvimento de software depende dele, e vários programadores também o utilizam para seus pequenos projetos. E ele não é utilizado apenas para software: livros (como esse), artigos, pequenos 7 8 CAPÍTULO 1. INTRODUÇÃO AO CONTROLE DE VERSÃO COM GIT conjuntos de dados, e qualquer coisa que é modificado ao longo do tempo ou precisa ser compartilhada pode e deveria ser armazenado em um sistema para controle de versão. Pré-requisitos Nessa lição utilizamos Git pela linha de comando e por isso espera-se uma experiência prévia com ela embora isso não seja obrigatório. Tópicos 1. 2. 3. 4. 5. 6. 7. 8. Configurando o Git Criando um repositório Monitorando alterações Explorando o histórico Ignorando Arquivos Colaborando Conflitos Ciência Aberta Outros recursos • • • • Motivação Referência Discussão Guia do Instrutor Capítulo 2 Configurando o Git Objetivos • Explicar os passos de inicialização e configuração necessários por máquina e por repositório. Nós vamos começar explorando como o controle de versão pode ser utilizado para manter o registro do que e de quando uma pessoa fez algo. Mesmo se você não estiver colaborando com outros, controle de versão é muito melhor que: 9 10 CAPÍTULO 2. CONFIGURANDO O GIT “Piled Higher and Deeper” by Jorge Cham, http://www.phdcomics.com Na primeira vez que utilizamos Git em uma máquina, precisamos configurar algumas coisas. A seguir encontra-se o que Drácula fez para configurar seu novo notebook: $ git config --global user.name "Vlad Dracula" 11 PROXY $ git config --global user.email "[email protected]" $ git config --global color.ui "auto" (Por favor, utilize seu nome e endereço de email ao invés do de Drácula) Ele também configurou seu editor favorito utilizando a tabela a seguir. Editor Configuration command nano Text Wrangler Sublime Text (Mac) Sublime Text (Win) Notepad++ (Win) Kate (Linux) Gedit (Linux) $ $ $ $ $ $ $ git git git git git git git config config config config config config config --global --global --global --global --global --global --global core.editor core.editor core.editor core.editor core.editor core.editor core.editor "nano -w" "edit -w" "subl -n -w" "'c:/program files/sublime text 2/sublime_te "'c:/program files (x86)/Notepad++/notepad++ "kate" "gedit -s" Os commandos do Git são escritos como git verbo, onde verbo é o que desejamos fazer. No caso anterior, estamos dizendo para o Git: • • • • • nosso nome e endereço de email, para colorir a saída, qual o nosso editor de texto favorito, e que queremos utilizar essas informações globalmente (i.e., para todo projeto). Os quatro comandos anteriores só precisam ser executados uma vez: a opção (em inglês denominada de flag) --global diz para o Git utilizar as configurações para todo projeto na máquina atual. You can check your settings at any time: $ git config --list Proxy Em alguns casos você precisa utilizar um proxy para se conectar a internet. Se esse for o seu caso você precisa informar o Git sobre o proxy: $ git config --global http.proxy proxy-url $ git config --global https.proxy proxy-url Para desabilitar o proxy, utilize 12 CAPÍTULO 2. CONFIGURANDO O GIT $ git config --global --unset http.proxy $ git config --global --unset https.proxy Capítulo 3 Criando um repositório Objetivos • Explicar como criar um repositório Git local. Uma vez que Git está configurado, podemos começar a utilizá-lo. Vamos criar um diretório para nosso trabalho: $ mkdir planetas $ cd planetas e dizemos para fazer do diretório um repositório—um lugar onde Git irá armazenar as versões anteriores de nossos arquivos: $ git init Se utilizarmos ls para mostrar o conteúdo do diretório irá parecer que nada foi feito: $ ls Mas se adicionarmos a opção -a para mostrar todos os arquivos, iremos ver que Git criou um diretório oculto denominado .git: $ ls -a . .. .git 13 14 CAPÍTULO 3. CRIANDO UM REPOSITÓRIO Git armazena informações sobre o projeto nesse subdiretório especial. Se deletarmos ele iremos perder o histórico do projeto. Podemos verificar que a configuração foi feita com sucesso requisitando o estado do nosso projeto para o Git: $ git status # On branch master # # Initial commit # nothing to commit (create/copy files and use "git add" to track) Onde posso criar meu repositório? A seguinte sequencia de comandos cira um repositório Git dentro de outro: cd mkdir alpha cd alpha git init mkdir beta cd beta git init # # # # # # # retorna para sua pasta de usuário cria um novo repositório muda o diretório atual para o diretório recém criado transforma o diretório recém criado em um repositório Git cria um subdiretório muda o diretório atual para o subdiretório recém criado transforma o subdiretório em um repositório Git Por que utilizar um repositório Git dentro de outro é uma péssima ideia? Capítulo 4 Monitorando alterações Objetivos • Passar o ciclo modicar-adicionar-salvar para um único arquivo e para múltiplos arquivos. • Explicar onde a informação é armazenada em cada estágio. Vamos criar um arquivo chamado marte.txt que contém algumas notas sobre a sustentabilidade de uma base no planeta vermelho. (Iremos utilizar um editor chamado nano para editar o arquivo mas você pode utilizar o editor de sua preferência. Em particular, ele não precisa ser o mesmo editor informado para o Git). $ nano marte.txt Escreva o texto abaixo no arquivo marte.txt: Frio e seco, mas tudo é da minha cor favorita. marte.txt agora contem a seguinte linha: $ ls marte.txt $ cat marte.txt Frio e seco, mas tudo é da minha cor favorita. 15 16 CAPÍTULO 4. MONITORANDO ALTERAÇÕES Se verificarmos o estado do nosso projeto novamente, Git irá informar que ele encontrou um novo arquivo: $ git status # On branch master # # Initial commit # # Untracked files: # (use "git add <file>..." to include in what will be committed) # # marte.txt nothing added to commit but untracked files present (use "git add" to track) A mensagem “untracked files” significa que existe um arquivo no diretório que Git não está monitorando. Iremos dizer para o Git que ele deve fazê-lo utilizando git add: $ git add marte.txt e então verificamos alteração na mensagem de estado: $ git status # On branch master # # Initial commit # # Changes to be committed: # (use "git rm --cached <file>..." to unstage) # # new file: marte.txt # Git agora sabe que ele deve monitorar o arquivo marte.txt mas ele ainda não salvou nenhuma mudança para a posterioridade como um commit. Para fazer isso precisamos executar mais um comando: $ git commit -m "Começando a tomar notas sobre Marte como um base" [master (root-commit) f22b25e] Começando a tomar notas sobre Marte como um base 1 file changed, 1 insertion(+) create mode 100644 marte.txt ONDE ESTÃO MINHAS MUDANÇAS? 17 Quando executamos git commit, Git pega todas as mudanças que informamos precisar serem salvas quando utilizamos git add e armazena uma cópia permanente dentro do diretório especial .git. Essa cópia permanente é denominada revisão é brevemente identificada por f22b25e. (Sua revisão pode ter um identificador diferente.) Utilizamos a opção -m (de “mensagem”) para salvar um pequeno comentário que seja descritivo e específico que irá nos ajudar a lembrar depois o que fizemos e porque. Se apenas executarmos git commit sem a opção -m, Git irá iniciar nano (ou o editor que tivermos configurado no início) para que possamos escrever um comentário longo. Boas mensagens de commit iniciam com um curto sumário (menos de 50 caracteres) das alterações feitas no commit. Se você desejar adicionar mais detalhes, adicione uma linha em branco entre o sumário e suas notas adicionais. Se executarmos git status agora: $ git status # On branch master nothing to commit, working directory clean Git está dizendo que tudo está atualizado. Se desejarmos saber o que foi feito recentemente podemos pedir ao Git que mostre o histórico do projeto utilizando git log: $ git log commit f22b25e3233b4645dabd0d81e651fe074bd8e73b Author: Vlad Dracula <[email protected]> Date: Thu Aug 22 09:51:46 2013 -0400 Começando a tomar notas sobre Marte como um base git log lista todas as revisões salvas em um repositório na ordem cronológica reversa. Essa lista inclui, para cada revisão, o identificador completo da revisão (que inicia com os mesmos caracteres que o identificador curto impresso pelo comando git commit anteriormente), o autor da revisão, quando ela foi criada e o comentário dado à revisão quando ela foi criada. Onde estão minhas mudanças? Se executarmos ls agora continuamos a encontrar apenas um arquivo chamado marte.txt. Isso deve-se ao fato do Git salvar as informações 18 CAPÍTULO 4. MONITORANDO ALTERAÇÕES com histórico dos arquivos no diretório especial denominado .git mencionado anteriormente tal que nosso sitema de arquivos não fique cheio (e nós acidentalmente editemos ou removemos uma versão anterior. Agora suponha adicionou algumas informações ao arquivo. (Novamente, editaremos o arquivo utilizando o nano e utilizaremos o commando cat para mostrar o conteúdo do arquivo; você pode utilizar outro editor e não precisa do comando cat.) $ nano marte.txt $ cat marte.txt Frio e seco, mas tudo é da minha cor favorita. Duas luas pode ser um problema para o Lobisomem. Quando executamos o comando git status, ele irá informar que um arquivo sendo monitorado foi alterado: $ git status # On branch master # Changes not staged for commit: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # modified: marte.txt # no changes added to commit (use "git add" and/or "git commit -a") A última linha, “no changes added to commit”, é importante e nos avisa que nenhuma das mudanças feitas será salvo na próxima revisão. Embora tenhamos alterado o arquivo não informamos ao Git que queremos salvar essas mudanças (que iremos fazer utilizando git add). Para verificar as alterações nos arquivos utilizamos git diff, que irá mostrar a diferença entre o estado atual dos arquivo e a última revisão salva: $ git diff diff --git a/marte.txt index df0654a..315bf3a --- a/marte.txt +++ b/marte.txt @@ -1 +1,2 @@ Frio e seco, mas tudo +Duas luas pode ser um b/mars.txt 100644 é da minha cor favorita. problema para o Lobisomem. ONDE ESTÃO MINHAS MUDANÇAS? 19 A saída parecer criptografada porque na verdade é uma série de comandos dizendo para programas como editores de texto e patch como reconstruir um arquivo partindo do outro. Podemos quebrar essa saída em algumas partes: 1. A primeira linha informa que Git utilizou o comando diff para comparar a versão antiga com a nova. 2. A segunda linha informa exatamente quais revisões Git está comparando: df0654a e 315bf3a são identificadores únicos gerados pelo computador para essas duas revisões. 3. As linhas restantes mostram o que realmente mudou e as linhas correspondentes. Em particular, o sinal + na primeira coluna indica onde adicionamos novas linhas. Vamos salvar nossas mudanças: $ git commit -m "Adicionado preocupação sobre o feito das luas de Marte no Lobisomem" # On branch master # Changes not staged for commit: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # modified: marte.txt # no changes added to commit (use "git add" and/or "git commit -a") Hoops: Git não salvou uma nova revisão porque esquecemos de utilizar o comando git add primeiro. Vamos corrigir isso: $ git add marte.txt $ git commit -m "Adicionado preocupação sobre o feito das luas de Marte no Lobisomem" [master 34961b1] Adicionado preocupação sobre o feito das luas de Marte no Lobisomem 1 file changed, 1 insertion(+) Git insiste que adicionemos os arquivos ao grupo a ser salvo antes de realmente criarmos uma nova revisão porque podemos não querer incluir todas as mudanças de uma vez. Por exemplo, suponha que estejamos adicionando algumas citações ao trabalho de nosso orientador na nossa tese. Pode ser que desejamos ter uma versão em que adicionamos as citações e as referências bibliográficas mas não desejamos incluir as mudanças na conclusão uma vez que ainda não terminamos esta. Para que isso seja possível, Git possui uma área temporária especial (em inglês denominada staging area) onde ele mantem o registro das alterações que foram 20 CAPÍTULO 4. MONITORANDO ALTERAÇÕES adicionadas ao conjunto a ser utilizado para o próximo commit (que ainda não foi feito). git add coloca as modificações nessa área e git commit move a informação dessa área para o armazenamento de longo termo na forma de um commit. Figura 4.1: The Git Staging Area Vamos verificar como nossas mudanças são transmitidas do nosso editor para a área temporária e posteriormente para o armazenamento de longo termo. Primeiro, precisamos adicionar uma nova linha ao arquivo: $ nano marte.txt $ cat marte.txt Frio e seco, mas tudo é da minha cor favorita. Duas luas pode ser um problema para o Lobisomem. Mas a Múmia irá apreciar a falta de humidade. $ git diff diff --git a/marte.txt b/mars.txt index 315bf3a..b36abfd 100644 --- a/marte.txt +++ b/marte.txt @@ -1,2 +1,3 @@ Frio e seco, mas tudo é da minha cor favorita. Duas luas pode ser um problema para o Lobisomem. +Mas a Múmia irá apreciar a falta de humidade. Até agora, tudo bem: adicionamos uma nova linha no final do arquivo (identificada com o sinal + na primeira coluna). Agora vamos colocar essa mudança na área temporária e verificar o que git diff informa: ONDE ESTÃO MINHAS MUDANÇAS? 21 $ git add marte.txt $ git diff Não existe saída pois até onde o Git consegue informar não existe diferença entre o que foi pedido para salvar permanentemente e o arquivos no repositório. Entretanto, se pedirmos: $ git diff --staged diff --git a/marte.txt b/mars.txt index 315bf3a..b36abfd 100644 --- a/marte.txt +++ b/marte.txt @@ -1,2 +1,3 @@ Frio e seco, mas tudo é da minha cor favorita. Duas luas pode ser um problema para o Lobisomem. +Mas a Múmia irá apreciar a falta de humidade. será mostrado a diferença entre o último commit e as mudanças na área temporária. Vamos salvar nossa mudança: $ git commit -m "Discussão sobre o clima de Marte para a Múmia" [master 005937f] Discussão sobre o clima de Marte para a Múmia 1 file changed, 1 insertion(+) e verificar o estado do repositório: $ git status # On branch master nothing to commit, working directory clean e também no histórico do que foi feito até agora: $ git log commit 005937fbe2a98fb83f0ade869025dc2636b4dad5 Author: Vlad Dracula <[email protected]> Date: Thu Aug 22 10:14:07 2013 -0400 Discussão sobre o clima de Marte para a Múmia 22 CAPÍTULO 4. MONITORANDO ALTERAÇÕES commit 34961b159c27df3b475cfe4415d94a6d1fcd064d Author: Vlad Dracula <[email protected]> Date: Thu Aug 22 10:07:21 2013 -0400 Adicionado preocupação sobre o feito das luas de Marte no Lobisomem commit f22b25e3233b4645dabd0d81e651fe074bd8e73b Author: Vlad Dracula <[email protected]> Date: Thu Aug 22 09:51:46 2013 -0400 Começando a tomar notas sobre Marte como um base Para recapitular, quando queremos adicionar mudanças no nosso repositório, primeiro precisamos adicionar os arquivos alterados para a área de transferência (git add) e então commitar as mudanças na área de transferência no repositório (git commit): Comitando alterações no Git Qual comando abaixo irá salvar as alterações de meu-arquivo.txt no meu repositório Git local? 1. $ git commit -m “minhas mudanças recentes” 2. $ git init meu-arquivo.txt $ git commit -m “minhas mudanças recentes” 3. $ git add meu-arquivo.txt $ git commit -m “minhas mudanças recentes” 4. $ git commit -m meu-arquivo.txt “minhas mudanças recentes” Repositório bio Crie um novo repositório Git no seu computador chamado bio. Escreva uma versão curta da sua bibliografia com três linhas no arquivo me.txt, salva suas mudanças. Depois, modifique uma das linhas e adicione uma quarta linha, mostre a alteração feita e desfaçaa. REPOSITÓRIO BIO Figura 4.2: The Git Commit Workflow 23 24 CAPÍTULO 4. MONITORANDO ALTERAÇÕES Capítulo 5 Explorando o histórico Objetivos • Identificar e usar números de revisões do Git. • Comparar versões antigas de um arquivo com a atual. • Restaurar versões antigas de arquivos. Se desejarmos ver o que alteramos, podemos utilizar git diff novamente, mas referindo-se a versões antigas utilizando a notação HEAD~1, HEAD~2 e assim por diante: $ git diff HEAD~1 marte.txt diff --git a/marte.txt b/mars.txt index 315bf3a..b36abfd 100644 --- a/marte.txt +++ b/marte.txt @@ -1,2 +1,3 @@ Frio e seco, mas tudo é da minha cor favorita. Duas luas pode ser um problema para o Lobisomem. +Mas a Múmia irá apreciar a falta de humidade. $ git diff HEAD~2 marte.txt diff --git a/marte.txt b/mars.txt index df0654a..b36abfd 100644 --- a/marte.txt +++ b/marte.txt 25 26 CAPÍTULO 5. EXPLORANDO O HISTÓRICO @@ -1 +1,3 @@ Frio e seco, mas tudo é da minha cor favorita. +Duas luas pode ser um problema para o Lobisomem. +Mas a Múmia irá apreciar a falta de humidade. Dessa forma, criamos uma sequência de revisões. A revisão mais recente nessa sequência é referenciada por HEAD e podemos referenciar revisões anteriores utilizando a notação com ~, tal que HEAD~1 (pronuncia-se “head minus one”) significa a revisão anterior, enquanto HEAD~123 retorna 123 revisões do ponto em que estamos agora. Podemos também referenciar revisões anteriores utilizando a longa string de dígitos e letras impressas por git log. Essa longa string é única para as revisões e “única” realmente significa única: todo conjunto de mudanças em um conjunto de arquivos em cada máquina possui um identificador único de 40 caracteres. O nosso primeiro commit possui como identificado f22b25e3233b4645dabd0d81e651fe074bd8e73b. Então vamos tentar: $ git diff f22b25e3233b4645dabd0d81e651fe074bd8e73b marte.txt diff --git a/marte.txt b/mars.txt index df0654a..b36abfd 100644 --- a/marte.txt +++ b/marte.txt @@ -1 +1,3 @@ Frio e seco, mas tudo é da minha cor favorita. +Duas luas pode ser um problema para o Lobisomem. +Mas a Múmia irá apreciar a falta de humidade. A resposta do Git está correta mas digitar 40 caracteres aleatórios é inconveniente e por isso Git permite você digitar apenas os primeiros caracteres: $ git diff f22b25e marte.txt diff --git a/marte.txt b/mars.txt index df0654a..b36abfd 100644 --- a/marte.txt +++ b/marte.txt @@ -1 +1,3 @@ Frio e seco, mas tudo é da minha cor favorita. +Duas luas pode ser um problema para o Lobisomem. +Mas a Múmia irá apreciar a falta de humidade. Até agora aprendemos como salvar alterações nos arquivos e verificar as alterações realizadas. Como podemos recuperar um arquivo de uma versão antiga? Vamos supor que acidentalmente sobre escrevemos um de nossos arquivos. OBJETIVOS 27 $ nano marte.txt $ cat marte.txt Teremos que produzir oxigênio para nosso consumo. git status irá informar que os arquivo foi alterado e que as alterações não foram salvas na área temporária: $ git status # On branch master # Changes not staged for commit: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # modified: marte.txt # no changes added to commit (use "git add" and/or "git commit -a") Podemos desfazer as mudanças utilizando o comando git checkout: We can put things back the way they were by using git checkout: $ git checkout HEAD marte.txt $ cat marte.txt Frio e seco, mas tudo é da minha cor favorita. Duas luas pode ser um problema para o Lobisomem. Mas a Múmia irá apreciar a falta de humidade. Como você pode adivinhar pelo verbo utilizado, git checkout checks out (i.e., restaura) uma versão anterior do arquivo. Nesse caso, estamos dizendo para o Git que queremos recuperar a versão do arquivo presente em HEAD, que corresponde a última versão salva. Se você você resolver resolver voltar para uma versão mais antiga você deve utilizar o identificado da respectiva versão: $ git checkout f22b25e marte.txt É importante lembrar que devemos utilizar o identificador da revisão anterior ao estado que desejamos desfazer. Um erro comum é utilizar o identificador da revisão na qual as alterações indesejadas foram feitas. No exemplo abaixo, queremos recuperar o estado anterior ao commit mais recente (HEAD~1), cuja identificação é f22b25e: O diagrama a seguir ilustra como o histórico de um arquivo deve ser (indo para antes de HEAD, a versão mais recente salva): 28 CAPÍTULO 5. EXPLORANDO O HISTÓRICO Figura 5.1: Git Checkout Figura 5.2: When Git Updates Revision Numbers SIMPLIFICANDO O CASO COMUM 29 Simplificando o Caso Comum Se você tiver lido cuidadosamente a saída do comando git status você terá notado que ele encontra a seguinte dica: (use "git checkout -- <file>..." to discard changes in working directory) Como ela diz, git checkout irá restaurar os arquivos para o estado salvo em HEAD. O traço duplo, --, é necessário para separar o nome do arquivo a ser recuperado do comando propriamente dito: sem o traço duplo, Git tentará utilizar o nome do arquivo como o identificador da revisão. O fato de que os arquivos pode ser recuperados um por um tende a mudar a forma como as pessoas organizam seu trabalho. Se todo o trabalho consiste de um grande documento, será difícil (mas não impossível) de desfazer alguma mudança sem também desfazer outras, por exemplo desfazer as alterações na introdução sem também desfazer as alterações feitas na conclusão. Se a introdução e conclusão estiverem salvas em arquivos separados será muito mais fácil desfazer apenas as alterações em um dos arquivos. Recuperando versões antigas de um arquivo Jennifer fez alterações no seu script Python no qual ela estava trabalhando a duas semanas, e as alterações que ela fez essa manhã “quebraram” o script que não mais funciona. Ela já gastou em ~1h tentando corrigi-lo sem sucesso. . . Felizmente, ela esteve mantendo registro do seu trabalho utilizando Git! Qual comando a seguir permite ela recuperar a última versão salva do seu script Python chamado reducao-de-dados.py? 1. $ git checkout HEAD 2. $ git checkout HEAD reducao-de-dados.py 3. $ git checkout HEAD~1 reducao-de-dados.py 4. $ git checkout reducao-de-dados.py 5. 2 e 4 30 CAPÍTULO 5. EXPLORANDO O HISTÓRICO Capítulo 6 Ignorando Arquivos Objetivos • Configurar Git para ignorar arquivos específicos, e explicar porque isso é útil em alguns casos. Se tivermos arquivos que não desejamos serem monitorados pelo Git, por exemplo arquivos de backup criados pelo nosso editor ou arquivos intermediários criados durante a análise de dados. Vamos criar um exemplo bobo: $ mkdir resultados $ touch a.dat b.dat c.dat resultados/a.out resultados/b.out e verificar o que o Git diz: $ git status # On branch master # Untracked files: # (use "git add <file>..." to include in what will be committed) # # a.dat # b.dat # c.dat # resultados/ nothing added to commit but untracked files present (use "git add" to track) Colocando esses arquivos sob controle de versão é um desperdício de memória em disco. Algo pior é que ter eles listados toda vez pode reduzir nossa atenção para 31 32 CAPÍTULO 6. IGNORANDO ARQUIVOS as mudanças que realmente importam. Vamos então dizer para o Git ignorar alguns arquivos. Fazemos isso criando um arquivo denominado .gitignore no diretório raiz do nosso projeto. $ nano .gitignore $ cat .gitignore *.dat resultados/ A primeira expressão no arquivo .gitignore diz para o Git ignorar todos os arquivos que terminam com .dat e a segunda expressão para ele ignorar todos os arquivos dentro do diretório resultados. (Se algum desses arquivos já está sendo monitorado pelo Git ele continuará sendo-o). Uma vez que criamos esse arquivo, a saída do comando git status é muito mais limpa. $ git status # On branch master # Untracked files: # (use "git add <file>..." to include in what will be committed) # # .gitignore nothing added to commit but untracked files present (use "git add" to track) A única alteração que Git nota é a criação do arquivo .gitignore. Inicialmente você pode pensar que você não quer monitorar esse arquivo mas todas as pessoas que fizerem uso do repositório provavelmente irão querer ignorar os mesmos arquivos que ignoramos. Por esse motivo, vamos adicionar o arquivo .gitignore ao nosso controle de versão: $ git add .gitignore $ git commit -m "Adicionado gitignore" $ git status # On branch master nothing to commit, working directory clean Como um bônus, utilizar .gitignore irá ajudar nos a evitar de acidentadamente adicionar arquivos indesejados. OBJETIVOS 33 $ git add a.dat The following paths are ignored by one of your .gitignore files: a.dat Use -f if you really want to add them. fatal: no files added Se realmente desejarmos desobedecer nossas configurações presentes no .gitignore precisamos informar isso ao Git utilizando git add -f. Também podemos verificar o status dos arquivos ignorados utilizando: $ git status --ignored # On branch master # Ignored files: # (use "git add -f <file>..." to include in what will be committed) # # a.dat # b.dat # c.dat # resultados/ nothing to commit, working directory clean 34 CAPÍTULO 6. IGNORANDO ARQUIVOS Capítulo 7 Colaborando Objetivos • Explicar o que são repositórios remotos e por que eles são úteis. • Explicar o que acontece quando um repositório remoto é clonado. • Explicar o que acontece quando mudanças são obtidas e enviadas para um repositório remoto. Controle de versão começa a fazer falta quando começamos a colaborar com outras pessoas. Já temos quase todas as ferramentas necessárias para fazer isso, só falta aprendermos como copiar alterações de um repositório para outro. Sistemas como Git permite trocar alterações entre dois repositórios quaisquer. Na prática, entretanto, é mais fácil utilizar uma cópia como hub central e mantêlo em um servidor conectado à internet do que no notebook de alguém. Grande parte dos programadores utilizam serviços de hospedagem como GitHub ou BitBucket para armazenar esses cópias. Vamos explorar os pros e os contras dessa abordagem no final dessa lição. Vamos começar por compartilhar as mudanças que fizemos no nosso projeto com o mundo. Autentique-se no GitHub e clique no ícone no canto superior direito para criar um novo repositório denominado planetas: Nomeie o seu repositório de “planetas” e selecione “Create Repository”: Assim que o repositório for criado, GitHub irá mostrar uma página com uma URL e algumas informações de como configurar seu repositório local: Esse procedimento realiza os seguintes comandos nos servidores do GitHub: $ mkdir planetas $ cd planetas $ git init 35 36 CAPÍTULO 7. COLABORANDO Figura 7.1: Criando um novo repositório no GitHub (Passo 1) Figura 7.2: Criando um novo repositório no GitHub (Passo 2) HTTPS VS SSH 37 Figura 7.3: Criando um novo repositório no GitHub (Passo 3) Nosso repositório local ainda contem nosso trabalho anterior no arquivo marte.txt mas o repositório remoto no GitHub não contem nenhum arquivo: O próximo passo é conectar esses dois repositórios. Fazemos isso transformando o repositório no GitHub um repositório remote para o repositório local. Na página inicial do repositório no GitHub encontra-se a string necessária para identificá-lo: Selecione ‘HTTPS’ para alterar o protocolo SSH para HTTPS. HTTPS vs SSH Utilizamos HTTPS porque ele não requer configurações adicionais. Depois do workshop você pode querer configurar acesso via SSH, que é um pouco seguro, seguindo um dos tutoriais disponibilizados por GitHub, Atlassian/BitBucket e GitLab (esse é um vídeo). Copie essa URL do navegador, vá para seu repositório local e execute o comando: $ git remote add origin https://github.com/vlad/planetas Certifique-se de utilizar a URL do seu repositório ao invés da URL do Vlad: a única diferença deve ser seu nome de usuário no lugar de vlad. Você pode verificar que o comando anterior foi executado corretamente utilizando git remote -v: 38 CAPÍTULO 7. COLABORANDO Figura 7.4: Freshly-Made GitHub Repository Figura 7.5: Where to Find Repository URL on GitHub 39 PROXY Figura 7.6: Changing the Repository URL on GitHub $ git remote -v origin origin https://github.com/vlad/planetas.git (push) https://github.com/vlad/planetas.git (fetch) O nome origin é o apelido local para seu repositório remoto: você pode utilizar outro apelido no lugar se você desejar, mas origin é a opção mais utilizada. Uma vez que o apelido origin está configurado, o comando a seguir irá copiar as alterações no repositório local para o repositório no GitHub: $ git push origin master Counting objects: 9, done. Delta compression using up to 4 threads. Compressing objects: 100% (6/6), done. Writing objects: 100% (9/9), 821 bytes, done. Total 9 (delta 2), reused 0 (delta 0) To https://github.com/vlad/planetas * [new branch] master -> master Branch master set up to track remote branch master from origin. Proxy Se a rede que você está conectado utiliza um proxy existe uma change do último comando ter falhado com “Could not resolve hostname” 40 CAPÍTULO 7. COLABORANDO como mensagem de error. Para resolver esse problema você precisa informar ao Git sobre o proxy: $ git config --global http.proxy http://user:[email protected] $ git config --global https.proxy http://user:[email protected] Quando você se conectar em outra rede que não utiliza um proxy você terá que dizer para o Git desabilitar o uso do proxy utilizando $ git config --global --unset http.proxy $ git config --global --unset https.proxy Gerenciadores de Senhas Se seu sistema operacional possui um gerenciador de senha configurad, git push irá tentar utilizá-lo quando for necessário informar o usuário e senha. Se você desejar digitar seu usuário e senha no terminal ao invés do gerenciador de senha, digite $ unset SSH_ASKPASS Você talvez queira adicionar esse comando no final do seu ~/.bashrc para que esse passe a ser o comportamento padrão. Agora o seus repositórios locais e remotos estão no seguinte estado: A opção ‘-u’ Normalmente você vai encontrar a opção -u em outras documentações disponíveis na internet. Ela está relacionada com conceitos apresentados na nossa lição intermediária e pode ser ignorada sem problemas. Você também pode pegar as alterações no seu repositório remoto para o local: $ git pull origin master From https://github.com/vlad/planetas * branch master -> FETCH_HEAD Already up-to-date. PRATICANDO SOZINHO 41 Figura 7.7: Repositório no GitHub após o primeiro push Nesse caso, nenhuma modificação foi recebida porque os dois repositórios já estavam sincronizados. Se alguém tivesse enviado alguma alteração para esse repositório no GitHub, o comando anterior teria baixado as modificações para o repositório local. Para o próximo passo, iremos trabalhar em pares. Escolha um dos seus repositórios no GitHub para utilizá-lo colaborativamente. Praticando sozinho Se você estiver seguindo essa lição sozinho, antes de continuar abra um segundo terminal, altere o diretório corrente para outro diretório (e.g. /tmp). Esse segundo terminal irá representar seu colega que estaria trabalhando em outro computador. Você não precisa dar permissões para ninguém pois o seu “colega” vai ser você mesmo. O dono do repositório que será utilizado precisa dar permissões de escrita para a outra pessoa. No GitHub, selecione “Settings” no lado direito, depois “Collaborators” e depois digite o usuário da sua dupla. Quem não é dono do repositório que será utilizado deve mudar de diretório, utilizando cd, de tal forma que ls não mais mostre o diretório planetas e em seguida criar uma cópia do repositório que será utilizado no seu computador: $ git clone https://github.com/vlad/planetas.git 42 CAPÍTULO 7. COLABORANDO Figura 7.8: Adding collaborators on Github Troque vlad pelo usuário do seu parceiro (o dono do repositório que será utilizado). git clone irá criar uma cópia local do repositório remoto. Figura 7.9: After Creating Clone of Repository Agora o novo colaborador pode fazer uma alteração na sua cópia do repositório: $ cd planetas $ nano plutao.txt $ cat plutao.txt Também é um planeta! $ git add plutao.txt MARCAÇÃO DE TEMPO NO GITHUB 43 $ git commit -m "Algumas notas sobre Plutão" 1 file changed, 1 insertion(+) create mode 100644 plutao.txt e depois enviar as mudanças para o GitHub: $ git push origin master Counting objects: 4, done. Delta compression using up to 4 threads. Compressing objects: 100% (2/2), done. Writing objects: 100% (3/3), 306 bytes, done. Total 3 (delta 0), reused 0 (delta 0) To https://github.com/vlad/planetas.git 9272da5..29aba7c master -> master Note que não precisamos criar um repositório remoto chamado origin pois Git faz isso automaticamente quando clonamos um repositório. (Por é o motivo que utilizamos origin anteriormente quando configuramos o repositório remoto manualmente). Podemos baixar as mudanças agora disponíveis no GitHub no repositório original em nossa máquina: $ git pull origin master remote: Counting objects: 4, done. remote: Compressing objects: 100% (2/2), done. remote: Total 3 (delta 0), reused 3 (delta 0) Unpacking objects: 100% (3/3), done. From https://github.com/vlad/planetas * branch master -> FETCH_HEAD Updating 9272da5..29aba7c Fast-forward plutão.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 plutão.txt Marcação de tempo no GitHub Crie um repositório no GitHub, clone-o, adicione um arquivo, envie essa mudança para o GitHub e olhe o horário, em inglês timestamp, que as alterações foram feitas no GitHub. Como que o GitHub grava o tempo? E por que? 44 CAPÍTULO 7. COLABORANDO Capítulo 8 Conflitos Objetivos • Explicar o que são conflitos e quando eles ocorrem. • Resolver conflitos ocorridos durante um merge. Logo que pessoas começam a trabalhar em paralelo alguém irá pisar no pé de outra pessoa. Isso também pode acontecer com uma única pessoa: se trabalharmos no mesmo arquivo do nosso notebook e do computador no laboratório, pode ser que façamos mudanças diferentes em cada uma das cópias. Controle de versão ajuda a gerenciarmos esses conflitos ao fornecer uma ferramenta para resolver a sobreposição de mudanças. Para que possamos aprender como resolver conflitos precisamos, primeiro, criar um. Atualmente o arquivo marte.txt corresponde, em todas as nossas cópias do repositório planeta, a $ cat marte.txt Frio e seco, mas tudo é da minha cor favorita. Duas luas pode ser um problema para o Lobisomem. Mas a Múmia irá apreciar a falta de humidade. Vamos adicionar uma linha na cópia no nosso diretório de usuário: $ nano marte.txt $ cat marte.txt 45 46 CAPÍTULO 8. CONFLITOS Frio e seco, mas tudo é da minha cor favorita. Duas luas pode ser um problema para o Lobisomem. Mas a Múmia irá apreciar a falta de humidade. Linha adicionada na cópia do Lobisomem. e enviar essa mudança para o GitHub: $ git add marte.txt $ git commit -m "Adicionado linha em nossa cópia local" [master 5ae9631] Adicionado linha em nossa cópia local 1 file changed, 1 insertion(+) $ git push origin master Counting objects: 5, done. Delta compression using up to 4 threads. Compressing objects: 100% (3/3), done. Writing objects: 100% (3/3), 352 bytes, done. Total 3 (delta 1), reused 0 (delta 0) To https://github.com/vlad/planetas 29aba7c..dabb4c8 master -> master Agora vamos esperar nosso colaborador fazer uma alteração em sua cópia local sem atualizar a cópia local com as últimas alterações disponíveis no GitHub: $ nano marte.txt $ cat marte.txt Frio e seco, mas tudo é da minha cor favorita. Duas luas pode ser um problema para o Lobisomem. Mas a Múmia irá apreciar a falta de humidade. Adicionado linha diferente na outra cópia. Podemos salvar a alteração localmente: $ git add marte.txt $ git commit -m "Adicionado linha em minha cópia" [master 07ebc69] Adicionado linha em minha cópia 1 file changed, 1 insertion(+) mas o Git não irá deixar enviarmos nossas alterações para o GitHub: 47 OBJETIVOS $ git push origin master To https://github.com/vlad/planetas.git ! [rejected] master -> master (non-fast-forward) error: failed to push some refs to 'https://github.com/vlad/planetas.git' hint: Updates were rejected because the tip of your current branch is behind hint: its remote counterpart. Merge the remote changes (e.g. 'git pull') hint: before pushing again. hint: See the 'Note about fast-forwards' in 'git push --help' for details. Figura 8.1: The conflicting changes Git detecta que as alterações em uma cópia local sobrepõe aquelas feitas em outra cópia e previne de nós bagunçarmos nosso trabalho anterior. O que precisamos fazer é pegar as mudanças no GitHub, fazer um merge delas na cópia que estamos trabalhando atualmente e depois enviá-las novamente. Vamos começar por baixar as mudanças: 48 CAPÍTULO 8. CONFLITOS $ git pull origin master remote: Counting objects: 5, done. remote: Compressing objects: 100% (2/2), done. remote: Total 3 (delta 1), reused 3 (delta 1) Unpacking objects: 100% (3/3), done. From https://github.com/vlad/planetas * branch master -> FETCH_HEAD Auto-merging marte.txt CONFLICT (content): Merge conflict in marte.txt Automatic merge failed; fix conflicts and then commit the result. git pull informa que existe um conflito e marca os conflitos nas linhas afetadas: $ cat marte.txt Frio e seco, mas tudo é da minha cor favorita. Duas luas pode ser um problema para o Lobisomem. Mas a Múmia irá apreciar a falta de humidade. <<<<<<< HEAD Linha adicionada na cópia do Lobisomem. ======= Adicionado linha diferente na outra cópia. >>>>>>> dabb4c8c450e8475aee9b14b4383acc99f42af1d Nossas mudanças—aquelas em HEAD—é precedido por <<<<<<<. Depois das nossas mudanças conflitantes, Git adiciona ======= como um separador das mudanças e maca o fim das alterações conflitantes baixadas do GitHub com >>>>>>>. (O conjunto de letras e dígitos depois desse marcador identifica a versão que acabamos de baixar.) Agora depende de nós editar o arquivo para remover os marcadores e reconciliar as alterações. Podemos fazer o que desejarmos: manter as alterações feitas nessa cópia, manter as alterações feitas na outra cópia, escrever algo novo para substituir ambas alterações ou removê-las. Vamos substituir ambas de modo que o arquivo fique como: $ cat marte.txt Frio e seco, mas tudo é da minha cor favorita. Duas luas pode ser um problema para o Lobisomem. Mas a Múmia irá apreciar a falta de humidade. Removemos o conflito nessa linha. OBJETIVOS 49 Para finalizar o merge, nos adicionamos o arquivo marte.txt e criamos uma nova revisão: $ git add marte.txt $ git status # On branch master # All conflicts fixed but you are still merging. # (use "git commit" to conclude merge) # # Changes to be committed: # # modified: marte.txt # $ git commit -m "Juntando alterações provenientes do GitHub" [master 2abf2b1] Juntando alterações provenientes do GitHub Agora podemos enviar nossas alterações para o GitHub: $ git push origin master Counting objects: 10, done. Delta compression using up to 4 threads. Compressing objects: 100% (6/6), done. Writing objects: 100% (6/6), 697 bytes, done. Total 6 (delta 2), reused 0 (delta 0) To https://github.com/vlad/planetas.git dabb4c8..2abf2b1 master -> master Git mantem o registro de quando realizamos um merge e desse modo não precisamos corrigir novamente esse conflito quando um colaborador baixar as novas mudanças: $ git pull origin master remote: Counting objects: 10, done. remote: Compressing objects: 100% (4/4), done. remote: Total 6 (delta 2), reused 6 (delta 2) Unpacking objects: 100% (6/6), done. From https://github.com/vlad/planetas * branch master -> FETCH_HEAD 50 CAPÍTULO 8. CONFLITOS Updating dabb4c8..2abf2b1 Fast-forward marte.txt | 2 +1 file changed, 1 insertion(+), 1 deletion(-) Como podemos verificar o arquivo marte.txt encontra na forma que salvamos após o merge: $ cat marte.txt Frio e seco, mas tudo é da minha cor favorita. Duas luas pode ser um problema para o Lobisomem. Mas a Múmia irá apreciar a falta de humidade. Removemos o conflito nessa linha. Não precisamos juntar as alterações novamente porque o Git sabe que alguém já fez isso. A habilidade de sistemas de controle de versão em resolver conflitos é uma das razões pela qual vários usuários tendem a dividir seus programas e artigos em vários arquivos ao invés de armazená-los em um único grande arquivo. Existe um outro benefício: quando conflitos em um arquivo ocorrem com frequência isso é uma indicação de que as responsabilidades não estão claras ou o trabalho precisa ser melhor dividido. Resolvendo conflitos que você criou 1. Clone o repositório criado pelo seu instrutor. 2. Adicione um novo arquivo nele e altere um arquivo existente (seu instrutor irá informar qual arquivo). 3. Quando requisitado pelo seu instrutor, baixe as mudanças do repositório para criar um conflito e resolva-o. Conflitos em arquivos que não são texto plano O que o Git faz quando existe um conflito em uma imagem ou em um arquivo não texto que está armazenado no controle de versão? Capítulo 9 Ciência Aberta Objetivo • Explicar como controle de versão pode ser útil como um caderno de anotações eletrônico para trabalhos computacionais. • Explicar porque adicionar licença e informações de referência em um repositório de projeto é importante. • Explicar quais opções de licença estão disponíveis e como escolher uma. • Explicar como licenças e expectativas sociais diferem. O oposto de “aberto” não é “fechado”. O oposto de “aberto” é “quebrado”. — John Wilbanks (tradução literal) O compartilhamento livre de informações deve ser o objetivo em ciência, mas a realidade é um pouco mais complicada. A prática padrão na atualidade parece algo como: • Uma pesquisadora coleta alguns dados e armazena eles em uma máquina que ocasionalmente ganha uma cópia de backup por parte do departamento ao qual pertence. • Ela então escreve ou modifica alguns pequenos programas (que também existe apenas na sua máquina) para analisar os dados. • Uma vez que ela possua alguns resultados, ela escreve sobre eles e submete seu artigo. Ela talvez inclua seus dados—um número crescente de jornais requer isso—mas ela provavelmente não incluirá seus códigos. • Algum tempo passa. 51 52 CAPÍTULO 9. CIÊNCIA ABERTA • O jornal envia-lhe comentários anônimos de alguns outros pesquisadores do seu campo de pesquisa. Ela revisa seu paper para satisfazer os comentários feitos e reenvia o artigo, sendo que nesse meio tempo ela alterou os scripts. • Mais tempo se passa. • O artigo é eventualmente publicado. Ele talvez inclua um link para uma cópia online dos dados utilizados, mas o artigo em si estará atrás de uma subscrição paga: apenas pessoas que possuam uma assinatura pessoal ou institucional poderão ler o artigo. Entretanto, para um número crescente de pesquisadores, o processo parece mais com: • Os dados coletados pela pesquisadora são armazenados em um repositório de acesso aberto como figshare ou Zenodo, logo que els são coletados e recebendo seu próprio DOI. Ou o dado já foi publicado e hospedado em Dryad. • A pesquisadora cria um novo repositório no GitHub para guardar seu trabalho. • Durante o processo de análise, ela envia as alterações feitas em seus scripts (e possivelmente os arquivos de saída) para o repositório no GitHub. Ela também utiliza o repositório para seu artigo sendo que o repositório funciona como um hub para a colaboração com seus colegas. • Quando ela está satisfeita com o estado do seu artigo, ela disponibiliza uma versão no arXiv ou em outro servidor de preprints e convida outros colegas para comentarem o trabalho. • Baseado nesses comentários, ela provavelmente disponibiliza várias outras versões antes de finalmente submeter seu artigo ao jornal. • O artigo publicado inclui links para o preprint, para seu código e para os dados de modo que será muito mais fácil para outros pesquisadores utilizar seu trabalho como ponto de partida para suas próprias pesquisas. Esse modelo aberto acelera descobertas: quanto mais aberto o trabalho é, mais citado e reutilizado ele é. Entretanto, pessoas que querem trabalhar dessa forma precisam tomar algumas decisões sobre o que exatamente “aberto” significa na prática. Controle de versão de cadernos de anotações científicos eletrônicos O benefício do controle de versão é, essencialmente, que quando utilizado adequadamente, você pode utilizar o controle de versão como uma forma de cadernos de anotações científicos eletrônicos para seu trabalho computacional. LICENCIAMENTO 53 • O estágio conceitual do seu trabalho está documentado, incluindo quem fez o que e quando. Todo passo está associado a um identificador único (o ID do commit) para a maior parte das intenções e usos. • Você pode amarrar documentação de motivações, ideias e outros trabalhos intelectuais diretamente às alterações relacionadas. • Você pode referir ao que utilizou na sua pesquisa para obter o resultado computacional de uma forma que é única e recuperável. • Com um sistema de controle distribuído como o Git, o repositório de controle de versão é facilmente arquivado para a posterioridade, e contem o histórico completo. Licenciamento Quando um repositório contendo código fonte, manuscritos ou outro trabalho criativo torna-se público ele deve incluir um arquivo LICENSE ou LICENSE.md ou LICENSE.md na base do diretório correspondente ao repositório que expresse claramente sob qual licença o conteúdo daquele repositório está disponível. Isso é necessário porque trabalhos criativos, isso inclui códigos fontes, encontram-se automaticamente sob a lei de proteção à propriedade intelectual (mais expecificamente do copyright). Códigos fontes que parecem ser ou são expressamente divulgados como livremente acessível não abdicou de tal proteção. Desta forma, aqueles que (re)utilizam código fonte que não possui expresso uma licença fazem isso à sua própria sorte porque os autores de tal código fonte sempre podem, unilateralmente, fazer com que o (re)uso seja ilegal. Uma licença resolve esse problema ao oferecer direitos a outros que não teriam de outra forma. Os direitos são oferecidos sob algumas condições que algumas vezes são um pouco diferente de uma licença para outra. Em contrates com licenças proprietárias, licenças abertas certificadas pela Open Source Initiative oferecem, pelo menos, os seguintes direitos, referenciados à Open Source Definition: 1. O código fonte está disponível, e pode ser utilizado e redistribuído sem restrições, incluindo como parte de uma coleção. 2. Modificações ou trabalhos derivados são permitidos, e a distribuição destes é permitida. 3. A questão de quem recebe esses direitos não está sujeita à discriminação, incluindo pelo tipo de uso como comercial versus acadêmico. Como escolher a licença mais adequada pode parecer um problema, dado que existem várias licenças. Na prática, algumas poucas licenças são populares, dentre as quais: • Licença Pública Geral GNU (GPL), 54 CAPÍTULO 9. CIÊNCIA ABERTA • Licença MIT, • Licença BSD. A GPL difere da maior parte das outras licenças de código aberto pois ela é viral: alguém que distribui um código baseado em um código GPL, ou que inclui código GPL, deve fazê-lo licenciando sob a GPL. O artigo a seguir oferece uma excelente visão geral sobre licenças e opções de licenças da perspectiva de um cientista que também escreve código: Morin, A., Urban, J., and Sliz, P. “A Quick Guide to Software Licensing for the Scientist-Programmer” PLoS Computational Biology 8(7) (2012): e1002598. No fim do dia o que importa é que exista uma declaração clara de qual a licença utilizada, e que essa licença seja uma já verificada e aprovada pela OSI. Além disso, é melhor escolher a licença no início do projeto, mesmo que o repositório ainda não seja público. Postergar a escolha de uma licença apenas torna as coisas mais complicadas depois, pois cada vez que um novo colaborador começa a contribuir, ele, também, possui direitos autorais e precisará ser consultado e concordar com uma mudança na licença. Licenciamento de produtos que não são programas de computador Se o conteúdo de um repositório possui resultado de uma pesquisa que não seja programas de computador, tais como dados, e/ou texto (manuais, relatórios técnicos, manuscritos), a maioria das licenças voltadas para programas de computador não são compatíveis. • Data: Na maioria das juridições a maior parte dos dados (possivelmente com exceção de fotos, imagens médicas, etc) são considerados fatos da natureza, e por esse motivo não são passíveis de proteção pelo direito autoral. Entretando, utilizando uma licença, que por definição atribui direito autoral, para indicar expectativa social e acadêmica por atribuição serve apenas para criar uma situação legal sombrio. É melhor deixar claro a situação legal utilizando uma “licença” de domínio público como a Creative Commons Zero (CC0), e as expectativas sociais com pedidos expressões de como utilizar e citar os dados. O repositório de dados Dryad requer isso. • Trabalhos criativos: Manuais, relatórios, manuscritos e outros trabalhos criativos são passíveis de proteção pelo direito autoral e acabam automaticamente protegidos pelo copyright, da mesma forma que código fonte de programa de computador. Creative Commons preparou um conjunto de licenças utilizando uma combinação de quatro restrições: HOSPEDAGEM 55 – Atribuição: trabalhos derivados devem dar créditos ao autor original pelo seu trabalho. – Não Derivado: pessoas podem copiar o trabalho mas precisam transmiti-lo sem modificações. – Compartilha Igual: trabalhos derivados precisam ser licenciados sob os mesmos termos do trabalho original. – Não Comercial: uso sem fins comerciais é permitido, mas uso comercial não. Apenas a Atribuição (CC-BY) e Compartilha Igual (CC-BY-SA) são licensas consideradas “Open”. Software Carpentry utiliza CC-BY para suas lições e a licença MIT para os códigos com o objetivo de encorajar os mais variados reusos. Novamente, o mais importante no arquivo LICENSE na raiz do seu projeto é declarar de forma clara a licença utilizada. Você também deveria incluir um arquivo CITATION ou CITATION.txt que descreva como referenciar seu projeto. O arquivo CITATION utilizado por Software Carpentry contem: To reference Software Carpentry in publications, please cite both of the following: Greg Wilson: "Software Carpentry: Lessons Learned". arXiv:1307.5448, July 2013. @online{wilson-software-carpentry-2013, author = {Greg Wilson}, title = {Software Carpentry: Lessons Learned}, version = {1}, date = {2013-07-20}, eprinttype = {arxiv}, eprint = {1307.5448} } Hospedagem A segunda grande pergunta para equipes que desejam abrir seu trabalho é onde hospedar seus códigos e dados. Uma opção é o laboratório, o departamento ou a universidade providenciar um servidor, gerenciar contas, cópias de segurança, . . . O benefício dessa abordagem é que deixa claro quem é dono do que, o que é particularmente importante se algum dos materiais é sensível (i.e., relacionado com experimentos envolvendo experimentos em seres humanos ou que serão utilizados para na aplicação por uma patente). O lado negativo dessa abordagem é o custo de manter o serviço e sua longevidade: um pesquisador que passou os últimos dez anos coletando dados deseja ter certeza que os dados coletados irão 56 CAPÍTULO 9. CIÊNCIA ABERTA estar disponíveis pelos próximos dez anos mas, infelizmente, os financiamentos para infraestruturas acadêmicas não duram mais que alguns anos. Outra opção é comprar um domínio e pagar um Internet service provider (ISP) para hospedar o conteúdo. Essa abordagem permite maior controle por parte do indivíduo e do grupo mas pode criar problemas quando mudando de instituição e necessitará de mais tempo e esforço do que as outras opções listadas nessa página. A terceira opção é utilizar um serviço de hospedagem gratuito como GitHub, BitBucket, ou SourceForge. Todos esses serviços oferecem uma interface web que possibilita as pessoas criarem, visualizarem e editarem seus repositórios. Esses serviços também oferecem ferramentas para comunicação e gerenciamento do projeto que incluem lista de problemas, wiki, notificação por email e revisão de código. Esses serviços se beneficiam da economia de escala e efeito de rede: é mais fácil manter funcionando um grande serviço do que vários pequenos serviços nos mesmos padrões. Além disso é mais fácil para pessoas colaborarem se estiverem utilizando o mesmo serviço: utilizar um serviço popular pode ajudar a conectar seu projeto com comunidades que já utilizam o mesmo serviço. Como um exemplo, a Fundação Software Carpentry utiliza o GitHub para hospedagem de seus projetos que inclui essa lição. Qualquer pessoa com uma conta no GitHub pode sugerir mudanças nesse texto. Posso utilizar uma licença aberta? Compartilhar é o desejável para a ciência mas muitas instituições podem impedir seus pesquisadores de fazer, por exemplo porque quererem se proteger para futuras aplicações de patentes. Se você deparar-se com tais restrições, pode ser produtivo você perguntar sobre as motivações para as restrições - tanto como primeiro passo para pedir uma exceção para um projeto específico como também para tentar uma reforma mais ampla no nível institucional na direção da ciência aberta. Posso utilizar uma licença aberta? Encontre em que parte do seu trabalho você pode aplicar uma licença de código aberta. Você pode fazer isso unilateralmente ou você precisa da permissão de alguém na sua instituição? Se precisa de permissão, quem é essa pessoa? Meu trabalho pode ser público? Descubra se você pode hospedar seu trabalho em um serviço gratuito. Você pode fazer isso unilateralmente ou você precisa da permissão MEU TRABALHO PODE SER PÚBLICO? de alguém na sua instituição? Se precisa de permissão, quem é essa pessoa? 57 58 CAPÍTULO 9. CIÊNCIA ABERTA Capítulo 10 Motivação Por que utilizar Controle de Versão? Deixar que um programa lide com o controle de versão do seu projeto permite que você foque-se no seu projeto. Por que Git? Porque muitas pessoas estão utilizando o GitHub para colaborar. Próximos Passos Vamos começar! 59 60 CAPÍTULO 10. MOTIVAÇÃO Capítulo 11 Referência Configurando o Git • Usar git config para configurar o nome de usuário, endereço de email, editor e outras preferências em uma máquina. Criando um repositório • git init inicializa um repositório. Monitorando alterações • git status mostra o estado de um repositório. • Arquivos podem ser armazenados no diretório de trabalho do projeto (que o usuário visualiza), na área intermediária (onde a próxima versão está sendo construída) e no repositório local (onde snapshots são salvos permanentemente). • git add move os arquivos para a área temporária. • git commit cria um novo snapshot da área temporária no repositório local. • Sempre escreva uma mensagem descritiva quando criar uma nova revisão. Explorando o histórico • git diff mostra a diferença entre revisões. • git checkout recupera uma versão anterior. 61 62 CAPÍTULO 11. REFERÊNCIA Ignorando Arquivos • O arquivo .gitignore informa o Git quais arquivos devem ser ignorados. Colaborando • Um repositório Git local pode ser conectado com um ou mais repositórios remotos. • Utilize o protocolo HTTPS para comunicar-se com um repositório remoto até que você aprenda como configurar autenticação via SSH. • git push copia as mudanças de um repositório local para um repositório remoto. • git pull copia as mudanças de um repositório remoto para um repositório local. • git clone copia um repositório remoto para criar um repositório local que possui um repositório remoto chamado de origin automaticamente configurado. Conflitos • Conflitos ocorrem quando duas ou mais pessoas alteram o mesmo arquivo ao mesmo tempo. • Um sistema de controle de versão não deixa um usuário sobre-escrever as alterações de um outro usuário cegamente. Ao contrário, ele destaca os conflitos para que estes possam ser resolvidos. Ciência Aberta • Trabalhos científicos são mais úteis e mais citados que trabalhos científicos fechados. • Pessoas que incorporam software GPL em seus softwares devem torná-los abertos utilizando a GPL; a maioria das outras licenças não requer isso. • A família de licenças Creative Commons permite que pessoas misturem requerimentos e restrições de atribuição, criação de trabalhos derivados, compartilhamento, e comercialização. • Pessoas que não são advogados não devem tentar escrever licenças começando do zero. • Projetos podem ser hospedados nos servidores da universidade, em um domínio pessoal, ou em repositórios públicos. GLOSSÁRIO 63 • Regras relacionadas com a propriedade intelectual e armazenamento de informações sensíveis são válidas independentemente de onde o código e o dado são hospedados. Glossário conjunto de alterações Um grupo de alterações em um ou mais arquivos que são salvos em um repositório sob controle de versão em uma única operação. commit Ação de salvar o estado atual de um conjunto de arquivos (um conjunto de alterações) em um repositório sob controle de versão. Se um commit contem mudanças em vários arquivos, todas as alterações são salvas em conjunto. conflito Uma alteração feita por um usuário do sistema de controle de versão que é incompatível com as alterações feitas por outros usuários. Auxiliar usuários a resolver conflitos é uma das maiores tarefas de um sistema de controle de versão. HTTP O Protocolo Hypertext Transfer usado para compartilhar páginas da internet e outros dados na World Wide Web. licenças infecciosas Uma licença como a GPL que obriga as pessoas que incorporam material sob essa licença em seu trabalho a utilizar a mesma licença ou uma com requerimentos similares. merge (um repositório): Reconciliar dois conjuntos de alterações em um repositório. protocolo Um conjunto de regras que definem como um computador se comunica com outro. Protocolos populares na Internet incluem HTTP e SSH. remoto Um repositório sob controle de versão que não o atual que de alguma forma é um espelho ou está conectado com o atual. repositório Uma área de armazenamento onde um sistema de controle de versão armazena revisões anteriores dos arquivos e informações sobre quem, quando e onde criou uma nova revisão. resolver Eliminar os conflitos entre duas ou mais alterações incompatíveis em um arquivo ou um conjunto de arquivos que estão sendo gerenciados por um sistema de controle de versão. revisão Um registro do estado de um repositório de controle de versão. SSH O protocolo Secure Shell utilizado para a comunicação segura entre computadores. timestamp O registro de quando um evento em particular ocorreu. controle de versão Uma ferramenta para gerenciar alterações em um conjunto de arquivos. Cada conjunto de mudanças cria uma nova revisão dos arquivos; o sistema de controle de versão permite os usuários recuperarem versões anteriores de forma segura, e ajuda a gerenciar conflitos entre 64 CAPÍTULO 11. REFERÊNCIA alterações feitas por diferente usuários. Capítulo 12 Discussão Frequently Asked Questions People often have questions about Git beyond the scope of the core material. Students who have completed the rest of the lessons might find value in looking through the following topics. Note that since this material isn’t essential for basic Git usage, it won’t be covered by the instructor. More Advanced Git Configuration In Setting Up Git, we used git config --global to set some default options for Git. It turns out that these configuration options get stored in your home directory in a plain text file called .gitconfig. $ cat ~/.gitconfig [user] name = Vlad Dracula email = [email protected] [color] ui = true [core] editor = nano This file can be opened in your preferred text editor. (Note that it is recommended to continue using the git config command, as this helps avoid introducing syntax errors.) 65 66 CAPÍTULO 12. DISCUSSÃO Eventually, you will want to start customizing Git’s behaviour. This can be done by adding more entries to your .gitconfig. The available options are described in the manual: $ git config --help In particular, you might find it useful to add aliases. These are like shortcuts for longer git commands. For example, if you get sick of typing git checkout all the time, you could run the command: $ git config --global alias.co checkout Now if we return to the example from Exploring History where we ran: $ git checkout f22b25e mars.txt we could now instead type: $ git co f22b25e mars.txt Styling Git’s Log A good target for customization is output from the log. The default log is quite verbose but gives no graphical hints such as information about which commits were done locally and which were pulled from remotes. Use git log --help and git config --help to look for different ways to change the log output. How do you expect the log to look after running the following commands? $ $ $ $ git git git git config --global alias.lg "log --graph" config --global log.abbrevCommit true config --global format.pretty oneline lg You can try the commands out and if you decide you don’t like the effect, you can get rid of them by running: $ git config --global --unset alias.lg $ git config --global --unset log.abbrevCommit $ git config --global --unset format.pretty VERSION CONTROLLING THE GITCONFIG 67 Version Controlling the Gitconfig In the previous challenge, we suggested using the --unset flag to delete unwanted options from .gitconfig. Another way to roll back changes is to version control your .gitconfig using Git. Go to GitHub and do a search for “gitconfig”. You will hopefully see hundreds of repositories in which people have stored their own Git configuration files. Sort them by most number of stars and have a look at the top few. Do you see any ideas for things you might want to try out in your own .gitconfig? (Remember to check that they’re using an open source license before you clone their work for your own use.) Non-text Files Recall when we discussed Conflicts there was a challenge that asked: What does Git do when there is a conflict in an image or some other non-textual file that is stored in version control? We will now revisit this in more detail. Many people want to version control non-text files, such as images, PDFs and Microsoft Office or LibreOffice documents. It is true that Git can handle these filetypes (which fall under the banner of “binary” file types). However, just because it can be done doesn’t mean it should be done. Much of Git’s magic comes from being able to do line-by-line comparisons (“diffs”) between files. This is generally easy for programming source code and marked up text. For non-text files, a diff can usually only detect that the files have changed but can’t say how or where. This has various impacts on Git’s performance and will make it difficult to compare different versions of your project. For a basic example to show the difference it makes, we’re going to go see what would have happened if Dracula had tried using outputs from a word processor instead of plain text. Create a new directory and go into it: $ mkdir planets-nontext $ cd planets-nontext Use a program such as Microsoft Word or LibreOffice Writer to create a new document. Enter the same text that we began with before: 68 CAPÍTULO 12. DISCUSSÃO Cold and dry, but everything is my favorite color Save the document into the planets-nontext directory with the name of mars.doc. Back in the terminal, run the usual commands for setting up a new Git repository: $ git init $ git add mars.doc $ git commit -m "Starting to think about Mars" Then make the same changes to mars.doc that we (or Vlad) previously made to mars.txt. Cold and dry, but everything is my favorite color The two moons may be a problem for Wolfman Save and close the word processor. Now see what Git thinks of your changes: $ git diff diff --git a/mars.doc b/mars.doc index 53a66fd..6e988e9 100644 Binary files a/mars.doc and b/mars.doc differ Compare this to the earlier git diff obtained when using text files: diff --git a/mars.txt b/mars.txt index df0654a..315bf3a 100644 --- a/mars.txt +++ b/mars.txt @@ -1 +1,2 @@ Cold and dry, but everything is my favorite color +The two moons may be a problem for Wolfman Notice how plain text files give a much more informative diff. You can see exactly which lines changed and what the changes were. An uninformative git diff is not the only consequence of using Git on binary files. However, most of the other problems boil down to whether or not a good diff is possible. This isn’t to say you should never use Git on binary files. A rule of thumb is that it’s okay if the binary file won’t change very often, and if it does change, you don’t care about merging in small differences between versions. NON-TEXT VERSION CONTROL 69 We’ve already seen how a word processed report will fail this test. An example that passes the test is a logo for your organization or project. Even though a logo will be stored in a binary format such as jpg or png, you can expect it will remain fairly static through the lifetime of your repository. On the rare occasion that branding does change, you will probably just want to replace the logo completely rather than merge little differences in. Non-text Version Control How would you write a program to diff non-text files? If you go through two files byte by byte, it might be easy to find the first place where differences begin. However, what if two stretches in the middle of a file are exactly the same but have different start locations? Or if a stretch of bytes in one file is identical to two different stretches in the other file, which should be privileged as the matching part? Try Googling for phrases such as non-text diff and binary version control to see what ideas and solutions other people have come up with. (You might also see some more arguments about why you shouldn’t use binary files with Git.) 70 CAPÍTULO 12. DISCUSSÃO Capítulo 13 Guia para Instrutores Legend Overall Version control might be the most important topic we teach, but Git is definitely the most complicated tool. However, GitHub presently dominates the open software repository landscape, so we have to help novices learn just enough Git to feel they can and should learn more on their own. This is why we don’t teach branching: while it is a power tool in the hands of a knowledgeable user, it is an extra cognitive burden for someone who is new to the idea of version control. This is also why we don’t get into hashes and commit objects with novices, but try instead to convince them that version control is: 1. a better backup system; 2. a better Dropbox; and 3. a better way to collaborate than mailing files back and forth. We close with material on licensing because: 1. questions about who owns what, or can use what, arise naturally once we start talking about using public services like GitHub to store files; and 2. the discussion gives learners a chance to catch their breath after what is often a frustrating couple of hours. 71 72 CAPÍTULO 13. GUIA PARA INSTRUTORES Teaching Notes • Try to make it clear that Git and GitHub are not the same thing: Git is an open source version control tool, GitHub is a company that’s built a really useful website on top of it. • Ask, “Who uses ‘undo’ in their editor?” They say, “ ‘Undo’ is the simplest form of version control.” • Decide in advance whether all the learners will work in one shared repository, or whether they will work in pairs (or other small groups) in separate repositories. The former is easier to set up; the latter runs more smoothly. • Make sure the network is working before starting this lesson. • Give learners a five-minute overview of what version control does for them before diving into the watch-and-do practicals. Most of them will have tried to co-author papers by emailing files back and forth, or will have biked into the office only to realize that the USB key with last night’s work is still on the kitchen table. Instructors can also make jokes about directories with names like “final version”, “final version revised”, “final version with reviewer three’s corrections”, “really final version”, and, “come on this really has to be the last version” to motivate version control as a better way to collaborate and as a better way to back work up. • Version control is usually not the first subject in a workshop, so get learners to create a GitHub account after the session before. • When giving instructions, be very clear which files learners are to edit: it is common for them to (for example) edit the instructor’s biography rather than their own, or to use the instructor’s user ID when committing. • Be equally clear when they are to edit things: it’s also common for someone to edit the file the instructor is editing and commit changes while the instructor is explaining what’s going on, so that a conflict occurs when the instructor comes to commit the file. • If some learners are using Windows, there will inevitably be issues merging files with different line endings. (Even if everyone’s on some flavor of Unix, different editors may or may not add a newline to the last line of a file.) Take a moment to explain these issues, since learners will almost certainly trip over them again. • We don’t use a Git GUI in these notes because we haven’t found one that installs easily and runs reliably on the three major operating systems, and because we want learners to understand what commands are being run. That said, instructors should demo a GUI on their desktop at some point during this lesson and point learners at this page. SETTING UP GIT 73 • Instructors should show learners graphical diff/merge tools like DiffMerge. • When appropriate, explain that we teach Git rather than CVS, Subversion, or Mercurial primarily because of GitHub’s growing popularity: CVS and Subversion are now seen as legacy systems, and Mercurial isn’t nearly as widely used in the sciences right now. Setting Up Git We suggest instructors and students use nano as the text editor for this lessons because: • it runs in all three major operating systems, • it runs inside the shell (switching windows can be confusing to students), and • it has shortcut help at the bottom of the window. Please point out to students during setup that they can and should use another text editor if they’re already familiar with it. Below you will find some tips that could help solving problems when using other editors. Creating a Repository The challenge “Places to create repositories” tries to reinforce the idea that the .git folder contains the whole Git repo and deleting this folder undoes a git init. It also gives the learner the way to fix the common mistake of putting unwanted folders (like Desktop) under version control. Instead of removing the .git folder directly, you can choose to move it first to a safer directory and remove it from there: mv .git temp_git rm -rf temp_git Tracking Changes Exploring History • One thing that has caused confusion comes up when recovering old versions towards the end of “Exploring history”. If, instead of doing $ git 74 CAPÍTULO 13. GUIA PARA INSTRUTORES checkout f22b25e mars.txt, someone does $ git checkout f22b25e, they wind up in the “detached HEAD” state and confusion abounds. It’s then possible to keep on committing, but things like git push origin master a bit later will not give easily comprehensible results. It also makes it look like commits can be lost. Ignoring Things Collaborating • If your learners are advanced enough to be comfortable with SSH, tell them they can use keys to authenticate on GitHub instead of passwords, but don’t try to set this up during class: it takes too long, and is a distraction from the core ideas of the lesson. • Role playing between two instructors can be effective when teaching the collaboration and conflict sections of the lesson. One instructor can play the role of the repository owner, while the second instructor can play the role of the collaborator. If it is possible, try to use two projectors so that the computer screens of both instructors can be seen. This makes for a very clear illustration to the students as to who does what. It is also effective to pair up students during this lesson and assign one member of the pair to take the role of the owner and the other the role of the collaborator. In this setup, challenges can include asking the collaborator to make a change, commit it, and push the change to the remote repository so that the owner can then retreive it, and vice-versa. The role playing between the instructors can get a bit “dramatic” in the conflicts part of the lesson if the instructors want to inject some humor into the room. • If you don’t have two projectors, have two instructors at the front of the room. Each instructor does their piece of the collaboration demonstration on their own computer and then passes the projector cord back and forth with the other instructor when it’s time for them to do the other part of the collaborative workflow. It takes less than 10 seconds for each switchover, so it doesn’t interrupt the flow of the lesson. And of course it helps to give each of the instructors a different-colored hat, or put different-colored sticky notes on their foreheads. Conflicts Open Science Capítulo 14 Licença Material Todo o material da Software Carpentry é disponibilizado sob a licença Creative Commons Atribuição 4.0 Internacional. A seguir encontra-se um sumário do texto legal completo da licença Creative Commons Atribuição 4.0 Internacional e não é um substituto para esse. Você é livre para: • Compartilhar—copiar e redistribuir o material em qualquer mídia ou formato • Adaptar—remixar, transformar, e criar a partir do material para qualquer fim, mesmo que comercial. O licenciante não pode revogar estes direitos desde que você respeite os seguintes termos: • Atribuição—Você deve dar crédito (mencionando que seu trabalho é derivado de um trabalho cujos direitos são da Software Carpentry e, quando possível, incluir um link para http://software-carpentry.org/), incluir um link para a licença utilizada, e indicar se alterações foram feitas. Você pode fazê-lo de qualquer maneira razoável, mas de nenhuma maneira que sugira o licenciante aprove seu uso. Sem restrições adicionais—Você não pode aplicar termos jurídicos ou medidas de caráter tecnológico que restrinjam legalmente outros de fazerem algo que a licença permita. Avisos: 75 76 CAPÍTULO 14. LICENÇA • Você não tem de cumprir com os termos da licença relativamente a elementos do material que estejam no domínio público ou cuja utilização seja permitida por uma exceção ou limitação que seja aplicável. • Não são dadas quaisquer garantias. A licença pode não lhe dar todas as autorizações necessárias para o uso pretendido. Por exemplo, outros direitos, tais como direitos de imagem, de privacidade ou direitos morais, podem limitar o uso do material. Software Exceto onde indicado o contrário, exemplos de programas e outros softwares fornecidos pela Software Carpentry são disponibilizados sob a licença MIT. que é aprovada pela OSI. A permissão é concedida, a título gratuito, para qualquer pessoa que obtenha uma cópia deste software e arquivos de documentação associados (o “Software”), para lidar com o Software sem restrição, incluindo, sem limitação dos direitos de uso, copiar, modificar, mesclar , publicar, distribuir, sublicenciar e / ou vender cópias do Software, e para permitir que as pessoas às quais o Software é fornecido a fazê-lo, mediante as seguintes condições: O aviso de direito autoral acima e este aviso de permissão devem ser incluídos em todas as cópias ou partes substanciais do Software. O Software é fornecido “como está”, sem qualquer tipo de garantia, expressa ou implícita, incluindo mas não se limitando a garantias de comerciabilidade, adequação a uma finalidade específica e não violação. Em nenhum caso os autores ou os detentores dos direitos autorais se responsabilizarão por qualquer reclamação, danos ou qualquer outra responsabilidade, seja em razão de contrato, ato ilícito ou de outra forma, resultantes de ou em conexão com o software ou a utilização ou outras negociações no Software. Trademark “Software Carpentry” e o logo Software Carpentry são marcas registradas trademarks de NumFOCUS.
Documentos relacionados
PDF file
projeto, ou arquivos para um website. Agora se quiser manter suas versões anteriores, terá que arquivar todo um diretório ou vários. Manter muitas versões na mão é inconveniente e rapidamente se to...
Leia maisO básico sobre os objetos no git
A forma mais fácil para ver o que está no index é com o comando git status. Quando você roda o git status, você pode ver quais arquivos estão selecionados para o próximo commit (atualmente no seu i...
Leia mais