Anotações do curso ‘Git - Básico ao avançado’

8 minutos de leitura

Atualizado em:

Recentemente conclui o curso Git - Básico ao avançado (2021) na Udemy ministrado pelo Rodrigo Santana. Foi uma excelente experiência onde pude aprender bastante sobre esta ferramenta. Por mais que já usava o GIT a alguns anos, sempre há algo novo para se aprender.

Esse post é um resumo com minhas anotações do curso. E no final alguns bônus pessoais.

Introdução

Criar um repositório

git init

Associar um repositório local ao remoto

Adiciona um repositório remoto ao local com o nome de origin, Podem haver mais de um repositório remoto associado ao local.

git remote add origin [URL]

Configurar informações do colaborador

git config --global user.name "Fulano de Tal"
git config --global user.email fulanodetal@exemplo.br

As opção são do git config são: --local --global --system. Há uma prioridade da esquerda para direita.

Alias

git config alias.[comando curto] [comando longo]

Exemplo:

git config --global alias.hist 'log --pretty=format:"%h %ad | %s%d [%an]" --graph --date=short'

Ajuda

git [comando] -help|--help

-help exibe a ajuda do comando no terminal, --help exibe no navegador.

Iniciando com Git

Adicionar um arquivo para a área de staging

git add .
git add [arquivo]

Commitar os arquivos da área de staging

git commit -m [mensagem]

Exibir detalhes de um ou vários commits

git show
git show [hash]
git show [hash]..[hashN]

Exibir detalhes dos GIT object

git cat-file -p [hash comit, tree ou blob]

Exibir detalhes do estado atual da área de trabalho

git status

Referências no Git

Na teoria, uma branch é uma rafmificação de um projeto, na prática, uma branch é um ponteiro para um commit

Criação de branches

git branch [nome]
git checkout -b [nome] #cria uma branch e alterna para ela

HEAD é uma referência para o branch que se esta trabalhando

Listar branches

git branch
git branch -a #lista as locais e as de rastreamento

Branch de rastreamento (upstream branch), são as branches remotas

Enviar as alterações para o remoto

git push
git push --set-upstream|-u origin [branch] #empurra para o remoto criando a branch de rastreamento

Outras operações com branches

git branch -m "novo_nome" #renomeia a branch corrente
git branch -d [nome] #remove uma branch local
git branch origin :[branch] #remove uma branch remota

Tags

git tab -a "v1.0" -m "primeira versão" #cria uma tag anotada
git tab [nome_tag] #cria uma tag leve
git push --tags #por padrão o push não envia tags

Uma tag leve apenas marca um commit com um nome, sem referencias de quem criou ou outras anotações. Uma tag anotada cria uma versão com referências do criador e anotações

Descartando alterações

Descartar as alterações locais

git restore [arquivo]
git restore .

Descartar todas as modificações ainda não controladas pelo GIT.

git clean -f [arquivo]
git clean -f

No comando acima, se não especificar nenhum arquivo, todos os arquivos serão afetados. -n lista o que seria afetado, sem realizar nada.

Descarta as modificações do stage

git restore --staged [arquivo]
git restore --staged .

Reverter as alterações mantendo o histórico

git revert HEAD #reverte as alterações do ultimo commit 
git revert HEAD~1 #reverte as alterações do penúltimo commit 

Esta ação realiza um novo commit, o parâmetro --no-edit faz com uma mensagem padrão.

Reverter as alterações excluindo o histórico

git reset HEAD

O commit resetado passa a não mais existir no historico do GIT. Há tres tipos de reset: soft, mixed e hard, se nada for informado o padrão é o mixed:
--soft: preserva a area de trabalho e o staged (staged e untraked);
--mixed: preserva a area de trabalho (untraked);
--hard: não preserva nada.

Listar os logs de comandos do GIT

git reflog

Útil para obter um reset feito de forma errada e restaurar com o git branch [hash].

Exibir um arquivo em uma versão antiga

git restore --source [hash] [arquivo]

Merges e DAG

Mesclar branches

git merge [branch]

