Controle de versão com git, GitHub e RStudio



introR: introdução à linguagem R

14 de outubro de 2025

Conteúdo

  1. Conferindo os computadores
  2. Controle de versão
  3. git e GitHub
  4. Detalhes do GitHub
  5. Criando um repositório
  6. Configuração: git config
  7. Controle de versão na prática
  8. Iniciando localmente: git init
  9. Iniciando remotamente: fork e git clone
  10. Versionamento: git status, git add e git commit
  1. Ignorando: .gitignore
  2. Histórico: git log e git show
  3. Diferença: git diff
  4. Desfazer: git restore, git revert e git reset
  5. Ramificações: git branch, git switch e git merge
  6. Remoto: git remote, git push e git pull
  7. GitHub: Pull request
  8. Conflitos
  9. Interface gráficas do RStudio
  10. Mais informações

1. Conferindo os computadores

1. Conferindo os computadores


R (>4.5.x)
https://www.r-project.org


RStudio (>2025.9.x)
https://www.rstudio.com


git (>2.34.x)
https://git-scm.com

2. Controle de versão

2. Controle de versão

Quem nunca…

2. Controle de versão

Manejar projetos individualmente



2. Controle de versão

Manejar projetos compartilhados

2. Controle de versão

Manejar projetos no tempo

2. Controle de versão

Principal ferramenta utilizada em grandes projetos

2. Controle de versão

Cada vez mais necessário em colaborações

3. git e GitHub

3. git e GitHub

git

  • Software (app) que faz o controle de versão
  • Maneja os repositórios locais (computador) e repositório remotos (e.g. GitHub)

3. git e GitHub

git

  • Criado por Linus Torvalds em 2005 para substituir o BitKeeper no gerenciamento do Kernel Linux
  • Software livre, distribuído sob a licença GNU GPL v.2

3. git e GitHub

git

3. git e GitHub

GitHub

  • Repositórios remotos
  • Plataformas de hospedagem e controle de versão de arquivos/códigos

3. git e GitHub

GitHub

  • Plataforma de hospedagem de código e arquivos com controle de versão usando o git
  • Desenvolvido em 2008 usando Ruby on Rails por ‘computeiros’ de São Francisco
  • Em 2018, a Microsoft anunciou a compra da plataforma por US$ 7,5 bilhões

3. git e GitHub

ATENÇÃO: dois conceitos!

  • git: software (app) que faz o controle de versão
  • GitHub: plataforma para hospedar códigos versionados

3. git e GitHub

ATENÇÃO: dois conceitos!

  • git: software (app) que faz o controle de versão
  • GitHub: plataforma para hospedar códigos versionados

Prática 1

Prática 1

GitHub

Vamos criar uma conta no GitHub (caso não possuam)

Prática 1

GitHub

Salvem ou recuperem essas informações!



username: mauriciovancine
email: mauricio.vancine@gmail.com
senha: !@#$%¨&*+

4. Detalhes do GitHub

4. Detalhes do GitHub

Perfil

4. Detalhes do GitHub

Perfil

  • Overview: suas informações (rede social)
  • Repositories: lista todos os repositórios
  • Projects: ferramentas de gerenciamento (Kanban e tarefas)
  • Packages: pacotes (bibliotecas) ou containers (Docker)
  • Stars: respositórios marcados com estrela

4. Detalhes do GitHub

Settings: superior direito > foto do perfil > Settings

4. Detalhes do GitHub

Settings: superior direito > foto do perfil > Settings

4. Detalhes do GitHub

Settings

4. Detalhes do GitHub

Repositório

4. Detalhes do GitHub

Repositório

  • Code: arquivos, histórico, clone/download e README.md
  • Issues: rastrear bugs, sugestões de melhorias ou tarefas
  • Pull requests: gerencia propostas de alterações no código
  • Actions: gerencia fluxos de trabalho automatizados
  • Projects: ferramentas de gerenciamento visual (Kanban)
  • Wiki: documentação extensa e detalhada do projeto
  • Security: ajuda a gerenciar a segurança do código
  • Insights: fornece análises detalhadas sobre o repositório
  • Settings: gerencia as configurações do repositório

4. Detalhes do GitHub

README.md

4. Detalhes do GitHub

README.md

  • Arquivo de documentação principal de um repositório
  • Escrito em Markdown (formatação simples e amigável)
  • Aparece automaticamente na página inicial do repositório
  • Fornece informações essenciais sobre o projeto
  • Apresenta o propósito do projeto
  • Explica o conteúdo dos arquivos de códigos e diretórios

5. Criando um repositório

5. Criando um repositório

Criar repositório: Perfil > Repositories > New

5. Criando um repositório

