No Git, existe uma maneira de mesclar todas as alterações de um ramo para outro, mas esmagar para um único commit ao mesmo tempo?
Costumo trabalhar em um novo recurso em uma ramificação separada e confirma / envia regularmente - principalmente para backup ou para transferir o que estou trabalhando para outra máquina. Na maioria das vezes, esses commits dizem "Feature xxx WIP" ou algo redundante.
Depois que o trabalho estiver concluído e eu desejar mesclar a ramificação WIP novamente no mestre, eu gostaria de descartar todas essas confirmações intermediárias e ter apenas uma confirmação limpa.
Existe uma maneira fácil de fazer isso?
Como alternativa, que tal um comando que esmaga todos os commit em um branch desde o ponto em que ele foi ramificado?
rebase --squash
Encontrei! O comando Mesclar possui uma
--squash
opçãoneste ponto, tudo está mesclado, possivelmente em conflito, mas não comprometido. Então agora eu posso:
fonte
git add .
faz?git add .
adiciona todos os arquivos não ignorados no diretório atual, eu seria cauteloso ao pegar arquivos indesejados dessa maneira.git add .
você pode usargit add -u
para adicionar apenas arquivos que já foram adicionados à árvore.Experimente o
git rebase -i master
seu ramo de recursos. Você pode alterar todos, exceto um 'pick' para 'squash', para combinar os commits. Veja squashing confirma com rebaseFinalmente, você pode fazer a mesclagem da ramificação principal.
fonte
Usar
git merge --squash <feature branch>
como a resposta aceita sugere o truque, mas não mostra o ramo mesclado como realmente mesclado.Portanto, uma solução ainda melhor é:
<feature branch>
no acima usandogit merge --squash
Este wiki explica o procedimento em detalhes.
fonte
Eu criei meu próprio alias do git para fazer exatamente isso. Estou chamando
git freebase
! Ele pegará sua ramificação de recurso desarrumado e irrecuperável existente e a recriará para que ela se torne uma nova ramificação com o mesmo nome, com seus commits compactados em um commit e reestruturados no branch que você especificar (master por padrão). No final, ele permitirá que você use qualquer mensagem de confirmação que desejar para o seu ramo "freebased".Instale-o colocando o seguinte alias no seu .gitconfig:
Use-o na ramificação de recursos executando:
git freebase <new-base>
Eu só testei isso algumas vezes, então leia-o primeiro e verifique se deseja executá-lo. Como uma pequena medida de segurança, ele imprime o sha1 inicial, para que você possa restaurar sua ramificação antiga se algo der errado.
Vou mantê-lo no meu repositório dotfiles no github: https://github.com/stevecrozz/dotfiles/blob/master/.gitconfig
fonte
git merge --squash <feature branch>
é uma boa opção. O "git commit" informa todas as mensagens de confirmação do ramo de recursos com sua escolha para mantê-lo.Por menos consolidação de consolidação.
git merge faça x vezes --git reset HEAD ^ --soft e git commit.
Arquivos excluídos por risco podem voltar.
fonte
Você pode fazer isso com o comando "rebase". Vamos chamar os ramos "principal" e "recurso":
O comando rebase repetirá todas as confirmações no "recurso" como uma confirmação com um pai igual a "principal".
Você pode executar
git merge main
antesgit rebase main
se "main" mudou desde que o "feature" foi criado (ou desde a mesclagem mais recente). Dessa forma, você ainda tem seu histórico completo caso tenha um conflito de mesclagem.Após a reformulação, você pode mesclar sua ramificação para principal, o que resultará em uma mesclagem de avanço rápido:
Consulte a página de rebase de Entendendo o Git conceitualmente para obter uma boa visão geral.
fonte