Anotações do curso ‘Git - Básico ao avançado’
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
Referências e outros links
- https://www.udemy.com/course/git-basico-ao-avancado-2021/learn/lecture/27837080
- https://www.lumis.com.br/a-lumis/blog/git-entenda-conceitos-basicos-sobre-o-sistema.htm
- https://rogerdudler.github.io/git-guide/index.pt_BR.html
[]´s
Deixe um comentário