Criar um repositório

  1. Nome do repositório
  2. Descrição (opcional)
  3. Público ou privado
  4. Add um README.md
  5. Add .gitignore
  6. Licença
  7. Criar repositório

Prática 2

Prática 2

Criem uma página inicial para o perfil do GitHub

Prática 2

Criem uma página inicial para o perfil do GitHub


  1. Criem um repositório com o nome de usuário de vocês (e.g. mauriciovancine)
  2. Criem um arquivo README.md nesse repositório
  3. Preencham com algum conteúdo em Markdown
  4. Comitem e voltem para a página de perfil

Prática 3

Prática 3

Criem um repositório de exemplo


  1. Criem um repositório chamado teste
  2. Criem um arquivo README.md nesse repositório
  3. Preencham com algum detalhe do curso neste README.md

6. Configurações: RStudio, git, GitHub

6. Configurações

RStudio

6. Configurações

RStudio

  • Tools > Global Options > Git/SVN

6. Configurações

RStudio

  • Marque Enable version control interface…
  • Git executable:
  • Windows: C:/Program Files/Git/bin/git.exe
  • Ubuntu: /usr/bin/git
  • Mac: /usr/bin/git

6. Configurações

RStudio

Chave SSH

  1. Create SSH key (ED25519) (talvez RSA?)
  2. View public key
  3. Copiar: Ctrl + C

6. Configurações

GitHub

  • Add chave SSH: Perfil > Settings > SSH and GPG keys > New SSH key

6. Configurações

GitHub

  • Title: um nome qualquer (eu add por nome de PC ou notebook)
  • Key: colar (ctrl + v)
  • Add SSH key

6. Configurações

git

  • git config: definir as configurações de usuário do git
  • Terminal (colar com ctrl + shift + v)
$ git config --list
$ git config --global user.name "meu nome"
$ git config --global user.email "email@dominio.com"
$ git config --list

Tudo certo até aqui?

Agora sim, podemos começar o versionamento…

7. Controle de versão na prática

7. Controle de versão na prática

Duas formas de trabalhar com o git e GitHub

  1. Iniciando um projeto em nosso computador - localmente (git)
  2. Iniciando por um repositório remoto - remotamente (GitHub)

7. Controle de versão na prática

7. Controle de versão na prática

7. Controle de versão na prática

8. Iniciando localmente

8. Iniciando localmente

git init: inicia o versionamento de um repositório local

Prática 4

Prática 4

Diretório local

  1. Criem uma pasta chamada: teste_local
  2. Abram o RStudio
  3. Selecionem o caminho desta pasta
  4. Mudem o diretório para esta pasta (setwd("teste_local"))
  5. Criem um arquivo dentro desta pasta script.R

Prática 4

Diretório local

  1. Abram o Terminal do RStudio

Prática 4

Diretório local

  1. Abram o Terminal do RStudio

Prática 4

Diretório local

  1. Abram o Terminal do RStudio
  2. No Terminal, rodem: cd 'caminho/diretorio'
  3. No Terminal, rodem: git init
  4. No Terminal, rodem: git add -Av
  5. No Terminal, rodem: git commit -m 'add script.R'
  6. Deletem esse script, inclusive da lixeira
  7. No Terminal, rodem: git restore script.R
  8. Testemunhem o poder do git…

9. Iniciando remotamente

9. Iniciando remotamente

Fork: cópia de um repositório para o seu repositório (GitHub)

Prática 5

Prática 5

Forkar um diretório remoto

  1. Forken o repositório syllabus-text da disciplina

9. Iniciando remotamente

Agora esse repositório, que estava no meu GitHub, foi copiado (“garfado”) para o GitHub de vocês

Agora, abram o repositório do GitHub usuario/teste que vocês criaram

9. Iniciando remotamente

Clonar: download de um repositório remoto (e.g. GitHub) para o seu repositório local (computador)

9. Iniciando remotamente

git clone: download de um repositório remoto (e.g. GitHub) para o seu repositório local (computador)

9. Iniciando remotamente

Primeiro, vamos criar uma pasta chamada github


".                               # raiz"
"    ├── home/                   # home"
"        ├── data/               # dados" 
"            ├── github/         # todos os repositorios"

Há várias formas de se fazer um clone de um repositório

9. Iniciando remotamente

  1. Download diretamente do repositório no formato .zip

9. Iniciando remotamente

  1. Usando o terminal para clonar pelo SSH (configurado anteriormente)

9. Iniciando remotamente

  1. Usando o terminal para clonar pelo SSH (configurado anteriormente)
$ git clone git@github.com:mauriciovancine/teste.git


9. Iniciando remotamente

  1. Usando o Projeto do RStudio para clonar pelo SSH (configurado anteriormente)

