O que é Git - Tutorial para iniciantes

Anderson Irias - 20/01/2020

O Git é um software de controle de versão distribuído, ele foi criado para verificar alterações no código fonte, no processo de desenvolvimento de software. Ele monitora um conjunto de arquivos, e checa se houve alguma modificação nestes arquivos. Se ocorrer alguma modificação nos arquivos, ele marca o arquivo para que as modificações possam ser registradas.

O Git funciona em um esquema de linha do tempo, onde se tem uma linha do tempo principal, a partir desta linha do tempo pode ser criado outras linhas que são os ramos . Estes ramos devem retornar para a linha do tempo principal para que o fluxo continue. A imagem abaixo demonstra bem isso.

Na imagem acima a linha vermelha representa a linha do tempo principal. No Git a linha do tempo principal é a branch master. As outras linhas verdes representam outras linhas do tempo, estas são outras branch que são criadas conforme o desenvolvimento de cada funcionalidade do projeto.

Git comandos

Após vermos um pouco do GIT na teoria, vou abordar alguns comandos úteis do GIT que são utilizados no dia a dia do desenvolvimento de software. Abaixo uma lista com alguns comandos do GIT.

Setar usuário:

git config --global user.name "Anderson Irias"

Setar email:

git config --global user.email contato@irias.com.br

Setar editor:

git config --global core.editor vim

Setar ferramenta de merge:

git config --global merge.tool vimdiff

Listar configurações:

git config --list

Criar novo repositório:

git init

Clonar um repositório:

git clone https://github.com/andersonirias/api-http-rest.git

Verificar estado dos arquivos:

git status

Adicionar arquivo/diretório (staged area):

git add meu_arquivo.txt

Comitar um arquivo:

git commit meu_arquivo.txt

Remover arquivo:

git rm meu_arquivo.txt

Exibir histórico:

git log

Desfazendo alteração local(Antes do commit):

git checkout -- meu_arquivo.txt

Desfazendo alteração local(Depois do commit):

git reset HEAD meu_arquivo.txt

Desfazer o último commit:

git reset HEAD~1

Enviar arquivos/diretórios para o repositório remoto:

git push

Atualizar os arquivos no branch atual:

git pull

Criando um novo branch:

git branch minha_branch

Apagando um branch:

git branch -d minha_branch

Trocando para um branch existente:

git checkout minha_branch

Fazendo um merge entre as branchs:

git merge minha_branch

Fazendo um rebase entre as branchs:

git rebase master

Criar um stash:

git stash

Listar stashes:

git stash list

Voltar para o último stash:

git stash apply

gitkeep

O gitkeep não é um recurso ou comando do Git, mas sim uma convenção. Em muitos projetos, existe a necessidade de adicionar no Git diretórios vazios. Mas por padrão o Git não rastreia diretórios vazios, assim criou-se a convenção de adicionar um arquivo chamado: .gitkeep em um diretório vazio em que se deseja que o Git realize o rastreio. Este arquivo é criado com o . na frente para ser um arquivo oculto. Ele também é criado vazio, e logo após de ser inserido conteúdo no diretório, é feita a sua exclusão.

gitignore

O arquivo .gitignore é utilizado para informar ao Git quais arquivos não devem ser rastreados. Seu funcionamento é bem simples, basta criar o arquivo: .gitignore e adicionar no mesmo linha após linha, o caminho dos arquivos qual não deseja rastrear. Abaixo exemplo de conteúdo do gitignore.

/config/.env /logs/* /tmp/* /vendor/*

GIT Flow

Existem vários modos de se utilizar o GIT, empresas podem ter processos diferentes no fluxo de trabalho com ele. Como exemplo, vou demonstrar aqui um fluxo básico de trabalho com o GIT.

Primeiro temos a branch master que é a branch principal, nesta branch fica todo o código que está em produção. Da branch master é criada somente uma branch de desenvolvimento, no início do projeto. Após isso nenhuma branch é criada a partir dela.

Temos a branch desenvolvimento, nesta branch fica o código que está sendo feito. E temos as branchs das funcionalidades, cada branch é referente a uma funcionalidade do sistema.

Na imagem abaixo temos a representação deste processo, a linha vermelha representa a branch master, a linha verde representa a branch desenvolvimento e as linhas rosas representam as branchs das funcionalidades.

Vou apresentar alguns pontos, para que seja possível deixar o gráfico do GIT igual ao apresentado acima.

1 - Para desenvolver novas funcionalidades, deve ser criado uma branch nova a partir da branch de desenvolvimento. As novas branchs devem sempre ser criadas da branch de desenvolvimento e não da master.

2 - Após concluída a nova funcionalidade deve ser solicitado o merge, assim deve ser feito o merge da funcionalidade com a branch de desenvolvimento e não direto na master.

3 - Caso tenha sido iniciado uma branch após a branch que está sendo feito o merge, e está branch já foi feito o merge, deve ser feito o rebase para que a sequência fique organizada como a da imagem.

Git merge

O comando git merge é utilizado para juntar duas ou mais branchs de desenvolvimento.

Git rebase

O comando git rebase é utilizado para integrar uma branch com a outra. Com isso podemos atualizar o histórico de uma branch, para que ela fique atualizada com sua branch de origem.

Git rebase interativo

Para fazer um git rebase interativo com os commits, siga o mesmo processo descrito acima, adicionando o -i e os commits que deseja manipular.

Exemplo de rebase interativo com os dois últimos commits da branch: git rebase -i HEAD~2

O commit que quer manter deixa como pick, e o commit que quer apagar coloca como drop.

Git cherry pick

O git cherry pick é um comando que permite copiar commits de uma branch para outra.

Git e GitHub diferença

O Git é um software de código aberto, para controle de versão de forma distribuída. Ou seja, o Git é o sistema que fornece os comandos para o gerenciamento dos arquivos e seu versionamento. Já o GitHub, é um serviço de hospedagem na nuvem que utiliza o Git. O GitHub é uma plataforma que usando o Git, podemos hospedar os arquivos de nossos softwares e os utilizar de forma compartilhada. Além disso, o GitHub fornece outras funcionalidades que auxiliam no desenvolvimento e gestão do código.