Tenho oito commits em um ramo que gostaria de enviar por e-mail para algumas pessoas que ainda não estão esclarecidas. Até agora, tudo o que faço me fornece 8 arquivos de patch ou começa a fornecer arquivos de patch para todos os commit no histórico do ramo, desde o início dos tempos. Usei o git rebase --interactive para esmagar os commits, mas agora tudo o que tento me dá zilhões de patches desde o início dos tempos. O que estou fazendo de errado?
git format-patch master HEAD # yields zillions of patches, even though there's
# only one commit since master
git
patch
squash
git-squash
skiphoppy
fonte
fonte
Respostas:
Eu recomendo fazer isso em um ramo descartável da seguinte maneira. Se seus commits estão na ramificação "newlines" e você já voltou para a ramificação "master", isso deve fazer o truque:
Espero que isto ajude!
fonte
git comit -m "My squashed commits"
caso contrário, seria adicionar outros arquivos untrackedgit checkout 775ec2a && git checkout -b patch && git merge --squash branchname
Apenas para adicionar mais uma solução ao pote: Se você usar isso:
Ainda haverá 8 patches ... mas todos eles estarão em um único arquivo de patches e serão aplicados como um:
fonte
git rebase -i ...
esmagá-las e reduzi-las a uma.Eu sempre uso git diff, então no seu exemplo, algo como
fonte
git log
, veja a minha resposta para um exemploEsta é uma adaptação da resposta de Adam Alexander, caso suas alterações estejam no ramo principal. Faça o seguinte:
fonte
Como você já sabe, a
git format-patch -8 HEAD
fornecerá oito patches.Se você deseja que seus 8 commits apareçam como um e não se importe em reescrever o histórico de sua ramificação (
o-o-X-A-B-C-D-E-F-G-H
), você pode:ou, e seria uma solução melhor, repita todas as suas 8 confirmações de
X
(a confirmação antes de suas 8 confirmações) em uma nova ramificaçãoDessa forma, você só tem um commit na ramificação "delivery" e representa todos os seus últimos 8 commits
fonte
git merge master
apenas faz um avanço rápido e não se esmaga em um. Altere paragit merge --squash master
obter todos os commits compactados e visíveis na área preparada. Seu fluxo funcionará com essa alteração. (Estou usando git versão 2.1.0.)Patch de formato entre duas tags:
fonte
A maneira mais fácil é usar
git diff
e adicionargit log
se você quiser a mensagem de confirmação combinada que o método squash produziria. Por exemplo, para criar o patch entre commitabcd
e1234
:Então, ao aplicar o patch:
Não se esqueça do
--binary
argumento aogit diff
lidar com arquivos que não são de texto, como imagens ou vídeos.fonte
Com base na resposta de Adam Alexander:
fonte