9. Iniciando remotamente

Criar um Projeto R com controle de versão

File > New Project > Version Control

9. Iniciando remotamente

Escolher clonar repositório do GitHub

Git

9. Iniciando remotamente

Preencher com dados do repositório do GitHub

Repository URL

9. Iniciando remotamente

Preencher:

  • Repository URL: git@github.com:mauriciovancine/teste.git
  • Project directory name: preenchimento automático
  • Create project as subdirectory of: /home/mude/data/github
  • Se uma janela aparecer, basta digitar “yes”
  • Aguardar o download

10. Versionamento

10. Versionamento

10. Versionamento

Comandos git para o fluxo de trabalho dos repositórios

10. Versionamento

Fluxo do versionamento

10. Versionamento

Fluxo do versionamento

  1. Diretório de trabalho (working directory): pasta com os arquivos [working tree] (.git)
  2. Preparação (staging area): arquivos adicionados para serem versionados [Index] (.git)
  3. Repositório (repository): versão consolidada dos arquivos [HEAD] (.git)

10. Versionamento

Fluxo do versionamento usando fotos (working tree)

10. Versionamento

Fluxo do versionamento usando fotos (git add)

10. Versionamento

Fluxo do versionamento usando fotos (git commit)

Mas como o git sabe quais arquivos foram alterados?

10. Versionamento

Rastreamento dos arquivos no diretório de trabalho

  1. Untracked (não-rastreado): arquivos não rastreados pelo git
  2. Tracked (rastreado): arquivos rastreados pelo git (adicionados no stage)

10. Versionamento

Quatro estados de alteração dos arquivos

  1. Untracked (não-rastreado): arquivos não rastreados pelo git
  2. Unmodified (não-modificado): arquivos rastreados e sem modificações
  3. Modified (modificado): arquivos rastreados e com modificações
  4. Staged (preparado): arquivos rastreados, com modificações e preparados (git add) para o commit

10. Versionamento

IMPORTANTE!

  1. Arquivos criados quando preparados (git add) se tornam staged
  2. Arquivos no staged e editados se tornam modified
  3. Arquivos staged, editados e preparados (git add) se tornam staged
  4. Arquivos removidos se tornam untracked
  5. Após um git commit, todos os arquivos se tornam unmodified

Usando o RStudio e para o repositório usuario/teste

10. Versionamento

Terminal do RStudio

10. Versionamento

Terminal do RStudio

Tools > Terminal > New Terminal (alt + shift + r)

10. Versionamento

git status: mostra o estado do repositório

$ git status
# On branch master
# nothing to commit, working tree clean

10. Versionamento

Vamos criar um arquivo no diretório

Usando a aba Terminal do RStudio

$ touch teste.txt # windows
$ type nul > teste.txt # linux

10. Versionamento

git status: mostra o estado do repositório

$ git status
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#   teste.txt
# 
# nothing added to commit but untracked files present (use "git add" to track)

10. Versionamento

git add [file]: adiciona mudanças após edições (staging area) [Index]

$ git add teste.txt

10. Versionamento

git add -v [file]: adiciona mudanças após edições (staging area) [Index]

$ git add teste.txt -v
# add 'teste.txt'

10. Versionamento

git add -Av: adiciona todas mudanças após edições (staging area) [Index]

$ git add -Av
# add 'teste.txt'

10. Versionamento

git add .: adiciona todas mudanças após edições (staging area) [Index]

$ git add .

10. Versionamento

git status: mostra o estado do repositório

$ git status
# On branch master
# Changes to be committed:
#   (use "git restore --staged <file>..." to unstage)
#   new file:   teste.txt

10. Versionamento

git commit: registra as alterações da staging area no repository [HEAD]

  • Cria um snapshot do repositório, contendo:
    • Mudanças realizadas nos arquivos
    • Mensagem descritiva (mensagem do commit)
    • Metadados do autor, data e identificador único (hash)

10. Versionamento

git commit -m "[mensagem]": registra as alterações da staging area no repository com uma mensagem [HEAD]

$ git commit -m "add teste.txt"
# [master 5a164d5] add teste.txt
# 1 file changed, 0 insertions(+), 0 deletions(-)
# create mode 100644 teste.txt

10. Versionamento

git status: mostra o estado do repositório

$ git status
# On branch master
# nothing to commit, working tree clean

10. Versionamento

Fluxo do versionamento

  1. Diretório de trabalho (working directory): pasta com os arquivos [working tree] (.git)
  2. Preparação (staged area): arquivos adicionados para serem versionados [Index] (.git)
  3. Repositório (repository): versão consolidada dos arquivos [HEAD] (.git)

10. Versionamento

