Lazygit — operações intermediárias
TL;DR
Lazygit transforma operações git delicadas em fluxos visuais: rebase interativo (painel Commits,
ipara todos os commits da branch ouea partir de commit específico), cherry-pick (Ccopy uppercase na branch origem +Vpaste uppercase na branch destino), staging por hunks (enterem arquivo no painel Files →spaceem hunk;aalterna modo hunk ↔ linha;tabtroca staged/unstaged), reflog acessível pela aba Reflog no painel Branches (]/[), merge conflicts detectados automaticamente comenterno arquivoUUabrindo conflict view. Keybindings verificados contraKeybindings_en.mdoficial (Lazygit main branch, 2026-05).
O que é / Como funciona
Rebase interativo
O rebase interativo permite reorganizar, editar, combinar ou remover commits antes de um push ou PR.
Dois pontos de entrada no painel Commits:
i— “Start interactive rebase”: inicia rebase pra todos os commits da branch a partir do primeiro merge commit ou commit de branch principal. Mostra lista editável.e— “Edit (start interactive rebase)”: inicia a partir do commit selecionado. Se já estiver em rebase, marca o commit para edição (rebase pausa nesse commit).
Durante o rebase, cada commit recebe ações aplicadas pelas teclas abaixo (painel Commits):
| Tecla | Ação | Detalhe |
|---|---|---|
s | Squash | Combina com o commit abaixo; mensagem do commit atual é anexada |
f | Fixup | Combina com o commit abaixo; mensagem do commit atual é descartada |
d | Drop | Remove o commit |
r | Reword | Edita apenas a mensagem do commit |
e | Edit | Pausa o rebase nesse commit pra permitir alterações manuais |
p | Pick | Mantém o commit como está (usado pra desfazer squash/drop mid-rebase) |
<c-k> | Mover commit acima | Reordena o commit uma posição para cima |
<c-j> | Mover commit abaixo | Reordena o commit uma posição para baixo |
Após marcar as ações:
m(global) — “View merge/rebase options” → Continue pra aplicar o rebase<esc>— Abort (cancela e reverte)
Obs:
<c-k>e<c-j>usam Ctrl — confira no?contextual caso seu terminal intercepte Ctrl+J/K.
Cherry-pick cross-branch
Cherry-pick copia 1 ou mais commits de uma branch pra outra sem fazer merge completo.
Fluxo no Lazygit:
- Painel Branches → checkout da branch origem (
space) - Painel Commits →
C(uppercase) no commit desejado → commit marcado como “copied” (cor diferente) - Repetir
Cem outros commits se necessário (seleção acumulativa) - Painel Branches → checkout da branch destino (
space) - Painel Commits →
V(uppercase) — “Paste (cherry-pick)” — aplica os commits copiados
Para cancelar a seleção de cherry-pick antes de colar: <c-r> no painel Commits.
Se houver conflito após o paste, o fluxo é o mesmo de merge conflict (ver seção abaixo).
Staging por hunks
Permite commitar apenas parte das mudanças de um arquivo — útil para commits atômicos.
- Painel Files →
enterem arquivo modificado → entra na staging view (main panel) <left>/<right>navega entre hunksspace— stage/unstage o hunk ou linha selecionadaa— alterna modo: hunk (bloco inteiro) ↔ linha (granularidade individual)v— “Toggle range select”: seleciona intervalo de linhas pra stage em lotetab— alterna entre lado unstaged e staged<esc>— retorna ao painel Files
O arquivo no painel Files pode aparecer como parcialmente staged (split entre staged e unstaged).
Discard
dno painel Files → menu com opções de discard (arquivo selecionado ou tudo)- Confirma antes de executar, mas mudanças uncommitted não aparecem no reflog — se descartadas, não há recuperação fácil via git
- Hábito recomendado:
s(stash) antes de discardar, pra ter ponto de retorno
Reflog
O reflog registra todos os movimentos de HEAD: commits, checkouts, resets, rebases, merges.
Acesso no Lazygit:
- Painel Branches (
3) → aba Reflog via](próxima aba) até chegar; ou[(anterior) - O painel Branches tem abas: Local → Remotes → Tags → Reflog
Dentro da aba Reflog:
j/knavega entre entradasspace— checkout da entrada como detached HEADg— “Reset” — reset do HEAD atual pra essa entrada (soft/mixed/hard)n— cria branch a partir da entradaC— cherry-pick de entrada do reflog
Útil pra:
- Recuperar branch deletada (encontrar o SHA antes da deleção, criar branch a partir dele)
- Desfazer reset acidental (
g→ hard reset de volta) - Ver exatamente o que mudou no HEAD ao longo do tempo
Limitação: reflog cobre apenas movimentos de HEAD. Changes uncommitted (working tree não commitada) não aparecem.
Merge conflicts
Após git merge, git rebase ou cherry-pick com conflito, Lazygit detecta automaticamente.
- Painel Files mostra arquivos com status
UU(both modified, unresolved) enterem arquivoUU→ conflict view no main panel- Navegar conflitos:
<left>/<right>(conflito anterior/próximo),<up>/<down>(hunk anterior/próximo) space— “Pick hunk”: escolhe o hunk atual (ours ou theirs)b— “Pick all hunks”: aceita todos de uma vezz— “Undo”: desfaz última resolução de conflito- Após resolver todos, arquivo sai de
UU - Stagear e continuar com
m→ Continue
Na prática
Workflow “limpar history antes de PR”
Objetivo: transformar vários commits de rascunho em commits limpos e atômicos.
1. Painel Commits → `i` (start interactive rebase pra todos os commits da branch)
2. Commits de rascunho/wip: pressionar `f` (fixup) — sem mensagem — ou `s` (squash) — combina mensagem
3. Reordenar com <c-k>/<c-j> se necessário
4. Commits pra remover totalmente: `d` (drop)
5. `m` → Continue → Lazygit aplica o rebase
6. Push com force-with-lease (via custom command ou git CLI: git push --force-with-lease)Push com
Ppode falhar após rebase — os SHAs mudaram; remoto rejeita. Ver Armadilha 1.
Workflow “trazer hotfix de main pra feature”
Objetivo: aplicar um fix já commitado em main na branch de feature, sem rebase completo.
1. Painel Branches → checkout main (ou a branch que tem o fix)
2. Painel Commits → localizar o commit do hotfix
3. `C` (uppercase) no commit → marcado como "copied"
4. Painel Branches → checkout feature
5. Painel Commits → `V` (uppercase) → cola o commit
6. Conflito? Painel Files → `enter` em arquivo UU → resolver hunks com `space` → `m` → ContinueWorkflow “stage parcial pra commit atômico”
Objetivo: arquivo tem 2 mudanças não-relacionadas; commitar em commits separados.
1. Painel Files → `enter` no arquivo → staging view
2. Hunk 1 (mudança A): `space` → staged
3. Hunk 2 (mudança B): não pressionar `space` → permanece unstaged
4. `<esc>` → volta ao painel Files
5. `c` → escreve mensagem do commit A → confirma
6. Painel Files ainda mostra arquivo com mudança B unstaged
7. `enter` → staging view → `space` em hunk 2 → `c` → commit BPra granularidade de linha (mudanças no mesmo hunk):
1. `enter` no arquivo → staging view
2. `a` → alterna pra modo linha (line-by-line)
3. `j`/`k` navega linhas; `space` stage linha individual
4. `<esc>` → commit parcialArmadilhas
1. Rebase com commit já pushado vira force-push
- Causa: rebase interativo altera SHA de todos os commits rebaseados; remoto já tem os SHAs antigos.
- Sintoma:
P(push) falha com “non-fast-forward” ou “rejected — remote contains work you don’t have”. - Como detectar: após rebase, tentar push normal; falha indica divergência de SHAs.
- Solução: usar
--force-with-lease(preferível a--force) via custom command (nota 06) ou git CLI. Confirmar antes que a branch não é shared com outros devs ou é branch pessoal de feature.
2. Discard apaga changes uncommitted sem recuperação via reflog
- Causa:
dno painel Files com changes uncommitted; working tree não tem reflog no git. - Sintoma: mudanças desaparecem;
git reflognão mostra nada;git stash listvazio. - Como detectar: git só rastreia objetos commitados; changes nunca commitadas não têm SHA.
- Solução: hábito de usar
s(stash) ouF(create fixup commit) antes de qualquer operação destrutiva.git fsck --lost-foundpode recuperar blobs dangling em edge cases, mas não é garantia.
3. Cherry-pick com conflito deixa operação pendente
- Causa:
Vpaste em branch destino com conflito; Lazygit entra em estado “cherry-pick in progress”. - Sintoma: painel Files mostra
UU; painel superior indica operação em andamento. - Como detectar: painel de status no topo do Lazygit exibe a operação ativa;
git statusmostra “You are currently cherry-picking”. - Solução: resolver conflitos normalmente (seção Merge conflicts acima) e
m→ Continue; oum→ Abort pra cancelar o cherry-pick inteiro.
4. Reflog não cobre changes uncommitted
- Causa: reflog rastreia movimentos de HEAD (commits, checkouts, resets) — não o working tree.
- Sintoma: discardou mudanças uncommitted; reflog não tem entrada; perdido.
- Como detectar:
git reflognão mostra;git stash listnão tem entrada. - Solução: se a mudança foi commitada ao menos uma vez (mesmo como WIP), está no reflog. Se nunca commitada,
git fsck --lost-foundpode achar objetos dangling. Prevenção: stash antes de operações destrutivas.
5. Staging por hunks stage mais que o esperado em modo hunk
- Causa:
spaceem modo hunk (padrão) stage o bloco contíguo inteiro, não só a linha sob o cursor. - Sintoma: painel Files mostra mais linhas staged que o esperado;
tabpara lado staged confirma. - Como detectar:
tabalterna pra visão staged e mostra o que vai no próximo commit. - Solução:
ana staging view alterna para modo linha (line-by-line);spacepassa a agir por linha individual.ade novo volta pro modo hunk.
6. <c-j>/<c-k> interceptados pelo terminal
- Causa: alguns emuladores (kitty, etc.) ou multiplexers (Zellij, tmux) capturam Ctrl+J/K antes de chegar ao Lazygit.
- Sintoma: reordenação de commits não funciona; nada acontece ou ação errada.
- Como detectar:
?no painel Commits mostra os keybindings ativos no contexto; se não aparecer, há conflito. - Solução: configurar o emulador/multiplexer pra não interceptar essas sequências, ou configurar
customKeybindingsno~/.config/lazygit/config.yml(nota 04) pra remapear reorder.
Em inglês
- rebase interativo — interactive rebase. “reescrever histórico de commits: squash, drop, reorder, sem mover pra outro branch.”
- cherry-pick — cherry-pick. “copiar commit(s) específicos de uma branch pra outra sem merge completo.”
- hunk — hunk. “bloco contíguo de linhas alteradas num diff; unidade de staging parcial no Lazygit.”
- stage — stage / index. “marcar mudança pra incluir no próximo commit; staging view permite fazer isso por hunk ou por linha.”
- discard — discard. “descartar mudança uncommitted do working tree; irreversível se não houver stash ou commit prévio.”
- reflog — reflog (reference log). “registro de todos os movimentos de HEAD; útil pra recuperar branch deletada ou desfazer reset acidental.”
- conflito — merge conflict. “duas branches modificaram o mesmo trecho de código de formas incompatíveis; git não consegue resolver sozinho.”
- squash — squash. “combinar commit com o commit abaixo, unindo as mudanças e as mensagens.”
- fixup — fixup. “variante do squash onde a mensagem do commit corrente é descartada; útil pra WIP commits.”
- force-push — force-push. “push que sobrescreve o histórico remoto; necessário após rebase de commits já publicados; prefira
--force-with-lease.”
Veja também
- 01 - Lazygit — overview e operações essenciais — pré-req: painéis, layout, operações básicas
- 04 - Lazygit — config e customização —
editPresetpra conflict resolution externa, custom keybindings - 06 - Lazygit — operações avançadas — bisect, customCommands, worktrees
- MOC do galho
- Trilha Terminal
- cherry-pick, hunk, interactive rebase, reflog
Referências
- Lazygit Keybindings (oficial): https://github.com/jesseduffield/lazygit/blob/master/docs/keybindings/Keybindings_en.md
- Lazygit Rebasing: https://github.com/jesseduffield/lazygit/blob/master/docs/Rebasing.md