5 de junho de 2025
git config
git init
fork
e git clone
git status
, git add
e git commit
.gitignore
git log
e git show
git diff
git restore
, git revert
e git reset
git branch
, git switch
e git merge
git remote
, git push
e git pull
Pull request
Estamos num espaço seguro e amigável
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
gitKraken
Quem nunca…
Manejar projetos individualmente
Manejar projetos compartilhados
Manejar projetos no tempo
Principal ferramenta utilizada em grandes projetos
Cada vez mais necessário em colaborações
git
git
git
GitHub
GitHub
ATENÇÃO: dois conceitos!
ATENÇÃO: dois conceitos!
GitHub
Vamos criar uma conta no GitHub (caso não possuam)
GitHub
Salvem ou recuperem essas informações!
username: mauriciovancine
email: mauricio.vancine@gmail.com
senha: !@#$%¨&*+
Perfil
Perfil
Settings: superior direito > foto do perfil > Settings
Settings: superior direito > foto do perfil > Settings
Settings
Repositório
Repositório
README.md
README.md
Criar repositório: Perfil > Repositories > New
Criar um repositório
Criem uma página inicial para o perfil do GitHub
Criem uma página inicial para o perfil do GitHub
mauriciovancine
)README.md
nesse repositórioCriem um repositório para exemplo no curso
teste
README.md
nesse repositórioREADME.md
RStudio
{fig-align=‘center’
RStudio
Tools > Global Options > Git/SVN
RStudio
C:/Program Files/Git/bin/git.exe
/usr/bin/git
/usr/bin/git
RStudio
Chave SSH
GitHub
Perfil > Settings > SSH and GPG keys > New SSH key
GitHub
ctrl + v
)git
git config
: definir as configurações de usuário do gitctrl + shift + v
)Duas formas de trabalhar com o git e GitHub
git init
: inicia o versionamento de um repositório local
Diretório local
teste_local
setwd("teste_local")
)script.R
Diretório local
Terminal
do RStudioTerminal
, rodem: cd caminho/pasta
Terminal
, rodem: git init
Terminal
, rodem: git add -Av
Terminal
, rodem: git commit -m 'add script.R'
Terminal
, rodem: git restore script.R
Fork: cópia de um repositório para o seu repositório (GitHub)
Forkar um diretório remoto
Agora o repositório do workshop, que estava no meu GitHub, foi copiado (“garfado”) para o GitHub de vocês
Clonar: download de um repositório remoto (e.g. GitHub) para o seu repositório local (computador)
git clone
: download de um repositório remoto (e.g. GitHub) para o seu repositório local (computador)
Primeiro, vamos criar uma pasta chamada github
3.1 Criar um Projeto R com controle de versão
File > New Project > Version Control
3.2 Escolher clonar repositório do GitHub
Git
3.3 Preencher com dados do repositório do GitHub
Repository URL
3.4 Preencher:
git@github.com:mauriciovancine/teste.git
preenchimento automático
/home/mude/data/github
Comandos git para o fluxo de trabalho dos repositórios
Fluxo do versionamento
Fluxo do versionamento
Fluxo do versionamento usando fotos (working tree)
Fluxo do versionamento usando fotos (git add
)
Fluxo do versionamento usando fotos (git commit
)
Rastreamento dos arquivos no diretório de trabalho
Quatro estados de alteração dos arquivos
git add
) para o commitIMPORTANTE!
git add
) se tornam stagedgit add
) se tornam stagedgit commit
, todos os arquivos se tornam unmodifiedTerminal do RStudio
Terminal do RStudio
Tools > Terminal > New Terminal (alt + shift + r)
git status
: mostra o estado do repositório
Vamos criar um arquivo no diretório
Usando a aba Terminal do RStudio
git status
: mostra o estado do repositório
git add [file]
: adiciona mudanças após edições (staging area) [Index]
git add -v [file]
: adiciona mudanças após edições (staging area) [Index]
git add -Av
: adiciona todas mudanças após edições (staging area) [Index]
git add .
: adiciona todas mudanças após edições (staging area) [Index]
git status
: mostra o estado do repositório
git commit
: registra as alterações da staging area no repository [HEAD]
git commit -m "[mensagem]"
: registra as alterações da staging area no repository com uma mensagem [HEAD]
git status
: mostra o estado do repositório
Fluxo do versionamento
Usando a aba Files do RStudio, vamos abrir e editar o arquivo test.txt
git status
: mostra o estado do repositório
git add
: adiciona mudanças após edições na staging area [Index]
git status
: mostra o estado do repositório
git commit -m "[mensagem]"
: registra as alterações da staging area no repository com uma mensagem [HEAD]
git status
: mostra o estado do repositório
ATENÇÃO!
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
# 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
Corrigir mensagens de commit
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
Fluxo do versionamento
git
.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
]
.gitignore
.gitignore
git log
: histórico dos commits
hash
hash curto
Referenciar um commit usando apenas os primeiros caracteres do hash
Utilizamos esse identificador em várias operações no git
Por exemplo:
3a4f9b7
3a4f9b7c19e2f4e1a0de9b7e5c6aebd7d5d85792
HEAD
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
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
git log --oneline
: histórico dos commits simplificado
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
git log --grep
: faz uma busca no histórico dos commits
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
git log
: cheatsheet
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
git show [hash]
: detalhes de um commit específico
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
git diff
: diferenças realizadas em um repositório
git diff
: diferenças entre working directory e staging area
Observação: Não retornou nenhuma diferença, pois não editamos o arquivo
git diff
: diferenças entre working directory e staging area
Vamos editar o arquivo “test.txt” usando o terminal
git diff
: diferenças entre working directory e staging area
diff --git a/test.txt b/test.txt
: que arquivo mudou@@...@@
: onde foi mudado-
: linhas removidas+
: linhas adicionadasgit diff --staged
: diferenças entre staging area e repository
Observação: Não retornou nenhuma diferença, pois não adicionamos ao staging area
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
git diff HEAD
: diferenças entre working directory e repository
git diff [file]
: diferenças entre versões do mesmo arquivo
git diff [hash1] [hash2]
: diferenças entre commits
git diff 5a164d5 50c520f --stat
: diferenças em resumo, sem mostrar o conteúdo alterado
git restore
: desfaz alterações na working tree ou staging areagit revert
: desfaz commits, mas preserva o histórico (criando outro commit)git reset
: desfaz commits, mas deleta o histórico (deletando commits)
git restore
: desfaz alterações na working tree ou staging area
git restore [file]
: desfaz alterações na working tree
git restore [file]
: desfaz alterações na working tree
test.txt
da pasta testgit restore [file]
: desfaz alterações na working tree
git restore [file]
: desfaz alterações na working tree
git restore [file]
: desfaz alterações na working tree
git restore [file]
: desfaz alterações na working tree
git restore --staged
: desfaz alterações na staging area, mas mantém alterações dos arquivos
git restore --staged
: desfaz alterações na staging area, mas mantém alterações dos arquivos
git restore --staged
: desfaz alterações na staging area, mas mantém alterações dos arquivos
git restore --staged
: desfaz alterações na staging area, mas mantém alterações dos arquivos
git restore --staged
: desfaz alterações na staging area, mas mantém alterações dos arquivos
git restore --staged
: desfaz alterações na staging area, mas mantém alterações dos arquivos
git restore --staged
: desfaz alterações na staging area, mas mantém alterações dos arquivos
git restore --staged --worktree
: desfaz alterações na staging area e na work tree (arquivos)
git restore --staged --worktree
: desfaz alterações na staging area e na work tree (arquivos)
git revert [hash]
: desfaz commits, mas preserva o histórico (criando outro commit)
git revert [hash]
: desfaz commits, mas preserva o histórico (criando outro commit)
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
git revert [hash]
: desfaz commits, mas preserva o histórico (criando outro commit)
Ctrl + O
(Write out) > Enter
> Ctrl + X
(Exit)git revert [hash]
: desfaz commits, mas preserva o histórico (criando outro commit)
git revert [hash]
: desfaz commits, mas preserva o histórico (criando outro commit)
git reset [modo] [hash]
: desfaz commits, mas deleta o histórico (deletando commits)
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)git reset --soft [hash]
: mover o HEAD para outro commit
git reset --soft [hash]
: mover o HEAD para outro commit
git reset --soft [hash]
: mover o HEAD para outro commit
Detalhes:
Quando usar:
git reset --mixed [hash]
: mover o HEAD e desfazer o staging area
git reset --mixed [hash]
: mover o HEAD e desfazer o staging area
git reset --mixed [hash]
: mover o HEAD e desfazer o staging area
Detalhes:
Quando usar:
git reset --hard [hash]
: move HEAD, desfaz staging e descarta alterações nos arquivos
git reset --hard [hash]
: move HEAD, desfaz staging e descarta alterações nos arquivos
git reset --hard [hash]
: move HEAD, desfaz staging e descarta alterações nos arquivos
Detalhes:
Quando usar:
git reset --hard [hash]
: move HEAD, desfaz staging e descarta alterações nos arquivos
Cuidado: essa operação é irreversível (exceto git reflog
)
Branch (ou ramo) é uma linha paralela de desenvolvimento
Funções:
main
ou master
)Importante!
git add
e git commit
) fazem parte da branchgit branch
: listar as branchs e verificar a branch de edição (*
)
main
para a branch principal para adotar uma linguagem mais inclusiva, clara e alinhada com os padrões de desenvolvimentomaster
main
git branch [nome-branch]
: criar uma branch
git switch [nome-branch]
: trocar a branch de edição
git branch
: lista os branchs e verifica a branch de edição
git switch -c [nome-branch]
: criar e mudar para a nova branch
git branch
: lista os branchs e verifica a branch de edição
git branch -m [novo-nome]
: renomear uma branch de edição
git branch -m [nome-antigo] [novo-nome]
: renomear uma branch
git branch -d [nome]
: deletar uma branch
Vamos criar um arquivo no diretório e na branch-2
git switch
: trocar a branch de edição
git switch
: trocar a branch de edição
git merge
: mescla as branchs em uma única branch
git merge
: mescla as branchs em uma única branch
git merge
: mescla as branchs em uma única branch
Git Branch Cheatsheet
git remote
: gerencia conexões com repositórios remotos (GitHub)
origin
: nome padrão para o repositório remoto principalgit remote
: gerencia conexões com repositórios remotos (GitHub)
origin
git@github.com:mauriciovancine/teste.git
fetch
: endereço para buscar atualizações do repositório remotopush
: endereço para enviar suas alterações para o repositório remotogit remote add
: adiciona ligação com um repositório remoto (GitHub)
git push
: envia suas alterações (commits) feitas localmente para o repositório remoto (GitHub)
git push
: envia suas alterações (commits) feitas localmente para o repositório remoto (GitHub)
Função:
git push
: envia suas alterações (commits) feitas localmente para o repositório remoto (GitHub)
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
Em caso de incêndio…
CUIDADO: muitas vezes há conflitos que precisam ser revolvidos entre o repositório local e o remoto
Limites de tamanho
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:
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
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 merge
: para mesclar manualmentegit rebase
: para reescrever o histórico de forma linear (evitar)git pull
: busca atualizações do repositório remoto e as traz para o repositório local, alterando a branch atual
git pull
: busca atualizações do repositório remoto e as traz para o repositório local, alterando a branch atual
git fetch
+ git merge
Resumo
Pull Request
: solicita que o repositório remoto original (GitHub) aceite (pull - ‘puxe’) as alterações realizadas do fork
Fluxo de trabalho de um Pull Request
git add
e git commit
)git pull
)Pull Request
)Pull Request
: solicita que o repositório central (remoto) aceite (pull - ‘puxe’) as alterações realizadas do nosso fork
Pull Request
: solicita que o repositório central (remoto) aceite (pull - ‘puxe’) as alterações realizadas do nosso fork
Pull Request
: solicita que o repositório central (remoto) aceite (pull - ‘puxe’) as alterações realizadas do nosso fork
Pull Request
: solicita que o repositório central (remoto) aceite (pull - ‘puxe’) as alterações realizadas do nosso fork
Conflitos no repositório local
Conflitos no rep. local vindos de um rep. remoto
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 |
Como o Git detecta conflitos
O Git compara três versões do arquivo:
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
<<<<<<< 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ãoSolução
<<<<<<<
e >>>>>>>
<<<<<<<
, =======
, >>>>>>>
)Agradecimento à Beatriz Milz pelas figuras surrupiadas (eu pedi…)
Git Panel
Git Panel - Detalhes
Git Panel - Branches
Git Panel - Diff - Changes: Revisar mudanças
Git Panel - Diff - History: Histórico de mudanças
Git pane - Staged
Git pane - Staged e File status
Git pane - Commit
Git pane - Commit
Git pane - Push e Pull
Git Cheat Sheet
usethis
Comandos direto no R para criar e versionar repositórios
Livros
Material
Material
Curso de Git - Bóson Treinamentos
Git e Github para iniciantes - Willian Justen de Vasconcellos
Curso de Git - Professor Aquino
Slides por Maurício Vancine, feitos com Quarto. Código disponível no GitHub.