Git e Linux Basico - Primeiros Passos com Controle de Versao

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)

  1. Instalar: sudo apt install git
  2. Configurar: git config --global user.name / user.email
  3. Inicializar: git init ou git clone <url>
  4. Iterar: git status -> git add -> git commit -m "..."
  5. 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 pull executa 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.

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 --force em um commit compartilhado (reescreve o historico de todos)
  • git reset --hard sem confirmar (trabalho nao commitado desaparece)
  • Commitar .env, chaves privadas ou tokens de autenticacao (muito dificil de remover do historico)
  • --no-verify para pular hooks (engole silenciosamente falhas de lint ou testes)

Proximas Leituras