Git e Linux Basico - Primeiros Passos com Controle de Versao
O Que Voce Vai Aprender
- Configurar o Git no Linux com a configuracao minima viavel
- Dominar o fluxo principal:
git init/add/commit/push - Evitar armadilhas especificas do Linux (permissoes, quebras de linha, exec bit)
- Enviar para o GitHub ou GitLab via autenticacao com chave SSH
Caminho Rapido (5 passos)
- Instalar:
sudo apt install git - Configurar:
git config --global user.name / user.email - Inicializar:
git initougit clone <url> - Iterar:
git status->git add->git commit -m "..." - Compartilhar:
git remote add->git push -u origin main
Ambiente Assumido
- Ubuntu / Linux baseado em Debian (22.04 ou posterior)
- bash ou zsh
- GitHub / GitLab / Git auto-hospedado via SSH
1. Instalar e Configurar
1-1. Instalar o Git
$ sudo apt update $ sudo apt install -y git $ git --version
git version 2.43.0
RHEL / Fedora: sudo dnf install git. macOS: brew install git.
1-2. Definir Configuracao Global (unica vez)
$ git config --global user.name "Your Name" $ git config --global user.email "you@example.com" $ git config --global init.defaultBranch main
init.defaultBranch main faz novos repositorios usarem main automaticamente (o padrao desde que o GitHub adotou em 2020).
1-3. Verificar Configuracao
$ git config --list --global
--global grava em ~/.gitconfig. Para sobrescrever por repositorio, execute o mesmo comando sem --global dentro do repositorio (salvo em .git/config).
2. Criar ou Clonar um Repositorio
2-1. Inicializar um Diretorio Existente
$ cd ~/projects/myapp $ git init $ ls -la .git
O diretorio esta sob controle do Git assim que .git/ e criado. Normalmente voce nunca precisa edita-lo diretamente.
2-2. Clonar um Remoto
# HTTPS (simples, mas requer PAT) $ git clone https://github.com/user/repo.git # SSH (recomendado depois que as chaves estiverem configuradas) $ git clone git@github.com:user/repo.git $ cd repo
O GitHub descontinuou a autenticacao por senha HTTPS em 2021. Agora voce precisa de um Personal Access Token (PAT) para HTTPS. SSH e mais pratico para uso diario (veja a secao 6 para configuracao).
3. Fluxo Principal: status -> add -> commit
O trabalho diario com Git e o loop "ver alteracoes -> inclui-las -> snapshot."
3-1. Verificar o Estado
$ git status
On branch main
Untracked files:
(use "git add <file>..." to include in what will be committed)
README.md
3-2. Adicionar Alteracoes ao Stage
$ git add README.md # arquivo unico $ git add src/ # diretorio inteiro $ git add -p # interativo, trecho por trecho
git add . e conveniente, mas facilmente inclui segredos como .env. Sempre execute git status primeiro.
3-3. Commit (Salvar o Snapshot)
$ git commit -m "Add README"
[main (root-commit) abc1234] Add README 1 file changed, 5 insertions(+) create mode 100644 README.md
Modelo mental
status= "qual e o estado atual?"add= "inclua isso no proximo commit"commit= "congele este snapshot"
4. Ver Historico: log / diff
4-1. Historico de Commits
$ git log --oneline --graph --decorate -10
* abc1234 (HEAD -> main) Add README * def5678 Initial commit
Um alias pratico para uso diario:
$ git config --global alias.lg "log --oneline --graph --decorate --all -20" $ git lg
4-2. Diffs
$ git diff # arvore de trabalho vs stage $ git diff --staged # stage vs HEAD $ git diff HEAD~1 HEAD # commit anterior vs atual $ git diff main..feature # entre branches
4-3. Historico de Arquivo
$ git log --follow -p src/index.js
--follow rastreia o arquivo mesmo apos renomeacoes.
5. Trabalhar com Remotos: push / pull
5-1. Adicionar um Remoto
$ git remote add origin git@github.com:user/repo.git $ git remote -v
origin git@github.com:user/repo.git (fetch) origin git@github.com:user/repo.git (push)
5-2. Primeiro Push
$ git push -u origin main
-u (--set-upstream) permite omitir origin main nos comandos git push / git pull subsequentes.
5-3. pull / fetch
$ git pull # fetch + merge automaticamente $ git fetch # baixar sem fazer merge $ git log HEAD..origin/main # mostrar o que esta a frente
Acidente comum com pull em trabalho em equipe
git pullexecuta um merge automatico, entao conflitos com alteracoes locais sao faceis de provocar.- Quando nao tiver certeza, divida em tres passos:
git fetch->git log HEAD..origin/main->git merge. - Para workflow com rebase, considere
git config --global pull.rebase true.
6. Configurar Autenticacao com Chave SSH
6-1. Gerar um Par de Chaves
$ ssh-keygen -t ed25519 -C "you@example.com" $ cat ~/.ssh/id_ed25519.pub
ed25519 e o padrao moderno -- rapido e compacto. Use -t rsa -b 4096 apenas para sistemas legados que nao suportam ed25519.
Sempre defina uma passphrase para limitar danos se a chave vazar. Carregue-a no ssh-agent para nao precisar digita-la toda vez.
6-2. Registrar a Chave Publica no GitHub / GitLab
Copie o conteudo de ~/.ssh/id_ed25519.pub (o arquivo .pub) e adicione em Settings -> SSH and GPG keys. Nunca compartilhe a chave privada id_ed25519.
6-3. Testar a Conexao
$ ssh -T git@github.com
Hi user! You've successfully authenticated, but GitHub does not provide shell access.
Esta mensagem significa sucesso (o codigo de saida e 1, mas isso e esperado).
7. .gitignore: Padroes Especificos do Linux
# SO / editores
.DS_Store
*~
.*.swp
.idea/
.vscode/
# Runtimes de linguagem
node_modules/
__pycache__/
*.pyc
target/
build/
dist/
# Segredos (mais importante)
.env
.env.*
*.key
*.pem
# Logs
*.log
logs/
O repositorio oficial github/gitignore tem templates especificos por linguagem. Em caso de duvida, copie de la.
Arquivos ja rastreados NAO sao excluidos pelo .gitignore
Se um arquivo foi commitado antes de ser adicionado ao .gitignore, o Git continua rastreando-o.
$ git rm --cached .env $ echo ".env" >> .gitignore $ git commit -m "Untrack .env"
Nota: isso apenas interrompe o rastreamento futuro. O arquivo permanece em commits anteriores. Se um segredo real vazou, voce precisa reescrever o historico (git filter-repo) e rotacionar as chaves.
8. Armadilhas Comuns Especificas do Linux
8-1. Permission Denied no Push
ERROR: Permission to user/repo.git denied to other-user. fatal: Could not read from remote repository.
Causas provaveis:
- A chave SSH nao esta registrada no GitHub
- Multiplas chaves estao carregadas e a chave da conta errada e usada primeiro
- Voce nao tem acesso de escrita (nao e colaborador)
Diagnostico:
$ ssh -T git@github.com # como qual usuario voce esta autenticado? $ ssh-add -l # listar chaves carregadas no ssh-agent
Para multiplas contas, use ~/.ssh/config para atribuir chaves por host.
8-2. Quebras de Linha Misturadas (CRLF / LF)
Arquivos vindos do Windows podem poluir o diff (arquivos inteiros aparecem alterados).
# No Linux / macOS: manter quebras de linha como estao (recomendado) $ git config --global core.autocrlf input
Para fixar a regra por repositorio, adicione .gitattributes:
* text=auto eol=lf *.sh text eol=lf *.bat text eol=crlf
8-3. O Bit de Execucao (chmod +x) Nao e Registrado
$ chmod +x scripts/deploy.sh $ git status # pode nao mostrar alteracao
Force o Git a registrar a mudanca de modo:
$ git update-index --chmod=+x scripts/deploy.sh $ git diff
old mode 100644 new mode 100755
Se core.fileMode = false esta definido no repositorio, o Git ignora mudancas de modo. Verifique com git config core.fileMode.
8-4. Diferencas de Caixa em Nomes de Arquivo
O sistema de arquivos Linux (ext4 etc.) e case-sensitive, mas macOS e Windows sao case-insensitive por padrao. Confundir Readme.md com README.md vai quebrar CI baseado em Linux.
# Detectar incompatibilidades de caixa no repositorio $ git config --global core.ignorecase false
Uma convencao de nomenclatura no CONTRIBUTING.md mais revisao de PR e a correcao realista.
9. Templates Seguros
Configuracao inicial
git init echo "node_modules/" > .gitignore git add README.md .gitignore git commit -m "Initial commit" git remote add origin git@github.com:user/repo.git git push -u origin main
Loop diario
git status git diff git add -p # revisar e adicionar trechos git commit -m "feat: explain the change" git push
Operacoes de desfazer (da menos a mais destrutiva)
git restore <file> # descartar alteracoes na arvore de trabalho git restore --staged <file> # remover do stage (conteudo do arquivo mantido) git commit --amend # corrigir o ultimo commit (apenas antes do push) git revert <commit> # criar um commit inverso (seguro apos compartilhar)
Nunca faca isso
git push --forceem um commit compartilhado (reescreve o historico de todos)git reset --hardsem confirmar (trabalho nao commitado desaparece)- Commitar
.env, chaves privadas ou tokens de autenticacao (muito dificil de remover do historico) --no-verifypara pular hooks (engole silenciosamente falhas de lint ou testes)