Tipos de merge:
Merge fast-foward: quando o branch derivado esta a frente do que deu origem, assim ocorre apenas uma troca do HEAD para o ultimo commit dessa nova branch, já que não ouve alterações na de origem.
Passando a opção --no-ff no merge, pode pedir ao GIT que crie um commit de merge com dois pais.
Merge three way (estratégia recursiva): quando também ouveram mudanças no branch de origem, assim há uma mesclagem entre os dois branches, o commit de merge tem dois pais.

Commits de merges tem dois pais.

O GIT modela a relação de commits com grafos, utiliza o DAG (Grafo acíclico dirigido), onde cada nó representa um commit e as setas para os pais de um commit

Trabalho colaborativo

Baixar o conteúdo remoto

git fetch

O comando acima faz o download do conteúdo remoto mas não atualiza o estado de funcionamento do seu repositório local.

Mesclar entre uma branch local e uma remota

git merge origin/master

O comando pull realiza exatamente as duas operações acima.

git pull

Reescrevendo o histórico

Mesclar branches sem fazer merge.

git rebase [branch]
git rebase -i [branch] #iterativo

O rebase mescla branches sem fazer merge, esse commit não terá dois pais, porém ele deleta commits para que a HEAD aponte para ele.

Regra de outro do rebase: Não recrie commits que existam fora de seu repositório e nos quais as pessoas possam ter trabalhado

O merge é uma operação não destrutiva. As ramificações existentes não são alteradas de forma alguma. Isso evita todas as possiveis armadilhas do rebease, porém, isso também significa a existencia de bifurcações em merges não fast-forward, o que irá poluir o histórico.

O rebase é uma operação destrutiva. Um ou mais commits serão eliminados e criados novamente, por isso, para não gerar problemas maiores que um histórico poluído, é importante seguir a regra de ouro do rebase. Se você utiliza esse comando de forma consciente, terá um histórico mais linear e fácil de ser entendido.

git pull --rebase #Faz a mesclagem com a branch de rastreamento sem gerar um merge, e por consequência uma bifurcação 

Corrigir o ultimo commit

git commit --amend -m "[mensagem]"

O comando acima 'emenda' o ultimo commit, útil para quando esqueceu de algo, ele recria o ultimo commit com o novo conteúdo e até a nova mensagem. Importante, tenha certeza de que ninguém criou uma branch a partir desse commit. Também serve para renomear o ultimo commit.

Mesclagem juntando vários commits

git merge --squash [branch]

O comando acima realiza um merge juntando dos os commits desse branch. Na pratica ele faz o merge e adiciona todos os arquivos mesclados na área de trabalho, forçando assim uma operação de commit que seria a junção de todos eles.

Outros conceitos e comandos

Stash

Coloca os arquivos que não foram commitados ainda em uma pilha para que seja possível alterar de branch sem perder essas alterações. Arquivos untracked não entram nessa pilha.

git stash
git stash list #exibe o conteúdo da stash
git stash pop #retira os arquivos do stash
git stash apply stash@{1} #obtém sem remover um elemento especifico da pilha
git stash clear #limpa a pilha

Exibir alterações de arquivo e o ultimo autor a alterar cada linha

git blame [arquivo]
git blame -L 1,3 [arquivo] #especifica as linhas

Remover arquivos já versionados

git rm [arquivo] #marca arquivos já versionados para remoção
git rm --cached [arquivo] #mantém esses arquivos na área de trabalho

Ver diferenças nos arquivos

git diff #exibe as alterações da área de trabalho atual com o ultimo commit
git diff --staged #compara as alterações com a área de preparo
git diff [hash]..[hash] #compara entre dois commits

Ignorar arquivos e diretórios

É possível fazer isto criando um arquivo .gitignore na raiz do projeto, e listando os arquivos e diretóios que não deseja ser versionados pelo GIT.

Outros recursos

git bisect #rastreia de forma iterativa commit a commit para encontrar bugs
git cherry-pick #permite mesclar um commit especifico com sua branch
git config --global credential.helper store #salva localmente a próxima autenticação remota usada

Vídeos complementares

Como complemento ao assunto, indico esses dois vídeos do Fabio Akita sobre GIT

https://www.youtube.com/watch?v=6Czd1Yetaac

https://www.youtube.com/watch?v=6OokP-NE49k

Referências e outros links

[]´s

Deixe um comentário