Controle de versão com git, GitHub e RStudio



Maurício Vancine

5 de junho de 2025

Workshop


  • Carga horária bem enxuta: 06 h
  • Parte teórica: 03 h (hoje)
  • Parte prática: 03 h (amanhã)
  • Objetivo é introduzir o tema de controle de versão
  • Cursos são ótimo para “quebrar o gelo”, mas o aprendizado depende de vocês

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áfica do RStudio
  10. Mais informações

IMPORTANTE!!!

Estamos num espaço seguro e amigável

  • Sintam-se à vontade para me interromper e tirar dúvidas

1. Conferindo os computadores

1. Conferindo os computadores


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


RStudio (>2025.05.0)
https://www.rstudio.com


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

1. Conferindo os computadores

gitKraken

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 para exemplo no curso


  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

{fig-align=‘center’

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 RSA key
  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
  2. No Terminal, rodem: cd caminho/pasta
  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 do workshop de git

9. Iniciando remotamente

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

Agora, abram o repositório “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

3.1 Criar um Projeto R com controle de versão

File > New Project > Version Control

9. Iniciando remotamente

3.2 Escolher clonar repositório do GitHub

Git

9. Iniciando remotamente

3.3 Preencher com dados do repositório do GitHub

Repository URL

9. Iniciando remotamente

3.4 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 test.txt

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)
#   test.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 test.txt

10. Versionamento

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

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

10. Versionamento

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

$ git add -Av
# add 'test.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:   test.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 test.txt"
# [master 5a164d5] add test.txt
# 1 file changed, 0 insertions(+), 0 deletions(-)
# create mode 100644 test.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 test.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:   test.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 'test.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:   test.txt

10. Versionamento

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

$ git commit -m "mod test.txt"
# [master f73fca3] modificação do test.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

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

#     modificação do test.txt

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

#     add test.txt

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

#     first commit

10. Versionamento

Corrigir mensagens de commit

$ git commit --amend -m "correcao do ultimo commit"

10. Versionamento

Corrigir mensagens de commit

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

#     correcao do ultimo commit

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

#     add test.txt

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

#     first 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

git

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
$ touch ~/.gitignore
  • 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 test.txt

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

#     add test.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 test.txt
# commit dfefc8530b25bfe96d8ccf7ba74aa0858ade6346 (HEAD -> master)
# Author: mauriciovancine <mauricio.vancine@gmail.com>
# Date:   Sat May 31 18:22:19 2025 -0300

#     modificação do test.txt

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

#     add test.txt

12. Histórico

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

$ git log --oneline
# dfefc85 (HEAD -> master) modificação do test.txt
# 5a164d5 add test.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 test.txt
# | 
# * commit 5a164d55896d6251249a5142f6110e8e0b06a49b
# | Author: mauriciovancine <mauricio.vancine@gmail.com>
# | Date:   Fri May 30 09:53:55 2025 -0300
# | 
# |     add test.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 test.txt
# 
# commit 5a164d55896d6251249a5142f6110e8e0b06a49b
# Author: mauriciovancine <mauricio.vancine@gmail.com>
# Date:   Fri May 30 09:53:55 2025 -0300
# 
#     add test.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 test.txt
# 
# diff --git a/test.txt b/test.txt
# index e69de29..f5201c0 100644
# --- a/test.txt
# +++ b/test.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 test.txt
# 5a164d5 add test.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 test.txt
#
# diff --git a/test.txt b/test.txt
# new file mode 100644
# index 0000000..e69de29

12. Histórico

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

$ git show test.txt
# commit dfefc8530b25bfe96d8ccf7ba74aa0858ade6346 (HEAD -> master)
# Author: mauriciovancine <mauricio.vancine@gmail.com>
# Date:   Sat May 31 18:22:19 2025 -0300
# 
#     modificação do test.txt
# 
# diff --git a/test.txt b/test.txt
# index e69de29..f5201c0 100644
# --- a/test.txt
# +++ b/test.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