Usando a aba Files do RStudio, vamos abrir e editar o arquivo teste.txt

Acabo de inserir uma edição ao meu arquivo

10. Versionamento

git status: mostra o estado do repositório

$ git status
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git restore <file>..." to discard changes in working directory)
#   modified:   teste.txt
# no changes added to commit (use "git add" and/or "git commit -a")

10. Versionamento

git add: adiciona mudanças após edições na staging area [Index]

$ git add -Av
# add 'teste.txt'

10. Versionamento

git status: mostra o estado do repositório

$ git status
# On branch master
# Changes to be committed:
#   (use "git restore --staged <file>..." to unstage)
#   modified:   teste.txt

10. Versionamento

git commit -m "[mensagem]": registra as alterações da staging area no repository com uma mensagem [HEAD]

$ git commit -m "mod teste.txt"
# [master f73fca3] modificação do teste.txt
#  1 file changed, 1 insertion(+)

10. Versionamento

git status: mostra o estado do repositório

$ git status
# On branch master
# nothing to commit, working tree clean

10. Versionamento

10. Versionamento

10. Versionamento

ATENÇÃO!

  • Mensagens de commit são fundamentais
  • Devem ser curtas e indicar as mudanças feitas nos arquivos/repositório

10. Versionamento

10. Versionamento

Corrigir mensagens de commit

  • Corrigir mensagens de commit é complicado
  • Vou mostrar como corrigir apenas a última mensagem
$ git commit --amend -m "correcao do ultimo commit"

10. Versionamento

Fluxo do versionamento

  1. Diretório de trabalho (working directory): pasta com os arquivos [working tree] (.git)
  2. Preparação (staged area): arquivos adicionados para serem versionados (.git)
  3. Repositório (repository): versão consolidada dos arquivos (.git)

10. Versionamento

Fluxo do versionamento

10. Versionamento

git e commits

E se houver arquivos que eu não quero versionar?

11. Ignorando

.gitignore

  • Arquivo especial que indica ao git que determinados arquivos ou diretórios devem ser ignorados no versionamento

  • Arquivo de texto simples em que cada linha especifica um padrão de arquivos ou diretórios a serem ignorados

  • Geralmente colocado no diretório raiz de um repositório

  • Atentar para o ponto, pois é um arquivo oculto [.gitignore]

11. Ignorando

.gitignore

11. Ignorando

.gitignore

  • Criando um arquivo
$ type nul > .gitignore # windows
$ touch ~/.gitignore # linux
  • Preenchendo com padrões
# ignorar arquivos
raster.tif

# ignorar diretorios
temp/

# ignorar padrao 
*.tif (ignorar todos com .tif)
!.tif (nao ignorar todos com .tif)

Vamos acessar todo o histórico de commits do git?

12. Histórico

git log: histórico dos commits


  1. Identificador do commit (hash)
  2. Autor
  3. Data
  4. Descrição (mensagem de commit)

12. Histórico

hash

  • Identificador único, gerado pelo git, que representa um commit
  • É baseado no conteúdo do commit (alterações, autor, data)
  • SHA-1 (Secure Hash Algorithm 1): hexadecimal de 40 caracteres
  • Permite localizar rapidamente um commit

12. Histórico

hash curto

  • Referenciar um commit usando apenas os primeiros caracteres do hash

  • Utilizamos esse identificador em várias operações no git

  • Por exemplo:

    • Curto:
      3a4f9b7
    • Completo:
      3a4f9b7c19e2f4e1a0de9b7e5c6aebd7d5d85792

12. Histórico

HEAD

  • Ponteiro simbólico que indica onde você está atualmente no histórico de commits
  • Aponta sempre para o último commit “ativo”, o commit mais recente
  • Quando você faz um git commit, o HEAD se move automaticamente para esse novo commit
# * commit C (HEAD -> main)
# * commit B
# * commit A

12. Histórico

git log: histórico dos commits

$ git log
# commit dfefc8530b25bfe96d8ccf7ba74aa0858ade6346 (HEAD -> master)
# Author: mauriciovancine <mauricio.vancine@gmail.com>
# Date:   Sat May 31 18:22:19 2025 -0300

#     modificação do teste.txt

# commit 5a164d55896d6251249a5142f6110e8e0b06a49b
# Author: mauriciovancine <mauricio.vancine@gmail.com>
# Date:   Fri May 30 09:53:55 2025 -0300

#     add teste.txt

# commit 50c520ff2cd531f1652eafb4654a9fb3fcd196af
# Author: mauriciovancine <mauricio.vancine@gmail.com>
# Date:   Thu May 29 09:34:13 2025 -0300

#     first commit

12. Histórico

git log [file]: histórico dos commits para arquivos

