O objetivo deste post é apresentar de forma sucinta e concisa o conceito de algumas palavras-chave para entender o funcionamento da ferramenta de versionamento Git.
A ideia é construir uma espécie de Glossário, trazendo o significado de palavras, que são a base para entender o funcionamento desta ferramenta, que é amplamente utilizada por diversos segmentos Techs, incluindo a Ciências de Dados.
Glossário Git
COMMIT:A palavra commit do inglês, nos remete à ideia de comprometer, verificar ou confirmar algo. No Git, significa que uma nova alteração feita no código do projeto será submetida para o salvamento no ambiente local. Funciona como uma captura da versão atual do projeto, em que é possível adicionar uma mensagem que “vai contar a história do projeto” durante o seu desenvolvimento.
REPOSITÓRIO LOCAL: É o repositório criado dentro da máquina local.
REPOSITÓRIO REMOTO: É um repositório que não está localizado na máquina local, por exemplo o GitHub.
BRANCH: É um ambiente que possui uma linha de trabalho independente. Permite modificar códigos, sem alterar o que já está funcionando, com mais segurança, autonomia e minimizando os conflitos de merge. Por exemplo, uma equipe está trabalhando em um projeto, onde cada um trabalha de forma independente, em partes diferentes do código do projeto e em uma branch diferente e, conforme as alterações vão sendo realizadas, serão salvas em um único projeto.
HEAD: Funciona como um ponteiro que representa a versão que está sendo alterada no momento, ou seja, em qual versão do projeto estamos trabalhando. Utilizando o comando checkout em uma branch, o Git de forma automática coloca a HEAD apontando para a última versão desta branch.
MERGE: É a união de commits. Por exemplo, quando um código está sendo testado fora da branch “oficial” e depois de “passar no teste” ele pode ser adicionado à branch “oficial”, através da realização de um merge.
CONFLITO DE MERGE: Ocorre quando linhas de código diferentes são salvas no mesmo arquivo e ficam “sobrepostas”. É como se duas linhas de código tentassem ocupar o mesmo espaço. Estes conflitos podem acontecer na união entre branchs e entre commits. O Git não consegue resolver este problema automaticamente, é necessário resolver desfazendo as alterações ou com a utilização de pacotes especiais que auxiliam nessa etapa.
Esses são alguns conceitos básicos para entender o funcionamento do Git que são necessários para um melhor embasamento, quando estamos estudando ou trabalhando com essa ferramenta.
Agradeço o seu tempo para a leitura deste pequeno artigo, espero ter contribuído. E, se você quer saber mais sobre a utilização do Git, seus principais comandos e como trabalhar com essa ferramenta, faça a leitura do artigo listado no link abaixo, onde este tema está mais detalhado. Até logo 😉
Nesse artigo, você vai conhecer os principais conceitos e comandos para utilizar a ferramenta Git nos seus projetos de Data Science, desde a criação de um novo repositório local até os conceitos mais avançados como branchs e merge, que facilitam o trabalho em equipe em um ambiente remoto e colaborativo.
O que é e para que serve?
O Git é uma ferramenta que não pode faltar na formação de um Cientista de Dados, porque permite o controle de versionamento de códigos, organiza as alterações realizadas ao longo do projeto, permite fazer um push e um pull dessas alterações e continuar o desenvolvimento do projeto, com as suas melhorias implementadas.
O ideia do Git é fornecer um repositório local para armazenar o projeto, que pode funcionar offline para um trabalho mais individual e além disso facilita o compartilhamento das alterações do projeto para um trabalho em equipe, organizado em ambiente remoto.
O Git apresenta muitas facilidades que o tornam uma ferramenta indispensável:
Segurança e facilidade no controle de versões do Projeto.
Construção de branches, que são ambientes seguros para desenvolver e testar, sem impactar no que já está em produção funcionando.
É possível ignorar alguns arquivos, através da utilização do .gitignore, para filtrar os arquivos que não fazem parte do código-fonte do projeto.
Operações rápidas e fáceis.
Capacidade para adicionar ou mover arquivos.
É possível entender o histórico das modificações realizadas.
Conhecendo a área de trabalho do Git
Staging: onde ficam todos os arquivos alterados e que foram marcados como prontos para terem o seu estado salvo, com um commit. Utilizamos o comando git add <nome_arquivo> para enviar um arquivo para a Staging Area.
Repository: área onde ficam todos os arquivos versionados pelo Git, que foram salvos com o comando git commit.
Working Directory: área onde ficam todos os arquivos que foram alterados (saíram da área Repository), mas ainda não foram marcados como prontos para serem commitados. Utiliza-se o comando git restore<nome_arquivo> para remover o arquivo de dentro da Working Directory e retornar ao último estado salvo no Repository(a funcionalidade deste comando é desfazer as alterações e voltar para o Repository).
Alguns comandos essenciais no Git que você não pode deixar de conhecer
Inicializa o repositório
ZSH
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Inicializar o repositório.
$git init
# Visualizar a situação do repositório local.
$git status
# Adicionar um novo arquivo.
$git add<nome_arquivo>
# Adicionar de uma única vez todos os arquivos.
$git add.
# Salvar um novo arquivo.
$git commit-m“Mensagem_commit”
Comandos para a visualização do histórico e alteração de commits
ZSH
1
2
3
4
5
6
7
8
9
# Exibir os commits.
$git log
# Visualizar em forma de lista o histórico de commits.
# Verificar as informações essenciais em uma única linha.
$git log--oneline
# Alterar e substituir o último commit.
$git commit-m"mensagem"--amend
Comandos para alteração de commits anteriores
ZSH
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# Mostrar quais alterações foram feitas.
# Verificar a diferença entre dois commits.
$git diff
# Verificar do head até n commits anteriores.
# Verificar quais alterações foram feitas.
$git log-p-<nºde commits anteriores>
# Estruturar ou reescrever o histórico de commits.
# Possui um modo interativo de inserção <i>.
# <i> facilita a reescrita do commit.
$git rebase-iHEAD~<n>
# Ajustar a mensagem do commit.
$git rebase reword
# Ajustar a mensagem a partir de grupos de commits
$git rebase squash
# Voltar até o estado original do HEAD no repositório local.
# Permite salvar e observar as alterações que queremos fazer.
$git reset--mixed<commit>
# Apagar tudo e voltar para o estado anterior.
$git reset--hard<commit>
Comandos de recuperação de arquivos deletados
ZSH
1
2
3
4
5
6
# Recuperar um arquivo excluído, porém não commitado.
$git restore<arquivo>
# ou
$git reset--mixed<commit>
# e então
$git restore<arquivo>
Comandos para trabalhar em equipe em um ambiente remoto – GitHub
ZSH
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# Adicionar um novo repositório remoto.
$git remote add<nome_repos><url_github>
# Remover o repositório.
$git remote remove<nome_repos>
# Verificar repositórios remotos que estão no repositório local.
$git remote-v
# Baixar um projeto do repositório remoto para a máquina local.
$git clone<url>
# Enviar as atualizações para um repositório remoto.
$git push
# Receber as atualizações de um repositório remoto.
$git pull
Trabalhando com Branchs
A branch permite modificar os códigos de um projeto, sem alterar o que já está funcionando, promovendo a independência no desenvolvimento para testar e alterar antes de enviar para o ambiente de produção. Assim, a equipe pode produzir de forma independente, com mais segurança no projeto, minimizando os conflitos de merge.
Comandos para criar e mover Branchs
ZSH
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# Criar uma branch e mover o ponteiro HEAD direto pra ela.
$git checkout-b<nome>
# Criar uma branch nova a partir de outra branch.
$git branch<nome>
# Movimentar o HEAD de uma branch para a outra.
# Permite linhas em desenvolvimento de forma independente.
$git checkout<nome>
# Mover o HEAD para uma branch específica.
$git checkout<SHA-1>
# Enviar uma branch local para o repositório remoto.
$git push-u<nome_repos_remoto><nome_branch>
# Enviar várias branchs para o repositório remoto.
$git push--all
# Mostrar todas as branchs do repositório remoto.
$git branch-a
# Apagar uma branch:
# Fazer dois commits (um local e um remoto):
# a) Branch local:
$git branch-d<nome_branch_local)
# b) Remoto:
$git push--delete origin<nome_branch>
Realização do merge
O merge é a união de commits e é muito utilizado quando trabalha-se com branch.
O Git não consegue resolver automaticamente quando ocorre o conflito de merge, ou seja, alterações no mesmo arquivo e/ou linhas de código.
Esses conflitos podem acontecer tanto na união entre branchs quanto entre commits.
1
$git merge
Para utilizar o comando git merge, tem-se que estar na branch que irá receber as alterações.
No Diagrama abaixo, observa-se que os dois primeiros commits são feitos na Branch main. Quando a Branch develop for criada, uma cópia do projeto será adicionada à ela. E, esta versão do projeto, após suas alterações, retorna através de um merge para a Branch main, atualizando a sua versão.
Exemplo de Diagrama de Histórico de alterações do Git
Comandos para identificar o conflito de merge dentro do Jupyter Notebook
O Jupyter Notebook é “por baixo dos panos” um arquivo json, o que dificulta bastante na hora de identificar onde está acontecendo o problema.
Para visualizar o arquivo fonte, dentro do Jupyter Notebook e identificar onde aconteceu o conflito de merge, utiliza-se o Reopen Editor With -> text editor.
Quando ocorre o erro no merge no Jupyter, é mais assertivo desfazer o processo. E para auxiliar na identificação do problema, é possível utilizar o pacote nbdime.
Agora, você é capaz de utilizar a ferramenta Git para desenvolver os seus projetos em Data Science, otimizando o versionamento de códigos de maneira segura, eficiente e organizada.
Se você ficou com alguma dúvida sobre algum conceito importante como branch e head, pode visitar um pequeno post que elaborei no formato de um glossário, trazendo o significado de algumas palavras-chave dentro do Git. Pode ser encontrado neste link:
Finalizando, agradeço o seu tempo dedicado à leitura deste artigo, espero ter contribuído de alguma forma e nos encontramos novamente na leitura de futuros artigos.