13. Diferenças

git diff: diferenças entre working directory e staging area

git diff


Observação: Não retornou nenhuma diferença, pois não editamos o arquivo

13. Diferenças

git diff: diferenças entre working directory e staging area


Vamos editar o arquivo “test.txt” usando o terminal

echo "" >> test.txt
echo "Nova linha de código" >> test.txt

13. Diferenças

git diff: diferenças entre working directory e staging area

$ git diff
# diff --git a/test.txt b/test.txt
# index f5201c0..74cb9b5 100644
# --- a/test.txt
# +++ b/test.txt
# @@ -1 +1,2 @@
# -Acabo de inserir uma edição ao meu arquivo
# \ No newline at end of file
# +Acabo de inserir uma edição ao meu arquivo
# +Nova linha de código
  • diff --git a/test.txt b/test.txt: que arquivo mudou
  • @@...@@: onde foi mudado
  • -: linhas removidas
  • +: linhas adicionadas

13. Diferenças

git diff --staged: diferenças entre staging area e repository

$ git diff --staged

Observação: Não retornou nenhuma diferença, pois não adicionamos ao staging area

13. Diferenças

git diff --staged: diferenças entre staging area e repository

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

$ git diff --staged
# diff --git a/test.txt b/test.txt
# index f5201c0..74cb9b5 100644
# --- a/test.txt
# +++ b/test.txt
# @@ -1 +1,2 @@
# -Acabo de inserir uma edição ao meu arquivo
# \ No newline at end of file
# +Acabo de inserir uma edição ao meu arquivo
# +Nova linha de código

13. Diferenças

git diff HEAD: diferenças entre working directory e repository

$ git diff HEAD
# diff --git a/test.txt b/test.txt
# index f5201c0..74cb9b5 100644
# --- a/test.txt
# +++ b/test.txt
# @@ -1 +1,2 @@
# -Acabo de inserir uma edição ao meu arquivo
# \ No newline at end of file
# +Acabo de inserir uma edição ao meu arquivo
# +Nova linha de código

13. Diferenças

git diff [file]: diferenças entre versões do mesmo arquivo

$ git diff test.txt
# diff --git a/test.txt b/test.txt
# index f5201c0..74cb9b5 100644
# --- a/test.txt
# +++ b/test.txt
# @@ -1 +1,2 @@
# -Acabo de inserir uma edição ao meu arquivo
# \ No newline at end of file
# +Acabo de inserir uma edição ao meu arquivo
# +Nova linha de código

13. Diferenças

git diff [hash1] [hash2]: diferenças entre commits

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

$ git diff 5a164d5 50c520f
# diff --git a/test.txt b/test.txt
# deleted file mode 100644
# index e69de29..0000000

13. Diferenças

git diff 5a164d5 50c520f --stat: diferenças em resumo, sem mostrar o conteúdo alterado

$ git diff 5a164d5 50c520f --stat
#  test.txt | 0
# 1 file changed, 0 insertions(+), 0 deletions(-)

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

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

14. Desfazer

git restore [file]: desfaz alterações na working tree

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

14. Desfazer

git restore [file]: desfaz alterações na working tree

  • Apaguem o arquivo test.txt da pasta test

14. Desfazer

git restore [file]: desfaz alterações na working tree

$ git status
# On branch main
# Changes not staged for commit:
#   (use "git add/rm <file>..." to update what will be committed)
#   (use "git restore <file>..." to discard changes in working directory)
#   deleted:    test.txt

# no changes added to commit (use "git add" and/or "git commit -a")

14. Desfazer

git restore [file]: desfaz alterações na working tree

$ git restore test.txt

14. Desfazer

git restore [file]: desfaz alterações na working tree

$ git restore .

14. Desfazer

git restore [file]: desfaz alterações na working tree