$ git log teste.txt
# commit dfefc8530b25bfe96d8ccf7ba74aa0858ade6346 (HEAD -> master)
# Author: mauriciovancine <mauricio.vancine@gmail.com>
# Date:   Sat May 31 18:22:19 2025 -0300

#     modificação do teste.txt

# commit 5a164d55896d6251249a5142f6110e8e0b06a49b
# Author: mauriciovancine <mauricio.vancine@gmail.com>
# Date:   Fri May 30 09:53:55 2025 -0300

#     add teste.txt

12. Histórico

git log --oneline: histórico dos commits simplificado

$ git log --oneline
# dfefc85 (HEAD -> master) modificação do teste.txt
# 5a164d5 add teste.txt
# 50c520f first commit

12. Histórico

git log --graph: histórico dos commits em grafo

$ git log --graph
# * commit dfefc8530b25bfe96d8ccf7ba74aa0858ade6346 (HEAD -> master)
# | Author: mauriciovancine <mauricio.vancine@gmail.com>
# | Date:   Sat May 31 18:22:19 2025 -0300
# | 
# |     modificação do teste.txt
# | 
# * commit 5a164d55896d6251249a5142f6110e8e0b06a49b
# | Author: mauriciovancine <mauricio.vancine@gmail.com>
# | Date:   Fri May 30 09:53:55 2025 -0300
# | 
# |     add teste.txt
# | 
# * commit 50c520ff2cd531f1652eafb4654a9fb3fcd196af
#   Author: mauriciovancine <mauricio.vancine@gmail.com>
#   Date:   Thu May 29 09:34:13 2025 -0300
#   
#       first commit

12. Histórico

git log --grep: faz uma busca no histórico dos commits

$ git log --grep="first commit"
# commit 50c520ff2cd531f1652eafb4654a9fb3fcd196af
# Author: mauriciovancine <mauricio.vancine@gmail.com>
# Date:   Thu May 29 09:34:13 2025 -0300
# 
#     first commit

12. Histórico

git log --author: filtra o histórico dos commits por autor

$ git log --author="mauricio"
# commit dfefc8530b25bfe96d8ccf7ba74aa0858ade6346 (HEAD -> master)
# Author: mauriciovancine <mauricio.vancine@gmail.com>
# Date:   Sat May 31 18:22:19 2025 -0300
# 
#     modificação do teste.txt
# 
# commit 5a164d55896d6251249a5142f6110e8e0b06a49b
# Author: mauriciovancine <mauricio.vancine@gmail.com>
# Date:   Fri May 30 09:53:55 2025 -0300
# 
#     add teste.txt
# 
# commit 50c520ff2cd531f1652eafb4654a9fb3fcd196af
# Author: mauriciovancine <mauricio.vancine@gmail.com>
# Date:   Thu May 29 09:34:13 2025 -0300

12. Histórico

git log: cheatsheet

12. Histórico

git show: detalhes de um commit

$ git show
# commit dfefc8530b25bfe96d8ccf7ba74aa0858ade6346 (HEAD -> master)
# Author: mauriciovancine <mauricio.vancine@gmail.com>
# Date:   Sat May 31 18:22:19 2025 -0300
# 
#     modificação do teste.txt
# 
# diff --git a/teste.txt b/teste.txt
# index e69de29..f5201c0 100644
# --- a/teste.txt
# +++ b/teste.txt
# @@ -0,0 +1 @@
# +Acabo de inserir uma edição ao meu arquivo
# \ No newline at end of file

12. Histórico

git show [hash]: detalhes de um commit específico

$ git log --oneline
# dfefc85 (HEAD -> master) modificação do teste.txt
# 5a164d5 add teste.txt
# 50c520f first commit


$ git show 5a164d5
# commit 5a164d55896d6251249a5142f6110e8e0b06a49b
# Author: mauriciovancine <mauricio.vancine@gmail.com>
# Date:   Fri May 30 09:53:55 2025 -0300
#
#    add teste.txt
#
# diff --git a/teste.txt b/teste.txt
# new file mode 100644
# index 0000000..e69de29

12. Histórico

git show [file]: detalhes de um arquivo específico

$ git show teste.txt
# commit dfefc8530b25bfe96d8ccf7ba74aa0858ade6346 (HEAD -> master)
# Author: mauriciovancine <mauricio.vancine@gmail.com>
# Date:   Sat May 31 18:22:19 2025 -0300
# 
#     modificação do teste.txt
# 
# diff --git a/teste.txt b/teste.txt
# index e69de29..f5201c0 100644
# --- a/teste.txt
# +++ b/teste.txt
# @@ -0,0 +1 @@
# +Acabo de inserir uma edição ao meu arquivo
# \ No newline at end of file

