Objetivo: material didático, direto ao ponto, com comandos corrigidos, explicações e exemplos de uso.
Público-alvo: iniciantes e usuários intermediários.
- ✅ Sistema de Controle de Versão Distribuído (DVCS): salva o histórico de alterações do seu projeto localmente e permite colaboração.
- ✅ Colaborativo: múltiplas pessoas podem contribuir de forma segura e auditável (commits, branches, merges).
- ❌ Não é “armazenamento em nuvem”. Plataformas como GitHub, GitLab e Bitbucket hospedam repositórios remotos e oferecem recursos adicionais (issues, pull requests, pipelines etc.).
- Blob: conteúdo de um arquivo em um dado momento.
- Tree: diretórios/estrutura de arquivos (aponta para blobs/trees).
- Commit: metadados (autor, data, mensagem) + ponteiro para uma tree e para o commit pai.
Inspecionar na prática:
git show <hash>,git ls-tree -r <hash>.
PR é um fluxo da plataforma (não um comando Git puro) para propor mudanças de uma branch para outra:
- Merge (merge commit): preserva o histórico; cria um commit de mesclagem.
- Squash and Merge: comprime vários commits da branch de feature em um commit na branch de destino.
- Rebase and Merge: reescreve os commits da branch de feature “por cima” da base, deixando histórico linear.
Escolha depende da política do repositório (histórico linear vs histórico completo).
sudo apt update
sudo apt install -y software-properties-common
sudo add-apt-repository ppa:git-core/ppa -y # (opcional, para versões mais novas do Git)
sudo apt update
sudo apt install -y git
git --version- Fedora:
sudo dnf install git - Arch/Manjaro:
sudo pacman -S git - macOS (Homebrew):
brew install git - Windows: https://git-scm.com/download/win
git config --global user.name "Seu Nome"
git config --global user.email "seu.email@exemplo.com"
git config --global core.editor "nano" # ou "code --wait", "vim", etc.
git config --list
# Para remover/ajustar algo:
git config --global --unset <chave>1) Criar a chave
ssh-keygen -t ed25519 -C "seu.email@exemplo.com"
# Aceite o local padrão: ~/.ssh/id_ed25519 (recomendado)2) Permissões e arquivos
# Permissões recomendadas (chave privada 600, chave pública 644):
chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub3) Iniciar o agente e adicionar a chave
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed255194) Copiar a chave pública e colar na plataforma
cat ~/.ssh/id_ed25519.pub
# Copie o conteúdo e cadastre em: GitHub/GitLab > Settings > SSH Keys5) Teste com repositório privado (ajuste a URL)
git clone git@github.com:<usuario>/<repositorio>.gitDica: Se precisar de ~/.ssh/config:
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yesEm ambientes Desktop Linux, instale o
xdg-utilsse o navegador não abrir links corretamente:sudo apt install -y xdg-utils.
mkdir meu-projeto && cd meu-projeto
git init
echo "# Meu Projeto" > README.md
git status
git add README.md # ou: git add . (tudo do diretório)
git commit -m "Commit inicial: adiciona README"git help # abre visão geral
git help <comando> # ex.: git help loggit add arquivo.txt # adiciona específico
git add . # adiciona tudo a partir do diretório atual
# Evite: git add * (pode ignorar arquivos ocultos) e “git add.” (sem espaço)Remover do staging (sem perder alterações):
git restore --staged arquivo.txtgit commit -m "Descrição clara do que mudou"
git commit --amend -m "Nova mensagem para o commit anterior" # reescreve a mensagemgit status
git status -v # mostra diffs na saída (verboso)git remote add origin git@github.com:<usuario>/<repo>.git
git remote -v
git branch -M main # renomeia a branch atual para main
git push -u origin main # define upstream para 'main'
git push -v # saída verbosa
git push -4 # força IPv4 (ambientes com rede limitada)
# Cuidado ao sobrescrever histórico remoto:
git push --force-with-lease # preferível ao --force/-fgit branch "minha-feature" # cria branch (não troca)
git branch --all # lista todas (locais e remotas)
# Formas modernas de trocar/criar:
git switch "minha-feature" # trocar para branch existente
git switch -c "nova-feature" # criar e trocar para a nova
# Formas clássicas (ainda comuns):
git checkout "minha-feature" # trocar para branch existente
git checkout -b "nova-feature" # criar e trocar para a nova
# Publicar a branch e definir upstream
git push --set-upstream origin "minha-feature"# estando na branch de destino (ex.: main):
git merge minha-feature
# apagar branch (local):
git branch -d minha-feature # seguro (recusa se houver commits não mesclados)
git branch -D minha-feature # forçagit fetch # atualiza refs remotas (sem mesclar)
git diff # wdir vs último commit
git diff --staged # staging vs último commit
git diff HEAD~1 HEAD # penúltimo vs último commit
# Guardar alterações temporariamente e voltar limpo
git stash # cria stash e limpa wdir
git stash list # lista stashes
git stash pop # aplica o último e remove do stash# Moderno: restaurar do último commit
git restore --source=HEAD -- caminho/arquivo.ext
# Clássico (ainda muito usado):
git checkout -- caminho/arquivo.extgit reset --soft <hash> # move HEAD; mantém staging e wdir (volta commits, preserva staging)
git reset --mixed <hash> # (padrão) limpa staging; mantém wdir
git reset --hard <hash> # descarta TUDO até o hash (perde mudanças não commitadas)git revert HEAD
git revert --no-edit HEAD
git revert -n <hash> # prepara reversão na staging (sem commitar)git remote -v
git remote set-url origin git@github.com:<usuario>/<repo>.git
git remote set-url origin git@gitlab.com:<usuario>/<repo>.git.gitkeep: arquivo “sentinela” para versionar pastas vazias..gitignore: ignora arquivos/padrões (ex.:node_modules/,*.log,.env).
Criar rapidamente:curl -L -o .gitignore https://www.toptal.com/developers/gitignore/api/linux,macos,windows,python,node
git reflog: “caixa-preta” do HEAD — recuperar hashes perdidos após resets/rebases acidentais.
git clone git@github.com:<usuario>/<repo>.git
cd <repo>
git switch -c feature/docs-git
echo "Guia de Git" > guia.md
git add guia.md
git commit -m "Add guia.md com conceitos básicos"
git push --set-upstream origin feature/docs-gitgit fetch
git switch main
git merge origin/main# editar arquivos marcados com <<<<<<<, =======, >>>>>>>
git add arquivo-com-conflito.ext
git commit -m "Resolve conflito em arquivo-com-conflito.ext"git reset --soft HEAD~1
# ajuste arquivos/mensagem e faça novo commit
git commit -m "Mensagem corrigida"git reflog # encontre o hash anterior
git checkout <hash> -- caminho/arquivo.ext
# ou moderno:
git restore --source=<hash> -- caminho/arquivo.extgit add *→ pode ignorar ocultos; prefiragit add .ou nomes explícitos.git add/rm→ não existe; usegit add <arquivo>egit rm <arquivo>.git push --force→ prefira--force-with-lease(mais seguro).git checkout --para restaurar arquivos é legado; prefiragit restorequando possível.chmod 600 ~/.ssh/id_ed25519e não no.pub; a pública pode ser644.