$ git status
# On branch main
# nothing to commit, working tree clean
  • Arquivo reapareceu na pasta…

E se eu já tiver feito um git add e mandado as alterações na staging area?

14. Desfazer

git restore --staged: desfaz alterações na staging area, mas mantém alterações dos arquivos

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

14. Desfazer

git restore --staged: desfaz alterações na staging area, mas mantém alterações dos arquivos

  • Vamos editar o arquivo “test.txt” usando o terminal
echo "" >> test.txt
echo "Mais uma linha no meu arquivo" >> test.txt

14. Desfazer

git restore --staged: desfaz alterações na staging area, mas mantém alterações dos arquivos

$ git status
# 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:   test.txt

# no changes added to commit (use "git add" and/or "git commit -a")

14. Desfazer

git restore --staged: desfaz alterações na staging area, mas mantém alterações dos arquivos

  • Vamos adicionar essas mudanças na staging area
$ git add -Av
# add 'test.txt'

14. Desfazer

git restore --staged: desfaz alterações na staging area, mas mantém alterações dos arquivos

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

14. Desfazer

git restore --staged: desfaz alterações na staging area, mas mantém alterações dos arquivos

$ git restore --staged test.txt

14. Desfazer

git restore --staged: desfaz alterações na staging area, mas mantém alterações dos arquivos

$ git status
# 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:   test.txt

# no changes added to commit (use "git add" and/or "git commit -a")

14. Desfazer

git restore --staged --worktree: desfaz alterações na staging area e na work tree (arquivos)

14. Desfazer

git restore --staged --worktree: desfaz alterações na staging area e na work tree (arquivos)

$ git restore --staged --worktree test.txt

E se eu já tiver feito um commit e queira desfazer?

14. Desfazer

git revert [hash]: desfaz commits, mas preserva o histórico (criando outro commit)

14. Desfazer

git revert [hash]: desfaz commits, mas preserva o histórico (criando outro commit)

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


$ git log --oneline
# d0ad9d1 (HEAD -> main) correcao do ultimo commit
# c1c596e update file test.txt
# 4029d2c (origin/main, origin/HEAD) Create teste

14. Desfazer

git revert [hash]: desfaz commits, mas preserva o histórico (criando outro commit)

$ git revert c1c596e
# Revert "update file test.txt second time"

# This reverts commit 49af53ec06e09c2301241a1d555ab1d8b4ba0908.

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# On branch main
# Your branch is ahead of 'origin/main' by 6 commits.
#   (use "git push" to publish your local commits)
#
# Changes to be committed:
#       deleted:    teste

14. Desfazer

git revert [hash]: desfaz commits, mas preserva o histórico (criando outro commit)

  • Abriu um editor de texto: Nano
  • Editar a primeira linha para alterar a mensagem de commit
  • Ctrl + O (Write out) > Enter > Ctrl + X (Exit)
$ git revert c1c596e
# Revert "update file test.txt second time"

# This reverts commit 49af53ec06e09c2301241a1d555ab1d8b4ba0908.

# Please enter the commit message for your changes.

14. Desfazer

git revert [hash]: desfaz commits, mas preserva o histórico (criando outro commit)

$ git revert c1c596e
# [main c1c596e] Revert "update file test.txt second time"
# 1 file changed, 1 deletion(-)
# delete mode 100644 teste

14. Desfazer

git revert [hash]: desfaz commits, mas preserva o histórico (criando outro commit)

$ git log --oneline
# 49af53e update file test.txt second time
# d0ad9d1 correcao do ultimo commit
# c1c596e update file test.txt
# 4029d2c (origin/main, origin/HEAD) Create teste

14. Desfazer

git reset [modo] [hash]: desfaz commits, mas deleta o histórico (deletando commits)

14. Desfazer

git reset [modo] [hash]: desfaz commits, mas deleta o histórico (deletando commits)


