Como usar o git merge –squash?

Eu tenho um servidor Git remoto, aqui está o cenário que eu quero realizar:

Então, como eu poderia mesclar minha ramificação à ramificação remota para que eles recebam apenas uma confirmação para todos os meus check-ins (eu até mesmo desejo fornecer uma mensagem de confirmação para isso)?

   

Digamos que sua ramificação de correção de bug seja chamada de bugfix e você queira mesclá-la no master :

 git checkout master git merge --squash bugfix git commit 

Isso levará todos os commits da ramificação bugfix , esmagando-os em 1 commit e mesclando-os com sua branch master .


Explicação :

 git checkout master 

Muda para o seu branch master .

 git merge --squash bugfix 

Recebe todos os commits da ramificação bugfix e a mescla com sua ramificação atual.

 git commit 

Cria um único commit das alterações mescladas.

Omitir o parâmetro -m permite que você modifique uma mensagem de rascunho de rascunho contendo todas as mensagens de suas confirmações esmagadas antes de finalizar sua confirmação.

Você quer mesclar com a opção de squash. Isso é se você quiser fazer um ramo de cada vez.

 git merge --squash feature1 

Se você quiser mesclar todas as ramificações ao mesmo tempo que as únicas confirmações, primeiro rebaixe interativamente e reprima cada recurso, em seguida, mescle octopus:

 git checkout feature1 git rebase -i master 

Esmague em um commit e depois repita para os outros resources.

 git checkout master git merge feature1 feature2 feature3 ... 

Essa última mesclagem é uma “mesclagem de octopus” porque está mesclando vários ramos de uma só vez.

Espero que isto ajude

O que finalmente esclareceu isso para mim foi um comentário mostrando que:

 git checkout main git merge --squash feature 

é o equivalente de fazer:

 git checkout feature git diff main > feature.patch git checkout main patch -p1 < feature.patch git add . 

Quando eu quero mesclar uma ramificação de recurso com 105 (!!) commits e tê-los todos esmagados em um, eu não quero git rebase -i origin/master porque eu preciso resolver separadamente conflitos de mesclagem para cada um dos commits intermediários (ou pelo menos aqueles que não conseguem se entender). Usando o git merge --squash me obtém o resultado que quero, de um único commit para mesclar todo um branch de feature. E só preciso fazer no máximo uma resolução manual de conflitos.

Se você já tem git merge bugfix no main , você pode esmagar o seu merge commit em um com:

 git reset --soft HEAD^1 git commit 

Mesclar newFeature branch no master com um commit personalizado:

 git merge --squash newFeature && git commit -m 'Your custom commit message'; 

Se em vez disso, você faz

git merge --squash newFeature && git commit

você receberá uma mensagem de confirmação que includeá todas as newFeature ramificação newFeature , que você pode personalizar.

Para o Git

Crie um novo recurso

via Terminal / Shell:

 git checkout origin/feature/ git merge --squash origin/feature/ 

Isso não comete, permite que você revise primeiro.

Em seguida, confirme e finalize o recurso desta nova ramificação e exclua / ignore o antigo (o que você criou).