13. Diferenças

git diff: diferenças realizadas em um repositório

E como voltar no tempo?

14. Desfazer: git restore, git revert e git reset

14. Desfazer

  1. git restore: desfaz alterações na working tree ou staging area





  1. git revert: desfaz commits, mas preserva o histórico (criando outro commit)
  2. git reset: desfaz commits, mas deleta o histórico (deletando commits)

14. Desfazer

Cuidado: essas operações podem ser irreversíveis

15. Ramificações: git branch, git switch e git merge

15. Ramificações

  • Branch (ou ramo) é uma linha paralela de desenvolvimento

15. Ramificações

  • Branch (ou ramo) é uma linha paralela de desenvolvimento

  • Funções:

    • Separar novas funcionalidades
    • Isolar correções de bugs
    • Trabalhar em paralelo com segurança
    • Facilitar a colaboração em equipe
    • Testes sem arriscar o código principal (main ou master)

15. Ramificações

Importante!

  • Criar uma branch significa criar um novo ponteiro que pode evoluir independentemente
  • Os arquivos locais permanecem os mesmos; apenas o histórico e o ponteiro mudam
  • Apenas arquivos versionados (git add e git commit) fazem parte da branch
  • Uma branch é como um marcador de página: você não copia o livro, apenas marca onde continuar

15. Ramificações

git branch: listar as branches e verificar a branch de edição (*)

  • Em 2020, adotou-se main para a branch principal para adotar uma linguagem mais inclusiva, clara e alinhada com os padrões de desenvolvimento
  • Versões antigas: branch master
$ git branch
# * master
  • Versões recentes: branch main
$ git branch
# * main

15. Ramificações

git branch [nome-branch]: criar uma branch

$ git branch branch-1

$ git branch
# branch-1
# * main

15. Ramificações

git switch [nome-branch]: trocar a branch de edição

$ git switch branch-1
# Switched to branch 'branch-1'

15. Ramificações

git branch: lista os branches e verifica a branch de edição

$ git branch
# * branch-1
# main

15. Ramificações

git switch -c [nome-branch]: criar e mudar para a nova branch

$ git switch -c branch-2
# Switched to branch 'branch-2'

15. Ramificações

git branch: lista os branches e verifica a branch de edição

$ git branch
# branch-1
# * branch-2
# main

15. Ramificações

git branch -m [novo-nome]: renomear uma branch de edição

$ git branch -m branch-3

$ git branch
# branch-1
# * branch-3
# main

15. Ramificações

git branch -m [nome-antigo] [novo-nome]: renomear uma branch

$ git branch -m branch-3 branch-2

$ git branch
# branch-1
# * branch-2
# main

15. Ramificações

git branch -d [nome]: deletar uma branch

$ git branch -d branch-1
# branch-1
# * branch-2
# main

15. Ramificações

Vamos criar um arquivo no diretório e na branch-2

$ type nul > teste_branch2.txt # windows
$ touch teste_branch2.txt # linux
$ git add -Av
$ git commit -m "add teste_branch2.txt"

15. Ramificações

git switch: trocar a branch de edição

$ git switch main

15. Ramificações

git switch: trocar a branch de edição

  • O arquivo sumiu…

Vamos juntar esses branches fazendo um merge

15. Ramificações

git merge: mescla as branches em uma única branch

15. Ramificações

git merge: mescla as branches em uma única branch

$ git merge branch-2
# Updating c1c596e..9900ebb
# Fast-forward
#  teste_branch2.txt | 0
#  1 file changed, 0 insertions(+), 0 deletions(-)
#  create mode 100644 teste_branch2.txt

15. Ramificações

git merge: mescla as branches em uma única branch

git log --oneline
# 7aeb06d (HEAD -> master, branch-1) add teste_branch1.txt
# f9f2e9c mod2 teste.txt
# dcbd894 mod teste.txt
# 8b33bc5 add teste.txt

CUIDADO!

15. Ramificações

Git Branch Cheatsheet

Vamos finalmente conectar o repositório local (diretório) com o repositório remoto (GitHub)

16. Remoto

16. Remoto

git remote: gerencia conexões com repositórios remotos (GitHub)

$ git remote
# origin


  • Mostra os nomes das conexões remotas
  • origin: nome padrão para o repositório remoto principal

16. Remoto

git remote: gerencia conexões com repositórios remotos (GitHub)

$ git remote -v
# origin    git@github.com:mauriciovancine/teste.git (fetch)
# origin    git@github.com:mauriciovancine/teste.git (push)


  • Mostra os nomes das conexões remotas: origin
  • Mostra os URLs das conexões remotas: git@github.com:mauriciovancine/teste.git
  • fetch: endereço para buscar atualizações do repositório remoto
  • push: endereço para enviar suas alterações para o repositório remoto

