16 pontos por GN⁺ 2024-09-27 | 2 comentários | Compartilhar no WhatsApp
  • Uma versão portada para git do hg absorb, criado pelo Facebook
    • O hg absorb pode ser considerado uma das melhorias de fluxo de trabalho mais legais em sistemas de controle de versão nos últimos anos
    • Quando há alterações não commitadas no diretório de trabalho sobre um changeset de rascunho, ao executar hg absorb, as correções não commitadas são automaticamente absorvidas no changeset ancestral de rascunho apropriado
    • É possível realizar uma operação equivalente a hg histedit + "roll" sem criar commits nem definir manualmente regras de reescrita do histórico
    • O comando analisa as linhas modificadas, encontra o changeset que alterou essas linhas e modifica esse changeset para incluir as alterações não commitadas
    • Se não for possível aplicar as alterações sem conflito, elas permanecem sem commit
    • Esse fluxo de trabalho é muito útil para tarefas como aplicar feedback de revisão. Basta fazer as alterações nos arquivos e executar hg absorb, e o mapeamento entre mudanças e commits é organizado automaticamente. É quase mágico

Cenário de uso do git absorb

  • Você tem uma branch de feature com alguns commits
  • Um colega revisa a branch e aponta alguns bugs
  • Você tem correções para esses bugs, mas como acredita em commits atômicos, não quer colocar tudo em um commit opaco chamado fixes
  • Em vez de procurar manualmente o SHA do commit para git commit --fixup ou executar um rebase interativo manualmente, faça o seguinte:
    1. git add $FILES_YOU_FIXED
    2. git absorb --and-rebase
  • O git absorb identifica automaticamente quais commits podem ser corrigidos com segurança e a quais commits cada alteração staged pertence
  • Em seguida, ele cria commits fixup! para essas alterações
  • Com a flag --and-rebase, esses commits fixup são automaticamente incorporados aos commits correspondentes
  • Se você não confiar nisso, pode revisar a saída manualmente e depois usar o recurso embutido autosquash do git para incorporar os fixup à branch de feature

Instalação

  • É possível baixar e instalar os artefatos da release mais recente com tag
  • Há artefatos para Windows, MacOS e Linux

Como usar

  1. Adicione com git add as alterações que deseja absorver
  2. Execute git absorb
  3. Se estiver satisfeito com o resultado, execute git rebase -i --autosquash
  4. Se não estiver satisfeito, volte ao estado anterior com git reset --soft

How it works (roughly)

  • O git absorb verifica se dois patches, P1 e P2, são comutáveis
  • Por padrão, ele considera os últimos 10 commits
  • Para cada bloco no índice, ele verifica se esse bloco é comutável com o commit mais recente
  • Ao encontrar um commit não comutável, ele transforma esse bloco em um commit fixup

Configuration

Tamanho da pilha

  • Por padrão, ele considera os últimos 10 commits
  • Para considerar mais commits, defina o valor maxStack no .gitconfig

Um fixup por commit corrigível

  • Por padrão, ele cria um commit fixup separado para cada bloco absorvível
  • Com a flag -F, é possível criar apenas um commit fixup para todos os blocos absorvidos no mesmo commit

Auto-stage all changes if nothing staged

  • Por padrão, apenas arquivos staged são considerados
  • Para fazer stage automático de todas as alterações quando não houver nada staged, configure autoStageIfNothingStaged

Fixup target always SHA

  • Por padrão, a mensagem do commit fixup aponta para o resumo do commit de destino
  • Também é possível configurar para sempre apontar para o SHA do destino

TODO

  • Implementar uma flag de força
  • Implementar verificação da branch padrão remota
  • Adicionar uma pequena flag de força para desativar verificações de segurança individuais
  • Garantir que toda saída de erro seja útil para o usuário
  • Exibir mais logs em caso de sucesso
  • Adicionar mais testes
  • Documentar detalhes da pilha e da comutação
  • Adicionar mais casos de comutação
  • Implementar de forma a não carregar todos os blocos na memória ao mesmo tempo
  • Implementar bloqueio do índice para proteger contra modificações simultâneas

Resumo do GN⁺

  • git absorb é uma ferramenta portada do hg absorb do Facebook, que melhora o fluxo de trabalho de desenvolvimento ao corrigir commits automaticamente
  • É especialmente útil ao aplicar feedback de revisão, pois automatiza o processo sem exigir busca manual de commits ou correções manuais
  • Outra ferramenta com funcionalidade semelhante é o git-autofixup, que gera automaticamente commits de fixup com base na mensagem do commit
  • As vantagens são facilitar a incorporação de feedback de code review e manter um histórico de commits mais limpo. A desvantagem é que depender demais da automação pode gerar resultados inesperados

2 comentários

 
GN⁺ 2024-09-27
Comentários do Hacker News
  • Quem usa git absorb acha a ferramenta muito útil

    • Quando um PR com vários commits falha no CI, o git absorb encontra automaticamente o commit correto
    • Evita o incômodo de ter que localizar o commit manualmente
    • Quase não há falsos positivos, e quando há falsos negativos, dá para resolver manualmente
    • Há quem ache que um PR deveria ser um único commit, mas nem sempre é assim
    • No GitHub, prefere commits logicamente pequenos
  • Está satisfeito usando um alias para git commit --fixup

    • Mostra os commits da branch atual e permite selecionar um via fzf
    • Cria um commit de fixup com base no commit selecionado
  • Já usou git absorb, mas ele frequentemente escolhia o commit pai errado

    • Era melhor localizar o commit manualmente
    • Prefere ter controle total sobre o histórico de commits
    • A ferramenta parece mágica demais
  • Nunca usou git --fixup e git rebase --autosquash, mas parecem úteis

    • O git-absorb parece ir um passo além
    • No README, não fica claro exatamente o que ele fará em certas situações
  • É cético quanto a editar commits e o histórico

    • Melhor corrigir o erro, criar um novo commit e seguir em frente
  • Dá para criar commits de fixup facilmente com magit

    • Mesmo sem usar Emacs, vale a pena mantê-lo só para usar o magit
    • Para usuários de vscode, Edamagit é uma boa opção
  • Descobriu git commit --fixup e git rebase --autosquash

    • O git rebase interativo é sua ferramenta favorita do Git
    • Ajuda a criar commits atômicos lógicos perfeitos
    • Mas esse tipo de edição de histórico às vezes pode sair pela culatra
  • git rebase -i atende a várias necessidades

    • Permite fazer squash, fixup, reword e delete de commits de forma interativa
    • Todo mundo que usa git deveria aprender isso
  • Não entende a obsessão com um histórico de commits superlimpo

    • Questiona se as pessoas realmente inspecionam o histórico de commits em tanto detalhe com tanta frequência
  • Não entende a ideia de escolher entre os últimos 10 commits um commit editável sem conflitos

    • Muitas vezes resolve conflitos usando fixup^ com frequência
    • Não confia em selecionar automaticamente o commit de destino
 
roxie 2025-05-18
  • Não entendo essa obsessão por um histórico de commits ultra limpo
    • Fico em dúvida se as pessoas realmente revisam o histórico de commits com tanto detalhe e tanta frequência

Esse comentário me pegou. Testei um pouco fixup / autosquash, mas bateu aquela sensação de vazio pensando se só eu me importo com isso...