Código
install.packages("usethis")
install.packages("gitcreds")
usethis::create_github_token()
gitcreds::gitcreds_set()
O controlo de versões é um sistema que regista as alterações feitas a um ficheiro ou a um conjunto de ficheiros ao longo do tempo. Os objetivos deste registo serve várias funções, mas a mais importante seráa de recuperar versões específicas mais tarde e de poder gerir múltiplas versões do mesmo ficheiro.
Durante o processo de análise dados para detetar insights, iremos ter um processo iterativo de exploração de dados e será relavante guardar todas as versões do seu script de análise. Um Sistema de Controlo de Versões (SCV) permite fazer exatamente isso de forma robusta e organizada.
Com um SCV, podemos:
Existem várias abordagens para o controlo de versões:
projeto_v2
, projeto_final_mesmo
). É simples, mas muito propenso a erros. É fácil esquecer-se em que pasta está o ficheiro mais recente e manter um registo ativo das alterações feitas entretanto. Existem sistemas melhores como o RCS que guardam a diferença entre ficheiros para poder ser recriado uma versão anterior (Chacon e Straub 2014)
Vantagem:
Desvantagem:
Vantagens:
Desvantagens:
A grande diferença do Git é a forma como ele “pensa” nas alterações de dados. Muitos sistemas de controlo de versões armazenam a informação como uma lista de alterações feitas em cada ficheiro. O Git pensa nos seus dados mais como uma série de fotos de um mini sistema de ficheiros.
Num commit, o Git guarda o estado do projeto tirando uma “fotografia” do aspeto de todos os seus ficheiros nesse momento e armazena uma referência a essa fotografia.
Quandos os ficheiros não mudam de uma fotografia para outra o Git guarda uma referência à última alteração.
Operações Locais e Rápidas: Como temos o histórico completo do projeto na pasta git, a maioria das operações (como ver o histórico ou comparar versões) é quase instantânea e corre de forma local na “nossa” cópia local.
Integridade de Dados: Existe um processo de validação denominado de checksum antes do ficheiro ser armazenado baseado no conteúdo e a estrutura da pasta onde o Git se encontra. Isto significa que é impossível alterar o conteúdo de qualquer ficheiro ou diretório sem que o Git saiba.
Centrado na Contínua Adição de Conteúdo: Quase todas as ações no Git apenas adicionam dados à base de dados do Git. É muito difícil perder trabalho que já foi “fotografado”.
A distinção destes 3 estados é crucial para trabalhar com o Git eficazmente. Exitem 3 grandes estados nos quais os ficheiros podem estar: 1. Ficheiros modificado: Significa que existem alterações de um ficheiro, mas ainda não foram guardadas na base de dados do Git local. Estas são as alterações na sua pasta de trabalho. 2. Preparado (Staged): Significa que marcou um ficheiro modificado na sua versão atual para fazer parte do seu próximo commit (a próxima fotografia “snapshot”). 3. Depositados (Committed): Significa que os dados estão guardados de forma segura na sua base de dados local do Git.
Existem também três áreas de trabalho distintas:
O fluxo de trabalho básico do Git seria o seguinte:
No geral o Git é frequentemente utilizado no terminal ou linha de comandos. O foco deste curso será uma introdução à utilização às ferramentas com interface gráfica.
O GitHub disponibiliza clientes desktop para Windows e Mac que incluem um interface gráfico para as ações mais comuns.
Estes clientes também incluem ferramentas para a linha de comandos para cenários mais avançados.
::: {.callout-note collapse=“true”, title=“Comandos de Terminal Gerais”}
Aqui estão os comandos no terminal que correspondem a este fluxo:
git status
para ver o que foi alterado. Mostra os ficheiros na working directory que foram modificados.git add nome_do_ficheiro.R
. Se executar git status
novamente, verá que o ficheiro passou para a secção “Changes to be committed”.git commit -m "Mensagem descritiva do commit"
.Para além destes comando poderão serpre utilizar o git help <verb>
para termos as decrição :::
Neste módulo, iremos focar-nos exclusivamente no GitHub Desktop, mas é útil entender a teoria por detrás da ferramenta Git.
O Github é a maior plataforma de armazenamento remoto de repositórios Git, permitindo a colaboração entre milhões de programadores e projetos. Para além de ter em sido contido uma versão do sistema Git, tem múltiplas funcionalidades úteis como a manutenção de problemas ( issues ), revisão de código, publicação de websites e livros entre outros.
::: {.callout-note collapse=“false”, title=“Utilidade dos sitemas de GIT e GITHUB na ciência de dados”}
Usar Git e GitHub pode parecer complexo no início, mas os benefícios para um cientista de dados são enormes:
:::
Antes de começar, precisa de uma conta no GitHub e de instalar o GitHub Desktop.
Para começarmos a usar o GitHub, precisamos de criar uma conta pessoal gratuita. Esta conta será a vossa identidade na plataforma. Cada utilizador tem: - Nome de utilizador; - Perfil pessoal; - Endereço de e-mail verificado.
Para começarmos devemos visitar github.com e criar uma conta gratuita. Escolham um nome de utilizador profissional, uma vez que em todos os vossos commits, este será o nome na autoria dos commits.
### Criação de Chave para ligar computador ao Github (Opcional)
Esta secção foi criada para os utilizadores que queiram ter um pouco mais de informação e queriam maior flexibilidade de trabalho com o Github.
Como explicado em cima, os projetos no GitHub privado são como um cofre pessoal. Não é desejável que qualquer pessoa possa abrir esse cofre e mexer nos seus dados e nos projetos. Neste sentido, sempre que o seu computador tenta enviar (um push) ou receber (um pull) código, o GitHub pergunta: “Quem somos e se temos permissão para fazer isto?”.
Existem dois métodos principais para criar esta ligação segura:
Um Personal Access Token (ou PAT) é uma alternativa mais segura à palavra-passe. É uma longa cadeia de caracteres que funciona como uma palavra-passe, mas com algumas vantagens importantes:
Ao tentarem criar irá abrir uma nova página no vosso browser, já na secção de criação de tokens do GitHub. Podem seguir estes passos na página web:
install.packages("usethis")
install.packages("gitcreds")
usethis::create_github_token()
gitcreds::gitcreds_set()
Esta é uma alternativa poderosa e muito usada por developers. O conceito baseia-se num par de chaves:
A chave pública funciona como um cadeado que se instala no GitHub, e a chave privada é a única chave que consegue abrir esse cadeado.
Este resumo apenas pretende que saibam que estas opções existem, não sendo esta a forma como iremos trabalha com o Github nesta fase.
Embora possa usar o Git através de linhas de comando, existe uma forma muito mais visual e intuitiva de o fazer: o GitHub Desktop.
Como já foi referido anteriormente iremos focar a interface gráfica do GitHub Desktop por ser de mais fácil interação para quem está a começar.
Instalar o GitHub Desktop: Descarregue e instale a aplicação a partir de desktop.github.com.
Fazer Login e Configure o Git:
user.name
) e email (user.email
) para o Git.É crucial que use o mesmo email da sua conta GitHub. Esta configuração identifica quem fez cada alteração. O GitHub Desktop trata disto por si.
O GitHub Desktop é uma aplicação gratuita que simplifica o uso do Git, abstraindo estes três estados numa interface gráfica simples, onde as suas alterações são visíveis e os passos de stage e commit são combinados numa única ação.
Agora iremos tentar pôr-vos a trabalhar. Este guia irá acompanhar-vos desde a criação de um novo repositório até à publicação do seu primeiro projeto no GitHub,usando apenas o GitHub Desktop.
Um repositório (ou “repo”) é simplesmente uma pasta que contém todos os ficheiros do seu projeto, juntamente com o seu histórico de alterações.
Vamos criar um novo repositório no seu computador.
Novo repositório: Cria novo repositório a nível local
Adicionar novo repositório local em que podem adicionar o Git a um repostitório que já tenham no vosso computador.
Clonar um repositório, que significa criar uma cópia completa de um repositório Git existente, incluindo o histórico de commits, os ramos, os arquivos do projeto e as configurações.
primeiro-projeto-ds
).Documentos/GitHub
).README.md
é o “cartão de visita” do seu projeto e é boa prática colocar para facilitar quem visita .R
na lista. Isto cria um ficheiro .gitignore
que diz ao Git para ignorar ficheiros temporários e desnecessários comuns em projetos de R.MIT License
). Uma licença define como outras pessoas podem usar o seu código.Parabéns, acabaram de criar o seu primeiro repositório Git no seu computador!
Poderão neste momento: - Publicar o repositório no GitHub - Abrir a pasta do projeto num editor (Notepad++, VScode ou o Rstudio) - Ver a pasta do Projeto no Explorador ou no Finder
A criação de um repositório no terminal envolve alguns passos:
cd "C:/Users/SeuUtilizador/Documents/GitHub/primeiro-projeto-ds"
.git
oculta que contém toda a magia.git init
README.md
, .gitignore
, etc.) à área de preparação ( staging area ).git add .
O .
é um atalho para “todos os ficheiros nesta pasta”.
Agora que o repositório está criado, vamos seguir o ciclo de trabalho que vimos anteriormente.
README.md
com um editor de texto (como o RStudio, VS Code, ou Bloco de Notas) e adicione uma linha de texto, por exemplo: “Este é o meu primeiro projeto de Data Science com Git!”. 3. Faça o Commit:
Adiciona descrição inicial ao README
.main
.O seu commit está agora guardado no histórico do seu repositório local. main
é o nome do ramo (branch) principal do seu projeto.
modified
mas não staged
), use git status
.git diff
.git add README.md
.git commit -m "Adiciona descrição inicial ao README"
.Agora também poderão ver o opções que estão disponíveis para a linha temporal tais como: 1. Resetar Commit (Reset)
Volta no tempo e remove definitivamente um ou mais commits do histórico atual.
Útil para: apagar commits locais antes de enviar para o servidor.
Permite aceder ao conteúdo de qualquer commit específico.
Temos acesso de leitura ao estado do projeto naquele ponto do tempo.
Útil para: testes, builds antigos ou análise.
Mudar a ordem dos commits.
Permite que reorganizes a sequência de commits locais (com rebase -i).
Altera o histórico, então só deve ser feito em commits ainda não enviados para o servidor remoto (GitHub).
Útil para: limpezas antes do push, reorganizar lógica do histórico.
Criado um novo commit que desfaz as alterações feitas num commit anterior.
Seguro porque não reescreve o histórico.
Útil para: desfazer erros sem reescrever commits.
Cria uma nova linha de desenvolvimento a partir de um commit específico.
Muito útil quando queres explorar uma ideia a partir de um ponto antigo do projeto
Útil para: debugging, hotfixes ou provas de conceito a partir de pontos antigos
Cria uma marca permanente num commit.
Tags servem para identificar versões, releases ou marcos importantes. Exemplo: v1.0, beta-2, etc.
Útil para: gerar builds de produção, marcar versões importante
Permite escolher um commit de qualquer ramo e "copiar" as alterações para a branch atual.
Cria um novo commit com o conteúdo daquela alteração.
Útil para: aplicar só uma funcionalidade ou correção sem a branch toda.
A mensagem de commit é um dos aspetos mais importantes de um bom fluxo de trabalho e na colaboração. Ela explica o porquê de uma alteração.
Uma mensagem bem escrita é uma ajuda imensa para os seus colegas e para o seu “eu” do futuro.
Regras para uma boa mensagem (Summary):
Adiciona script de limpeza de dados
Adicionei o script de limpeza
ou Script de limpeza adicionado
Corrige erro de cálculo na média de idade
Correções
ou Bug fix
Exemplos de Mensagens de Commit em Ciência de Dados:
Bom (Sumário)
|
Mau |
---|---|
Adiciona gráfico de dispersão de peso vs. altura |
Gráfico novo |
Remove colunas duplicadas do dataset de clientes |
Limpeza de dados |
Altera o modelo de regressão para RandomForest |
Update do modelo |
Aumenta o tamanho da fonte nos eixos do gráfico |
Ajustes |
Corrige erro na importação de ficheiros CSV com ; |
Erro corrigido |
Adiciona documentação da função 'calculate_mean' |
Docs |
No campo Description (opcional no GitHub Desktop), pode adicionar mais detalhes se a alteração for complexa.
::: {.callout-note collapse=“true title=”Comando de Terminal para Commit”} No terminal, um commit com sumário e descrição seria assim:
git commit -m "Adiciona script de limpeza de dados" -m "O script remove valores NAs das colunas 'idade' e 'salário' e converte a coluna 'data_registo' para o formato datetime."
:::
Até agora, o seu projeto só existe no seu computador. Vamos publicá-lo para que fique guardado online no seu perfil do GitHub.
O GitHub Desktop irá enviar todos os seus ficheiros e o histórico de commits para o GitHub. Se visitar o seu perfil em github.com/seu-username
, verão lá o seu novo repositório!
Publicar um repositório local para o GitHub pela primeira vez envolve dois passos:
origin
é o nome padrão para o seu repositório remoto principal.::: {.cell}
```{.bash .cell-code}
git remote add origin https://github.com/seu-username/primeiro-projeto-ds.git
```
:::
main
para o remoto origin
. O -u
estabelece uma ligação para que futuros push
e pull
sejam mais simples.git push -u origin main
O seu projeto está agora online. E se fizer mais alterações? O ciclo é quase o mesmo.
Nova Tarefa: 1. Modificar um ficheiro localmente (por exemplo, adicione mais texto ao README.md
). 2. Faça o Commit dessa alteração no GitHub Desktop (com uma nova mensagem, ex: Detalha objetivos do projeto
). Agora, o seu repositório local está um commit à frente do repositório no GitHub. O GitHub Desktop mostra-lhe isso. 3. Faça o Push: Clique no botão Push origin para enviar o seu novo commit para o GitHub.
Este é o ciclo essencial para trabalhar sozinho: Modificar -> Commit -> Fazer Push.
Depois de fazer um novo commit, para o enviar para o GitHub, o comando é mais simples:
git push
Para ver o histórico de commits, pode usar:
git log --oneline --graph
Isto mostra a sequência de commits de forma compacta e gráfica.
Agora iremos focar no poder do GitHub enquanto ferramenta de colaboração. Vamos ver como pode juntar-se a um projeto existente e trabalhar em equipa usando o GitHub Desktop.
Quando quer contribuir para um projeto que já existe no GitHub, o primeiro passo é clonar o repositório. Clonar significa criar uma cópia local do projeto no seu computador, já ligada ao repositório online.
Vá à página do projeto no GitHub.
Clique no botão verde “<> Code”.
Selecione o separador “HTTPS” e clique no botão “Open with GitHub Desktop”.
O seu browser irá pedir permissão para abrir o GitHub Desktop. Permita.
O GitHub Desktop irá abrir e perguntar-lhe onde quer guardar o projeto no seu computador (Local Path). Confirme a localização e clique em Clone.
Agora tem uma cópia completa do projeto no seu computador, incluindo todo o seu histórico.
Clonar um repositório no terminal é muito direto. Basta usar o comando git clone
seguido do URL que encontra no site do GitHub.
git clone https://github.com/nome-do-dono/nome-do-repo.git
# Exemplo: https://github.com/jdrdionisio/gerador_certificado
Isto cria uma pasta com o nome do repositório e descarrega tudo para lá.
O ciclo individual assume que temos uma versão remota e uma versão local onde não haverá alterações remotas que necessitemos de ir buscar. Na analogia de fotografias, que não temos fotografias mais recentes do nosso trabalho de outros colaboradores. No entanto, em equipa, várias pessoas estão a fazer push (tirar fotografias) de alterações para o mesmo repositório. Assim, precisamos de uma forma de nos manter atualizado com o trabalho dos outros e de partilhar o seu.
Fetch
encontrar alterações, o botão transforma-se em Pull origin. Ao clicar nele, o GitHub Desktop irá descarregar essas alterações e aplicá-las (fazer merge ) aos seus ficheiros locais. Isto garante que está a trabalhar na versão mais recente do projeto.O ciclo de colaboração é: Pull -> Modificar -> Commitar -> Push.
Execute sempre o Pull
antes de começar a trabalhar para evitar conflitos!
O ciclo de colaboração no terminal é o seguinte: 1. Verificar novidades (Fetch): Descarrega a informação sobre novos commits, mas não os aplica aos seus ficheiros.
git fetch origin
pull
é, na verdade, um fetch
seguido de um merge
. Ele baixa as alterações e tenta fundi-las com o seu trabalho local. Assume que o ramo major se chama main que a predefinição, mas poderá não ser o utilizado no vosso projeto.git pull origin main
git push origin main
Vamos observar duas situaçõe comuns:
A vossa equipa tem de realizar um relatório semanal e nós queremos experimentar uma nova análise sem afetar o projeto principal?
Ou se duas pessoas estiverem a trabalhar em funcionalidades diferentes do projeto ao mesmo tempo que não queremos que afetem os sistemas de produção?
A solução é usar branches (ramos).
Um ramo é uma linha de desenvolvimento paralela. Permite trabalhar isoladamente sem perturbar o ramo principal (que se chama, por defeito, main
). Um branch é, na sua essência, apenas um ponteiro leve e móvel para um dos seus commits. O nome de branch por defeito no Git é master
.
Imagine o ramo main
como a versão “oficial” e funcional do seu projeto. Nunca se deve trabalhar diretamente nela se estivermos a falar de um sistema em produção. Em vez disso, para cada nova tarefa/função, cria-se um novo branch devido às seguintes razões:
experimento-novo-modelo
. Se não funcionar, pode simplesmente apagar o branch. O main
nunca foi afetado.feature-novo-grafico
enquanto um colega trabalha no bugfix-leitura-csv
. Os vossos trabalhos não interferem um com o outro.main
só recebe trabalho que está completo e revisto. Isto mantém a estabilidade do projeto ao longo do tempo.main
.main
. É aqui que a revisão de código acontece.main
.Exemplo no GitHub Desktop:
Criar um Novo Branch: No GitHub Desktop, clique no menu “Current Branch” e depois no botão New Branch. Dê um nome descritivo ao seu ramo (ex: analise-exploratoria-temp
).
Trabalhar no Branch: Todas as alterações e commits que fizer agora serão guardados apenas neste novo ramo.
Publicar o Branch: Para que os outros vejam o seu branch (ou para abrir um Pull Request), precisa de o publicar. O GitHub Desktop irá mostrar um botão “Publish branch”.
No final de termos confirmado que as nossas alterações estão estáveis e não afetam o estado funcional do main podemos fazer uma pull request para ser autorizado o merge com o main.
git branch analise-exploratoria-temp
git checkout analise-exploratoria-temp
git checkout -b analise-exploratoria-temp
git branch
git push -u origin analise-exploratoria-temp
git branch -d analise-exploratoria-temp
O que fazer quando comete um erro?
Estes comandos são poderosos e devem ser usados com cuidado.
analise.R
, este comando restaura-o para a versão que está na staging area (ou no último commit, se não estiver na staging area).git restore analise.R
git add
, pode retirá-lo da staging area com:git reset analise.R
# ou, com a sintaxe mais moderna:
git restore --staged analise.R
git rm meu_ficheiro.txt
git mv nome_antigo.R nome_novo.R
O conceito mais importante a reter é: crie sempre um novo branch para uma nova tarefa ou funcionalidade. Isto mantém o ramo main
limpo e funcional, e é a base de um fluxo de trabalho colaborativo bem-sucedido.
Em alguns fluxos de trabalho e para algumas pessoas que estão à vontade com o RStudio, a boa notícia é que o RStudio tem uma excelente integração com o Git. Isto permite-lhe realizar a maioria das operações de controlo de versões sem nunca sair do seu ambiente de desenvolvimento.
Instalar o Git: O RStudio utiliza a sua instalação de Git do sistema. Se ainda não o fez, instale o Git a partir de git-scm.com.
Configurar o RStudio: Vá a Tools > Global Options > Git/SVN
. Certifique-se de que o RStudio detetou a sua instalação de Git. Se o campo “Git executable” estiver vazio, procure o ficheiro git.exe
(no Windows) ou git
(no macOS/Linux).
Quando abre um projeto que é um repositório Git no RStudio (seja um que criou ou um que clonou), verá um novo painel chamado “Git” (normalmente no mesmo sítio que “Environment” e “History”).
Devem confirmar que o vosso projeto está configurado para o Github ( Project Setup ).
Este painel lateral pode e deve ser o vosso centro de controlo.
Vamos ver como o ciclo de trabalho Pull -> Modificar -> Commitar -> Push
funciona no RStudio.
Pull (Receber Alterações): Antes de começar, clicar no botão Pull (seta azul para baixo) no painel Git. Isto irá descarregar e fundir quaisquer alterações do repositório remoto, garantindo que tem a versão mais recente.
Modificar Ficheiros: Edite os seus scripts .R
ou ficheiros .qmd
como faria normalmente no RStudio.
Stage (Preparar Alterações): No painel Git, verá uma lista de todos os ficheiros que modificou. Os ícones mostram o estado (M
para modificado, A
para adicionado, D
para apagado). - Para adicionar um ficheiro à área de preparação ( staging area ), marque a caixa “Staged” ao lado do nome do ficheiro. Podem selecionar vários ficheiros com a tecla ctrl. - Pode selecionar vários ficheiros para agrupar as alterações num único commit.
Commit (Gravar Alterações): Depois de preparar os ficheiros, clique no botão Commit. - Abrirá uma nova janela. No canto superior direito, escreva a sua mensagem de commit (relembrar indicações-chave de uma mensagem de commit - curta e imperativa). - Clique no botão Commit.

O RStudio também torna fácil trabalhar com branches:
(-<
). Abrirá uma janela onde pode criar um novo branch ou selecionar um existente para fazer checkout.Trabalhar com Git no RStudio é útil, pois mantém todo o seu fluxo de trabalho, desde a produção de código, análise até ao controlo de versões, num único programa.