16. Remoto

git remote add: adiciona ligação com um repositório remoto (GitHub)

  • Observação: usar o SSH para não precisar digitar a senha
$ git remote add origin git@github.com:mauriciovancine/teste.git

Agora git sabe para onde deve enviar as alterações para o repositório remoto (GitHub)

16. Remoto

git push: envia suas alterações (commits) feitas localmente para o repositório remoto (GitHub)

16. Remoto

git push: envia suas alterações (commits) feitas localmente para o repositório remoto (GitHub)

Função:

  • Atualiza a branch correspondente no repositório remoto
  • Torna suas mudanças disponíveis para outras pessoas
  • Se não configurar a chave SSH, exige autenticação (usuário/senha ou token)

16. Remoto

git push: envia suas alterações (commits) feitas localmente para o repositório remoto (GitHub)

16. Remoto

git push: envia suas alterações (commits) feitas localmente para o repositório remoto (GitHub)

$ git push -u origin main
# Enumerating objects: 41, done.
# Counting objects: 100% (41/41), done.
# Delta compression using up to 12 threads
# Compressing objects: 100% (35/35), done.
# Writing objects: 100% (35/35), 4.99 MiB | 155.00 KiB/s, done.
# Total 35 (delta 6), reused 0 (delta 0), pack-reused 0
# remote: Resolving deltas: 100% (6/6), completed with 6 local objects.
# To github.com:mauriciovancine/course-geospatial-data-r.git
#    accc9db..8f70e96  master -> master

16. Remoto

Em caso de incêndio…

16. Remoto

CUIDADO: muitas vezes há conflitos que precisam ser revolvidos entre o repositório local e o remoto

E se houver arquivos [enormes] que eu queira versionar no GitHub?

16. Remoto

Limites de tamanho

  • Arquivos acima de 25 MB causam erro e o envio ao GitHub é bloqueado
  • Para arquivos maiores, é necessário usar o Git Large File Storage (LFS)
  • O repositório no GitHub tem limite de 5 GB no total
  • É recomendável manter o repositório com menos de 1 GB
  • O GitHub envia avisos quando o tamanho se aproxima do limite
  • Ao exceder o limite, o envio é bloqueado com uma mensagem de erro

E se eu quiser ver o que mudou no repositório remoto e trazer para o repositório local?

16. Remoto

16. Remoto

git fetch: busca atualizações do repositório remoto e as traz para o repositório local, mas não altera a branch atual

Função:

  • Atualiza o histórico e as branches remotas
  • Permite que você veja o que mudou antes de aplicar
  • Seguro: não altera seus arquivos nem seu histórico local automaticamente

16. Remoto

git fetch: busca atualizações do repositório remoto e as traz para o repositório local, mas não altera a branch atual

$ git fetch origin
# remote: Enumerating objects: 4, done.
# remote: Counting objects: 100% (4/4), done.
# remote: Compressing objects: 100% (2/2), done.
# remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0)
# Unpacking objects: 100% (3/3), 934 bytes | 934.00 KiB/s, done.
# From github.com:mauriciovancine/teste
#    4029d2c..dfb960b  main       -> origin/main

16. Remoto

git fetch: busca atualizações do repositório remoto e as traz para o repositório local, mas não altera a branch atual

  • Se quiser atualizar a branch local com as mudanças use:
    • git merge: para mesclar manualmente
    • git rebase: para reescrever o histórico de forma linear (evitar)
$ git merge origin/main
$ git rebase origin/main

16. Remoto

git pull: busca atualizações do repositório remoto e as traz para o repositório local, alterando a branch atual

16. Remoto

git pull: busca atualizações do repositório remoto e as traz para o repositório local, alterando a branch atual

  • Equivalente a rodar: git fetch + git merge
  • Função:
  • Sincronizar sua branch local com as alterações mais recentes do remoto
  • Trabalhar colaborativamente, mantendo o código sempre atualizado
  • Automatizar o processo de trazer e aplicar mudanças
  • Cuidado: pode causar conflitos se houver alterações locais incompatíveis com as mudanças remotas

16. Remoto

Resumo

Por fim, requisição das alterações do nosso rep. remoto para o rep. remoto original: Pull request

17. Pull request

Pull Request: solicita que o repositório remoto original (GitHub) aceite (pull - ‘puxe’) as alterações realizadas do fork

17. Pull request

Fluxo de trabalho de um Pull Request

  1. Fork do repositório remoto original
  2. Clone do repositório remoto forkado
  3. Criar uma branch no repositório local
  4. Fazer edições no repositório local
  1. Versionamento (git add e git commit)
  2. Envio para seu repositório remoto (git pull)
  3. Envio para o repositório remoto original (Pull Request)

