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)?

Author: naXa, 2011-03-15

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.

 1340
Author: abyx, 2018-04-24 16:23:18

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.
 88
Author: Adam Dymitruk, 2013-08-15 15:07:12

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.

 84
Author: dankohn, 2014-08-19 15:59:21

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
 20
Author: qwertzguy, 2015-03-13 17:50:29

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.

 6
Author: Vagelis Prokopiou, 2017-03-17 11:10:32

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).

 0
Author: Demian Berisford-Maynard, 2018-07-12 15:14:14