Git & GitHub
para o dev indie
Do zero ao push. Mac e Windows. Sem enrolação.
No Mac, a forma mais fácil é pelo Homebrew. Se não tiver instalado ainda:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
Depois instale o Git e o gh (CLI oficial do GitHub):
brew install git brew install gh
Verifique que funcionou:
git --version gh --version
Baixe e instale o Git for Windows em git-scm.com — marque a
opção "Git Bash" durante a instalação.
Depois baixe o GitHub CLI em cli.github.com (instalador .msi).
Abra o Git Bash ou o Prompt de Comando e verifique:
git --version gh --version
Configure seu nome e e-mail — isso aparece em todos os seus commits:
git config --global user.name "Seu Nome" git config --global user.email "seu@email.com"
Agora faça login no GitHub via terminal com o gh:
gh auth login
Um menu interativo vai aparecer. Escolha assim:
> GitHub.com
> HTTPS
> Yes (autenticar com credencial git)
> Login with a web browser
Para verificar se está logado:
gh auth status
Você tem uma pasta com arquivos e quer transformá-la em repositório no GitHub:
# Entre na pasta do projeto cd ~/meu-projeto # Inicie o git local git init # Adicione os arquivos e faça o primeiro commit git add . git commit -m "primeiro commit" # Crie o repo no GitHub e suba tudo de uma vez # --public → repositório público # --private → repositório privado gh repo create meu-projeto --public --source=. --remote=origin --push
--push já conecta e envia tudo automaticamente. Sem ele,
você precisaria fazer o push manualmente depois.Opção 1 — clonar (recomendado quando o repo está vazio ou só tem README):
# Baixa a pasta já conectada ao GitHub git clone https://github.com/seu-usuario/nome-do-repo.git # Entre na pasta cd nome-do-repo # Agora é só trabalhar e fazer push normalmente
Opção 2 — conectar uma pasta que já existe localmente:
# Na pasta do projeto:
git init
git remote add origin https://github.com/seu-usuario/nome-do-repo.git
git branch -M main
git add .
git commit -m "primeiro commit"
git push -u origin main
# Público (qualquer pessoa pode ver) gh repo create meu-projeto --public --source=. --remote=origin --push # Privado (só você e convidados) gh repo create meu-projeto --private --source=. --remote=origin --push # Mudar visibilidade depois gh repo edit --visibility public gh repo edit --visibility private
É um arquivo de texto na raiz do projeto que diz ao Git: "ignore esses arquivos, não
os mande pro GitHub". Serve para não versionar coisas desnecessárias ou
perigosas — senhas, tokens de API, arquivos gerados automaticamente, pastas pesadas como
node_modules.
Como criar no terminal:
# Mac touch .gitignore # Windows (PowerShell) New-Item .gitignore
Exemplo de conteúdo para um projeto Node.js:
# dependências node_modules/ # variáveis de ambiente e segredos .env .env.local # gerado automaticamente pelo Mac .DS_Store # build dist/ build/ # logs *.log .cache/
git rm --cached nome-do-arquivoÉ o primeiro arquivo que as pessoas veem no GitHub. Um bom README tem: o que é, como instalar, como usar, e de que plataformas funciona. Exemplo de estrutura:
# Nome do Projeto
Descrição curta e clara do que faz.
## Instalação
```bash
brew install meu-tool
```
## Como usar
```bash
meu-tool arquivo.html --watch
```
## Plataformas suportadas
- macOS Apple Silicon (M1/M2/M3)
- macOS Intel
- Linux x64
## Licença
MIT
meu-projeto/ ├── src/ │ └── main.cr # código fonte ├── .gitignore # o que ignorar ├── .github/ │ └── workflows/ │ └── release.yml # GitHub Actions └── README.md # documentação
GitHub Actions é um robô automático que o GitHub executa por você. Você define: "quando acontecer X, execute Y". Por exemplo: toda vez que você criar uma nova versão (tag), ele compila o projeto para Mac ARM, Mac Intel e Linux, e já cria um release com os binários automaticamente.
Os arquivos ficam em .github/workflows/nome.yml e são escritos em
YAML — um formato de texto com indentação que representa listas e valores.
name: Release
on:
push:
tags:
- 'v*' # dispara quando você faz push de uma tag tipo v1.0.0
jobs:
build-macos-arm64:
runs-on: macos-26 # Mac Apple Silicon (M1/M2/M3)
steps:
- uses: actions/checkout@v4
- uses: crystal-lang/install-crystal@v1
- run: crystal build src/main.cr -o easybrawto-macos-arm64 --release
- uses: actions/upload-artifact@v4
with:
name: easybrawto-macos-arm64
path: easybrawto-macos-arm64
build-macos-x64:
runs-on: macos-26-intel # Mac Intel (macOS 26 Tahoe)
steps:
- uses: actions/checkout@v4
- uses: crystal-lang/install-crystal@v1
- run: crystal build src/main.cr -o easybrawto-macos-x64 --release
- uses: actions/upload-artifact@v4
with:
name: easybrawto-macos-x64
path: easybrawto-macos-x64
build-linux-x64:
runs-on: ubuntu-latest # Linux x64
steps:
- uses: actions/checkout@v4
- uses: crystal-lang/install-crystal@v1
- run: crystal build src/main.cr -o easybrawto-linux-x64 --release
- uses: actions/upload-artifact@v4
with:
name: easybrawto-linux-x64
path: easybrawto-linux-x64
release:
needs: [build-macos-arm64, build-macos-x64, build-linux-x64]
runs-on: ubuntu-latest
permissions:
contents: write # permissão para criar o release
steps:
- uses: actions/download-artifact@v4
- uses: softprops/action-gh-release@v1
with:
files: |
easybrawto-macos-arm64/easybrawto-macos-arm64
easybrawto-macos-x64/easybrawto-macos-x64
easybrawto-linux-x64/easybrawto-linux-x64
Gatilho
on: push: tags: - 'v*' — o workflow roda quando você faz push de
qualquer tag que começa com v, como v1.0.0 ou
v2.3.1.
Jobs paralelos
Cada build-* roda em paralelo em máquinas diferentes do GitHub. O job
release usa needs: para esperar todos terminarem.
runs-on
macos-26 = Apple Silicon · macos-26-intel = Intel ·
ubuntu-latest = Linux x64. São VMs gratuitas do GitHub.
upload / download artifact
Os binários compilados são salvos como "artifacts" entre jobs. O job
release baixa todos e anexa ao release do GitHub.
# Crie as pastas necessárias mkdir -p .github/workflows # Crie o arquivo (Mac) touch .github/workflows/release.yml # Cole o conteúdo YAML, depois: git add .github/workflows/release.yml git commit -m "add: workflow de release automático" git push
Para disparar o release, crie uma tag e faça push:
# Crie a tag (ex: v1.0.0) git tag v1.0.0 # Envie a tag para o GitHub — isso aciona o Actions git push origin v1.0.0
# 1. Adicionar mudanças ao próximo commit git add . # 2. Salvar um ponto no histórico com descrição git commit -m "descreva o que mudou aqui" # 3. Enviar para o GitHub git push
add = selecionar o que vai · commit
= salvar localmente com uma descrição · push = enviar para o GitHub.git add . — tudo de uma vez
git add .
Use quando suas mudanças são relacionadas e você quer commitar tudo junto. É o mais comum no dia a dia.
git add arquivo — só um arquivo
git add src/main.cr git add README.md
Use quando você mexeu em vários arquivos mas quer commits separados e organizados — um commit por funcionalidade.
git status para ver o que mudou. Para ver
o que mudou linha a linha: git diffNão tem regra rígida — mas boas práticas para dev indie:
Ao final de cada sessão de trabalho — funciona como um "salvar na nuvem"
Quando terminar uma funcionalidade ou correção, mesmo que pequena
Antes de fazer mudanças grandes — garante um ponto de retorno seguro
Antes de criar uma release (tag de versão)
# Ver o status da pasta (o mais usado de todos) git status # Ver histórico de commits resumido git log --oneline # Ver o que mudou linha a linha git diff # Criar uma branch nova (para features experimentais) git checkout -b nome-da-feature # Voltar para a branch principal git checkout main # Criar tag de versão e enviar (aciona o Actions) git tag v1.0.0 git push origin v1.0.0 # Ver repositórios remotos conectados git remote -v # Ver seus repos no GitHub via terminal gh repo list # Abrir o repositório no navegador direto do terminal gh repo view --web
O GitHub tem commits que você não tem localmente. Acontece quando você (ou outra pessoa) fez push de outro lugar.
git pull --rebase origin main git push
Você tentou dar push mas ainda não fez nenhum commit. O Git não tem nada para enviar.
git add . git commit -m "primeiro commit" git push -u origin main
Token expirou ou você não está logado. Refaça o login:
gh auth login
git add arquivo-esquecido git commit --amend --no-edit
--amend se ainda não tiver dado push. Depois do
push, o amend causa problemas de histórico divergente.# Os arquivos voltam para "staged" — só o commit é desfeito
git reset --soft HEAD~1
# Adicione ao .gitignore e remova do rastreamento
echo "arquivo-grande.zip" >> .gitignore
git rm --cached arquivo-grande.zip
git commit -m "remove arquivo grande do rastreamento"
git push
git log --oneline --graph --all
git clone --branch nome-da-branch https://github.com/usuario/repo.git
Cole sempre a mensagem de erro completa. A IA não consegue adivinhar o que deu errado sem ver o erro exato. Quanto mais contexto você der, mais precisa será a resposta.
Para erros no terminal
Para criar .gitignore
Para escrever o README
Para erros no GitHub Actions
Para entender um comando
Vá no seu repositório no GitHub → clique na aba Actions
Clique no run que falhou (ícone vermelho)
Clique no job com erro → expanda o step que falhou
Copie esse log inteiro e cole na IA
gh run list
para ver os runs e gh run view --log para ver o log do último run.# Ver runs do Actions no terminal gh run list # Ver log do último run com falha gh run view --log-failed