17. Pull request

Pull Request: solicita que o repositório central (remoto) aceite (pull - ‘puxe’) as alterações realizadas do nosso fork

git clone git@github.com:mauriciovancine/teste.git
git branch branch-1
git switch branch-1
git add -Av
git commit -m 'mensagem'
git push origin branch-1

17. Pull request

Pull Request: solicita que o repositório central (remoto) aceite (pull - ‘puxe’) as alterações realizadas do nosso fork

17. Pull request

Pull Request: solicita que o repositório central (remoto) aceite (pull - ‘puxe’) as alterações realizadas do nosso fork

17. Pull request

Pull Request: solicita que o repositório central (remoto) aceite (pull - ‘puxe’) as alterações realizadas do nosso fork

18. Conflitos

18.Conflitos

Conflitos no repositório local

$ git merge
# Auto-merging arquivo.txt
# CONFLICT (content): Merge conflict in arquivo.txt
# Automatic merge failed; fix conflicts and then commit the result.

18.Conflitos

Conflitos no rep. local vindos de um rep. remoto

$ git pull
# Auto-merging teste.txt
# CONFLICT (content): Merge conflict in teste.txt
# Automatic merge failed; fix conflicts and then commit the result.

18.Conflitos

Conflitos surgem quando o git não consegue decidir qual alteração manter:


Situação Exemplo
Mesma linha alterada Duas pessoas editam a mesma linha de um arquivo e depois mesclar as mudanças
Remoção e modificação Em uma branch o arquivo é removido, em outra o arquivo foi alterado
Edição de arquivos renomeados Arquivos foram renomeados em uma branch e editados em outra

18.Conflitos

Como o Git detecta conflitos

O Git compara três versões do arquivo:

  1. Base comum (ancestral comum das duas branches)
  2. HEAD (a versão atual na branch em que você está)
  3. Merge branch (a versão que está sendo mesclada)
  • Possibilidade 1: se as mudanças forem em regiões diferentes do arquivo, o git mescla automaticamente

  • Possibilidade 2: se as mudanças forem conflitantes (e.g. mesma linha), o git marca um conflito

18.Conflitos

  • Quando há um conflito, o git modifica o arquivo inserindo marcações para que resolvido manualmente
# <<<<<<< HEAD
# Esta é a versão da branch atual
# =======
# Esta é a versão da branch que esta tentando mesclar
# >>>>>>> feature-branch
  • <<<<<<< HEAD: início do trecho com a versão atual (na sua branch)
  • =======: separador entre as versões
  • >>>>>>> nome-da-branch: fim do conflito, mostrando de qual branch veio a outra versão

18.Conflitos

18.Conflitos

Solução

  • Ler cuidadosamente o trecho entre <<<<<<< e >>>>>>>
  • Decidir:
    • Qual versão manter?
    • Mesclar as duas?
    • Criar uma terceira solução?
  • Editar o arquivo, removendo todas as marcações (<<<<<<<, =======, >>>>>>>)
  • Depois de resolver o conflito:
git add <arquivo>
git commit -m "conflito resolvido"

19. Interface Gráfica do RStudio

Agradecimento mais que justo

Agradecimento à Beatriz Milz pelas figuras surrupiadas (eu pedi…)

19. Interface Gráfica do RStudio

Git Panel

  • RStudio tem um cliente Git na aba “Git”
  • Esse painel aparece em projetos que estejam versionados com git

19. Interface Gráfica do RStudio

Git Panel - Detalhes

19. Interface Gráfica do RStudio

Git Panel - Branches

19. Interface Gráfica do RStudio

Git Panel - Diff - Changes: Revisar mudanças

19. Interface Gráfica do RStudio

Git Panel - Diff - History: Histórico de mudanças

19. Interface Gráfica do RStudio

Git pane - Staged

19. Interface Gráfica do RStudio

Git pane - Staged e File status

19. Interface Gráfica do RStudio

Git pane - Commit

19. Interface Gráfica do RStudio

Git pane - Commit

19. Interface Gráfica do RStudio

Git pane - Push e Pull

Últimas palavras

20. Mais informações

20. Mais informações

Git Cheat Sheet

20. Mais informações

usethis

Comandos direto no R para criar e versionar repositórios

install.packages("usethis")
devtools::install_github("r-lib/usethis")

20. Mais informações

gitKraken

20. Mais informações

Sublime Merge

20. Mais informações

Curso de Git - Bóson Treinamentos

20. Mais informações

Git e Github para iniciantes - Willian Justen de Vasconcellos

20. Mais informações

Curso de Git - Professor Aquino

Bora praticar!