- 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:
git add $FILES_YOU_FIXED
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
- Adicione com
git add as alterações que deseja absorver
- Execute
git absorb
- Se estiver satisfeito com o resultado, execute
git rebase -i --autosquash
- 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
Comentários do Hacker News
Quem usa
git absorbacha a ferramenta muito útilgit absorbencontra automaticamente o commit corretoEstá satisfeito usando um alias para
git commit --fixupJá usou
git absorb, mas ele frequentemente escolhia o commit pai erradoNunca usou
git --fixupegit rebase --autosquash, mas parecem úteisgit-absorbparece ir um passo alémÉ cético quanto a editar commits e o histórico
Dá para criar commits de fixup facilmente com
magitDescobriu
git commit --fixupegit rebase --autosquashgit rebase -iatende a várias necessidadesNão entende a obsessão com um histórico de commits superlimpo
Não entende a ideia de escolher entre os últimos 10 commits um commit editável sem conflitos
fixup^com frequênciaEsse comentário me pegou. Testei um pouco
fixup/autosquash, mas bateu aquela sensação de vazio pensando se só eu me importo com isso...