Modos:

  • --soft: move HEAD para outro commit (modo seguro)
  • --mixed: move HEAD e desfaz staging (modo seguro)
  • --hard: move HEAD, desfaz staging e descarta alterações nos arquivos (modo não seguro)

14. Desfazer

git reset --soft [hash]: mover o HEAD para outro commit

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


$ git log --oneline
# d0ad9d1 (HEAD -> main) correcao do ultimo commit
# c1c596e update file test.txt
# 4029d2c (origin/main, origin/HEAD) Create teste

14. Desfazer

git reset --soft [hash]: mover o HEAD para outro commit

$ git reset --soft c1c596e


$ git log --oneline
# d0ad9d1 correcao do ultimo commit
# c1c596e (HEAD -> main) update file test.txt
# 4029d2c (origin/main, origin/HEAD) Create teste

14. Desfazer

git reset --soft [hash]: mover o HEAD para outro commit

Detalhes:

  • HEAD volta para commit escolhido
  • Conteúdo do commit atual continua no staging area
  • Arquivos continuam alterados no working directory e prontos para commit

Quando usar:

  • Refazer o último commit, mantendo as mudanças no staging area

14. Desfazer

git reset --mixed [hash]: mover o HEAD e desfazer o staging area

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


$ git log --oneline
# d0ad9d1 (HEAD -> main) correcao do ultimo commit
# c1c596e update file test.txt
# 4029d2c (origin/main, origin/HEAD) Create teste

14. Desfazer

git reset --mixed [hash]: mover o HEAD e desfazer o staging area

$ git reset --mixed c1c596e


$ git log --oneline
# d0ad9d1 correcao do ultimo commit
# c1c596e (HEAD -> main) update file test.txt
# 4029d2c (origin/main, origin/HEAD) Create teste

14. Desfazer

git reset --mixed [hash]: mover o HEAD e desfazer o staging area

Detalhes:

  • HEAD volta para commit escolhido
  • Conteúdo do commit atual é removido do staging area
  • Arquivos continuam alterados no working directory e não preparados para commit

Quando usar:

  • Desfazer o commit, mas ainda quero ver e editar as mudanças antes de comitar

14. Desfazer

git reset --hard [hash]: move HEAD, desfaz staging e descarta alterações nos arquivos

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


$ git log --oneline
# d0ad9d1 (HEAD -> main) correcao do ultimo commit
# c1c596e  update file test.txt
# 4029d2c (origin/main, origin/HEAD) Create teste

14. Desfazer

git reset --hard [hash]: move HEAD, desfaz staging e descarta alterações nos arquivos

$ git reset --hard c1c596e


$ git log --oneline
# d0ad9d1 correcao do ultimo commit
# c1c596e (HEAD -> main) update file test.txt
# 4029d2c (origin/main, origin/HEAD) Create teste

14. Desfazer

git reset --hard [hash]: move HEAD, desfaz staging e descarta alterações nos arquivos

Detalhes:

  • HEAD volta para commit escolhido
  • Conteúdo do commit atual é perdido: staging area e working directory
  • Arquivos voltam exatamente ao estado do commit escolhido

Quando usar:

  • Desfazer completamente um ou mais commits, eliminando as alterações

14. Desfazer

git reset --hard [hash]: move HEAD, desfaz staging e descarta alterações nos arquivos

Cuidado: essa operação é irreversível (exceto git reflog)

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 branchs 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 branchs 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 branchs 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

$ touch teste_branch2.txt
$ 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 branchs em uma única branch

15. Ramificações

git merge: mescla as branchs 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 branchs em uma única branch

git log --oneline
# 7aeb06d (HEAD -> master, branch-1) add teste_branch1.txt
# f9f2e9c mod2 test.txt
# dcbd894 mod test.txt
# 8b33bc5 add test.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 test.txt
# CONFLICT (content): Merge conflict in test.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

Livros

20. Mais informações

Material

20. Mais informações

Material

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

Muito obrigado!