Como usar o git merge -- squash?
Eu tenho um servidor Git remoto, aqui está o cenário que eu quero executar:
para cada bug/funcionalidade eu crio um ramo Git diferente
continuo a cometer o meu código naquele git branch com mensagens não oficiais do Git.
no repositório de topo temos que fazer um commit para um bug com mensagem git oficial
Então como posso fundir o meu ramo para o ramo remoto para que eles obtenham apenas um commit para todos os meus check-ins (eu até quero para fornecer a mensagem de commit para isso)?
6 answers
Diz que o teu ramo de correcção de erros se chama bugfix
e que queres fundi-lo em master
:
git checkout master
git merge --squash bugfix
git commit
Isto irá tirar todos os commits do ramo bugfix
, esmagá-los em 1 commit, e fundi-los com o seu ramo master
.
Anotações:
git checkout master
Muda para o teu ramo master
.
git merge --squash bugfix
Pega em todos os commits do ramo bugfix
e junta-os com o seu ramo actual.
git commit
Cria um único commit a partir da fusão alteracao.
Omitir o parâmetro -m
permite-lhe modificar uma mensagem de persistência que contém todas as mensagens dos seus commits esmagados antes de finalizar o seu commit.
Queres fundir-te com a opção squash. Isso se quiseres fazer um ramo de cada vez.
git merge --squash feature1
Se quiser fundir todos os ramos ao mesmo tempo que um único commits, então primeiro rebase interactivamente e esmaga cada característica, em seguida, polvo se funde:
git checkout feature1
git rebase -i master
Squash em um commit, em seguida, repetir para as outras características.
git checkout master
git merge feature1 feature2 feature3 ...
A última fusão é uma fusão de polvo porque está a fundir muitos ramos ao mesmo tempo.
Espero que isto ajude.
O que finalmente esclareceu isto para mim foi um comentário mostrando que:
git checkout main
git merge --squash feature
É o equivalente a fazer:
git checkout feature
git diff main > feature.patch
git checkout main
patch -p1 < feature.patch
git add .
Quando quero fundir uma ramificação com 105(!!) compromete-se e tê-los todos esmagado em um, eu não quero git rebase -i origin/master
porque eu preciso separadamente resolver conflitos de mesclagem para cada do intermediário compromete-se (ou pelo menos aqueles que o git não consegue descobrir em si). Usar git merge --squash
dá-me o resultado que eu quero, de um único commit para me fundir um ramo inteiro. E só preciso de fazer no máximo uma resolução manual de conflitos.
Se já tiver git merge bugfix
em main
, pode esmagar o seu commit de junção em um com:
git reset --soft HEAD^1
git commit
Juntar newFeature
ramo em master
com uma persistência personalizada:
git merge --squash newFeature && git commit -m 'Your custom commit message';
Se em vez disso, você faz
git merge --squash newFeature && git commit
Você vai receber uma mensagem de commit que irá incluir todos os commits newFeature
branch, que você pode personalizar.
Para Git
Criar uma nova funcionalidade
Via Terminal/Shell:
git checkout origin/feature/<featurename>
git merge --squash origin/feature/<featurename>
Isto não o commit, permite-lhe revê-lo primeiro.
Em seguida, commit, e terminar a funcionalidade deste novo ramo, e excluir/ignorar o antigo (o que você fez dev on).